| Index: Tools/Scripts/webkitpy/thirdparty/mod_pywebsocket/xhr_benchmark_handler.py
|
| diff --git a/Tools/Scripts/webkitpy/thirdparty/mod_pywebsocket/xhr_benchmark_handler.py b/Tools/Scripts/webkitpy/thirdparty/mod_pywebsocket/xhr_benchmark_handler.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..7d5d35f2bb42c76e454bdfb16e76a0bad60c410c
|
| --- /dev/null
|
| +++ b/Tools/Scripts/webkitpy/thirdparty/mod_pywebsocket/xhr_benchmark_handler.py
|
| @@ -0,0 +1,110 @@
|
| +# Copyright 2014 Google Inc. All rights reserved.
|
| +#
|
| +# Use of this source code is governed by a BSD-style
|
| +# license that can be found in the COPYING file or at
|
| +# https://developers.google.com/open-source/licenses/bsd
|
| +
|
| +
|
| +from mod_pywebsocket import util
|
| +
|
| +
|
| +class XHRBenchmarkHandler(object):
|
| + def __init__(self, headers, rfile, wfile):
|
| + self._logger = util.get_class_logger(self)
|
| +
|
| + self.headers = headers
|
| + self.rfile = rfile
|
| + self.wfile = wfile
|
| +
|
| + def do_send(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 do_receive(self):
|
| + content_length = int(self.headers.getheader('Content-Length'))
|
| + request_body = self.rfile.read(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()
|
|
|