123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- # 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)
- if received_data != ('a' * bytes_to_receive_in_this_loop):
- 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()
|