Index: Tools/Scripts/webkitpy/thirdparty/mod_pywebsocket/standalone.py |
diff --git a/Tools/Scripts/webkitpy/thirdparty/mod_pywebsocket/standalone.py b/Tools/Scripts/webkitpy/thirdparty/mod_pywebsocket/standalone.py |
index d270bf09347dfed558762d7e5acb6c869c818621..2aaa50e16945de8671417a1ca366f5fc9fcf57f3 100755 |
--- a/Tools/Scripts/webkitpy/thirdparty/mod_pywebsocket/standalone.py |
+++ b/Tools/Scripts/webkitpy/thirdparty/mod_pywebsocket/standalone.py |
@@ -36,6 +36,7 @@ Use this file to launch pywebsocket without Apache HTTP Server. |
BASIC USAGE |
+=========== |
Go to the src directory and run |
@@ -61,10 +62,13 @@ For trouble shooting, adding "--log_level debug" might help you. |
TRY DEMO |
+======== |
-Go to the src directory and run |
+Go to the src directory and run standalone.py with -d option to set the |
+document root to the directory containing example HTMLs and handlers like this: |
- $ python standalone.py -d example |
+ $ cd src |
+ $ PYTHONPATH=. python mod_pywebsocket/standalone.py -d example |
to launch pywebsocket with the sample handler and html on port 80. Open |
http://localhost/console.html, click the connect button, type something into |
@@ -72,24 +76,48 @@ the text box next to the send button and click the send button. If everything |
is working, you'll see the message you typed echoed by the server. |
-SUPPORTING TLS |
+USING TLS |
+========= |
-To support TLS, run standalone.py with -t, -k, and -c options. |
+To run the standalone server with TLS support, run it with -t, -k, and -c |
+options. When TLS is enabled, the standalone server accepts only TLS connection. |
Note that when ssl module is used and the key/cert location is incorrect, |
TLS connection silently fails while pyOpenSSL fails on startup. |
+Example: |
+ |
+ $ PYTHONPATH=. python mod_pywebsocket/standalone.py \ |
+ -d example \ |
+ -p 10443 \ |
+ -t \ |
+ -c ../test/cert/cert.pem \ |
+ -k ../test/cert/key.pem \ |
+ |
+Note that when passing a relative path to -c and -k option, it will be resolved |
+using the document root directory as the base. |
+ |
-SUPPORTING CLIENT AUTHENTICATION |
+USING CLIENT AUTHENTICATION |
+=========================== |
-To support client authentication with TLS, run standalone.py with -t, -k, -c, |
-and --tls-client-auth, and --tls-client-ca options. |
+To run the standalone server with TLS client authentication support, run it with |
+--tls-client-auth and --tls-client-ca options in addition to ones required for |
+TLS support. |
-E.g., $./standalone.py -d ../example -p 10443 -t -c ../test/cert/cert.pem -k |
-../test/cert/key.pem --tls-client-auth --tls-client-ca=../test/cert/cacert.pem |
+Example: |
+ |
+ $ PYTHONPATH=. python mod_pywebsocket/standalone.py -d example -p 10443 -t \ |
+ -c ../test/cert/cert.pem -k ../test/cert/key.pem \ |
+ --tls-client-auth \ |
+ --tls-client-ca=../test/cert/cacert.pem |
+ |
+Note that when passing a relative path to --tls-client-ca option, it will be |
+resolved using the document root directory as the base. |
CONFIGURATION FILE |
+================== |
You can also write a configuration file and use it by specifying the path to |
the configuration file by --config option. Please write a configuration file |
@@ -113,12 +141,14 @@ configuration file. |
THREADING |
+========= |
This server is derived from SocketServer.ThreadingMixIn. Hence a thread is |
used for each request. |
SECURITY WARNING |
+================ |
This uses CGIHTTPServer and CGIHTTPServer is not secure. |
It may execute arbitrary Python code or external programs. It should not be |
@@ -149,6 +179,7 @@ from mod_pywebsocket import handshake |
from mod_pywebsocket import http_header_util |
from mod_pywebsocket import memorizingfile |
from mod_pywebsocket import util |
+from mod_pywebsocket.xhr_benchmark_handler import XHRBenchmarkHandler |
_DEFAULT_LOG_MAX_BYTES = 1024 * 256 |
@@ -662,99 +693,6 @@ class WebSocketRequestHandler(CGIHTTPServer.CGIHTTPRequestHandler): |
CGIHTTPServer.CGIHTTPRequestHandler.__init__( |
self, request, client_address, server) |
- def _xhr_send_benchmark_helper(self): |
- content_length = int(self.headers.getheader('Content-Length')) |
- |
- self._logger.debug('Requested to receive %s bytes', content_length) |
- |
- RECEIVE_BLOCK_SIZE = 1024 * 1024 |
- |
- bytes_to_receive = content_length |
- while bytes_to_receive > 0: |
- bytes_to_receive_in_this_loop = bytes_to_receive |
- if bytes_to_receive_in_this_loop > RECEIVE_BLOCK_SIZE: |
- bytes_to_receive_in_this_loop = RECEIVE_BLOCK_SIZE |
- received_data = self.rfile.read(bytes_to_receive_in_this_loop) |
- for c in received_data: |
- if c != 'a': |
- self._logger.debug('Request body verification failed') |
- return |
- bytes_to_receive -= len(received_data) |
- if bytes_to_receive < 0: |
- self._logger.debug('Received %d more bytes than expected' % |
- (-bytes_to_receive)) |
- return |
- |
- # Return the number of received bytes back to the client. |
- response_body = '%d' % content_length |
- self.wfile.write( |
- 'HTTP/1.1 200 OK\r\n' |
- 'Content-Type: text/html\r\n' |
- 'Content-Length: %d\r\n' |
- '\r\n%s' % (len(response_body), response_body)) |
- self.wfile.flush() |
- |
- def _xhr_receive_benchmark_helper(self): |
- content_length = self.headers.getheader('Content-Length') |
- request_body = self.rfile.read(int(content_length)) |
- |
- request_array = request_body.split(' ') |
- if len(request_array) < 2: |
- self._logger.debug('Malformed request body: %r', request_body) |
- return |
- |
- # Parse the size parameter. |
- bytes_to_send = request_array[0] |
- try: |
- bytes_to_send = int(bytes_to_send) |
- except ValueError, e: |
- self._logger.debug('Malformed size parameter: %r', bytes_to_send) |
- return |
- self._logger.debug('Requested to send %s bytes', bytes_to_send) |
- |
- # Parse the transfer encoding parameter. |
- chunked_mode = False |
- mode_parameter = request_array[1] |
- if mode_parameter == 'chunked': |
- self._logger.debug('Requested chunked transfer encoding') |
- chunked_mode = True |
- elif mode_parameter != 'none': |
- self._logger.debug('Invalid mode parameter: %r', mode_parameter) |
- return |
- |
- # Write a header |
- response_header = ( |
- 'HTTP/1.1 200 OK\r\n' |
- 'Content-Type: application/octet-stream\r\n') |
- if chunked_mode: |
- response_header += 'Transfer-Encoding: chunked\r\n\r\n' |
- else: |
- response_header += ( |
- 'Content-Length: %d\r\n\r\n' % bytes_to_send) |
- self.wfile.write(response_header) |
- self.wfile.flush() |
- |
- # Write a body |
- SEND_BLOCK_SIZE = 1024 * 1024 |
- |
- while bytes_to_send > 0: |
- bytes_to_send_in_this_loop = bytes_to_send |
- if bytes_to_send_in_this_loop > SEND_BLOCK_SIZE: |
- bytes_to_send_in_this_loop = SEND_BLOCK_SIZE |
- |
- if chunked_mode: |
- self.wfile.write('%x\r\n' % bytes_to_send_in_this_loop) |
- self.wfile.write('a' * bytes_to_send_in_this_loop) |
- if chunked_mode: |
- self.wfile.write('\r\n') |
- self.wfile.flush() |
- |
- bytes_to_send -= bytes_to_send_in_this_loop |
- |
- if chunked_mode: |
- self.wfile.write('0\r\n\r\n') |
- self.wfile.flush() |
- |
def parse_request(self): |
"""Override BaseHTTPServer.BaseHTTPRequestHandler.parse_request. |
@@ -791,10 +729,14 @@ class WebSocketRequestHandler(CGIHTTPServer.CGIHTTPRequestHandler): |
# Special paths for XMLHttpRequest benchmark |
xhr_benchmark_helper_prefix = '/073be001e10950692ccbf3a2ad21c245' |
if resource == (xhr_benchmark_helper_prefix + '_send'): |
- self._xhr_send_benchmark_helper() |
+ xhr_benchmark_handler = XHRBenchmarkHandler( |
+ self.headers, self.rfile, self.wfile) |
+ xhr_benchmark_handler.do_send() |
return False |
if resource == (xhr_benchmark_helper_prefix + '_receive'): |
- self._xhr_receive_benchmark_helper() |
+ xhr_benchmark_handler = XHRBenchmarkHandler( |
+ self.headers, self.rfile, self.wfile) |
+ xhr_benchmark_handler.do_receive() |
return False |
if resource is None: |