Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(256)

Unified Diff: net/tools/testserver/testserver.py

Issue 1203983004: Stop using SpawnedTestServer in DownloadContentTest.* (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: MSVC doesn't want to make default move constructors either. Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/test/embedded_test_server/default_handlers.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/tools/testserver/testserver.py
diff --git a/net/tools/testserver/testserver.py b/net/tools/testserver/testserver.py
index 10ade37b9ef9395e99b9b39321015ea43677657e..15317657d08b65cb102aaa2897340b09aa5a15b5 100755
--- a/net/tools/testserver/testserver.py
+++ b/net/tools/testserver/testserver.py
@@ -343,7 +343,6 @@ class TestPageHandler(testserver_base.BasePageHandler):
self.GetClientCert,
self.ClientCipherListHandler,
self.CloseSocketHandler,
- self.RangeResetHandler,
self.DefaultResponseHandler]
post_handlers = [
self.EchoTitleHandler,
@@ -1560,153 +1559,6 @@ class TestPageHandler(testserver_base.BasePageHandler):
self.wfile.close()
return True
- def RangeResetHandler(self):
- """Send data broken up by connection resets every N (default 4K) bytes.
- Support range requests. If the data requested doesn't straddle a reset
- boundary, it will all be sent. Used for testing resuming downloads."""
-
- def DataForRange(start, end):
- """Data to be provided for a particular range of bytes."""
- # Offset and scale to avoid too obvious (and hence potentially
- # collidable) data.
- return ''.join([chr(y % 256)
- for y in range(start * 2 + 15, end * 2 + 15, 2)])
-
- if not self._ShouldHandleRequest('/rangereset'):
- return False
-
- # HTTP/1.1 is required for ETag and range support.
- self.protocol_version = 'HTTP/1.1'
- _, _, url_path, _, query, _ = urlparse.urlparse(self.path)
-
- # Defaults
- size = 8000
- # Note that the rst is sent just before sending the rst_boundary byte.
- rst_boundary = 4000
- respond_to_range = True
- hold_for_signal = False
- rst_limit = -1
- token = 'DEFAULT'
- fail_precondition = 0
- send_verifiers = True
-
- # Parse the query
- qdict = urlparse.parse_qs(query, True)
- if 'size' in qdict:
- size = int(qdict['size'][0])
- if 'rst_boundary' in qdict:
- rst_boundary = int(qdict['rst_boundary'][0])
- if 'token' in qdict:
- # Identifying token for stateful tests.
- token = qdict['token'][0]
- if 'rst_limit' in qdict:
- # Max number of rsts for a given token.
- rst_limit = int(qdict['rst_limit'][0])
- if 'bounce_range' in qdict:
- respond_to_range = False
- if 'hold' in qdict:
- # Note that hold_for_signal will not work with null range requests;
- # see TODO below.
- hold_for_signal = True
- if 'no_verifiers' in qdict:
- send_verifiers = False
- if 'fail_precondition' in qdict:
- fail_precondition = int(qdict['fail_precondition'][0])
-
- # Record already set information, or set it.
- rst_limit = TestPageHandler.rst_limits.setdefault(token, rst_limit)
- if rst_limit != 0:
- TestPageHandler.rst_limits[token] -= 1
- fail_precondition = TestPageHandler.fail_precondition.setdefault(
- token, fail_precondition)
- if fail_precondition != 0:
- TestPageHandler.fail_precondition[token] -= 1
-
- first_byte = 0
- last_byte = size - 1
-
- # Does that define what we want to return, or do we need to apply
- # a range?
- range_response = False
- range_header = self.headers.getheader('range')
-
- if fail_precondition and self.headers.getheader('If-Range'):
- # Failing a precondition for an If-Range just means that we are going to
- # return the entire entity ignoring the Range header.
- respond_to_range = False
-
- if range_header and respond_to_range:
- mo = re.match("bytes=(\d*)-(\d*)", range_header)
- if mo.group(1):
- first_byte = int(mo.group(1))
- if mo.group(2):
- last_byte = int(mo.group(2))
- if last_byte > size - 1:
- last_byte = size - 1
- range_response = True
- if last_byte < first_byte:
- return False
-
- if range_response:
- self.send_response(206)
- self.send_header('Content-Range',
- 'bytes %d-%d/%d' % (first_byte, last_byte, size))
- else:
- self.send_response(200)
- self.send_header('Content-Type', 'application/octet-stream')
- self.send_header('Content-Length', last_byte - first_byte + 1)
- if send_verifiers:
- # If fail_precondition is non-zero, then the ETag for each request will be
- # different.
- etag = "%s%d" % (token, fail_precondition)
- self.send_header('ETag', etag)
- self.send_header('Last-Modified', 'Tue, 19 Feb 2013 14:32 EST')
- self.end_headers()
-
- if hold_for_signal:
- # TODO(rdsmith/phajdan.jr): http://crbug.com/169519: Without writing
- # a single byte, the self.server.handle_request() below hangs
- # without processing new incoming requests.
- self.wfile.write(DataForRange(first_byte, first_byte + 1))
- first_byte = first_byte + 1
- # handle requests until one of them clears this flag.
- self.server.wait_for_download = True
- while self.server.wait_for_download:
- self.server.handle_request()
-
- possible_rst = ((first_byte / rst_boundary) + 1) * rst_boundary
- if possible_rst >= last_byte or rst_limit == 0:
- # No RST has been requested in this range, so we don't need to
- # do anything fancy; just write the data and let the python
- # infrastructure close the connection.
- self.wfile.write(DataForRange(first_byte, last_byte + 1))
- self.wfile.flush()
- return True
-
- # We're resetting the connection part way in; go to the RST
- # boundary and then send an RST.
- # Because socket semantics do not guarantee that all the data will be
- # sent when using the linger semantics to hard close a socket,
- # we send the data and then wait for our peer to release us
- # before sending the reset.
- data = DataForRange(first_byte, possible_rst)
- self.wfile.write(data)
- self.wfile.flush()
- self.server.wait_for_download = True
- while self.server.wait_for_download:
- self.server.handle_request()
- l_onoff = 1 # Linger is active.
- l_linger = 0 # Seconds to linger for.
- self.connection.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER,
- struct.pack('ii', l_onoff, l_linger))
-
- # Close all duplicates of the underlying socket to force the RST.
- self.wfile.close()
- self.rfile.close()
- self.connection.close()
-
- return True
-
def DefaultResponseHandler(self):
"""This is the catch-all response handler for requests that aren't handled
by one of the special handlers above.
« no previous file with comments | « net/test/embedded_test_server/default_handlers.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698