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

Side by Side Diff: net/tools/testserver/testserver.py

Issue 9302024: Add client for background testing of HTTP pipelining. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Fix memory leak in unit test Created 8 years, 10 months 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 unified diff | Download patch
« no previous file with comments | « net/base/net_error_list.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 5
6 """This is a simple HTTP/FTP/SYNC/TCP/UDP/ server used for testing Chrome. 6 """This is a simple HTTP/FTP/SYNC/TCP/UDP/ server used for testing Chrome.
7 7
8 It supports several test URLs, as specified by the handlers in TestPageHandler. 8 It supports several test URLs, as specified by the handlers in TestPageHandler.
9 By default, it listens on an ephemeral port and sends the port number back to 9 By default, it listens on an ephemeral port and sends the port number back to
10 the originating process over a pipe. The originating process can specify an 10 the originating process over a pipe. The originating process can specify an
(...skipping 360 matching lines...) Expand 10 before | Expand all | Expand 10 after
371 self.AuthDigestHandler, 371 self.AuthDigestHandler,
372 self.SlowServerHandler, 372 self.SlowServerHandler,
373 self.ChunkedServerHandler, 373 self.ChunkedServerHandler,
374 self.ContentTypeHandler, 374 self.ContentTypeHandler,
375 self.NoContentHandler, 375 self.NoContentHandler,
376 self.ServerRedirectHandler, 376 self.ServerRedirectHandler,
377 self.ClientRedirectHandler, 377 self.ClientRedirectHandler,
378 self.MultipartHandler, 378 self.MultipartHandler,
379 self.MultipartSlowHandler, 379 self.MultipartSlowHandler,
380 self.GetSSLSessionCacheHandler, 380 self.GetSSLSessionCacheHandler,
381 self.CloseSocketHandler,
381 self.DefaultResponseHandler] 382 self.DefaultResponseHandler]
382 post_handlers = [ 383 post_handlers = [
383 self.EchoTitleHandler, 384 self.EchoTitleHandler,
384 self.EchoHandler, 385 self.EchoHandler,
385 self.DeviceManagementHandler, 386 self.DeviceManagementHandler,
386 self.PostOnlyFileHandler] + get_handlers 387 self.PostOnlyFileHandler] + get_handlers
387 put_handlers = [ 388 put_handlers = [
388 self.EchoTitleHandler, 389 self.EchoTitleHandler,
389 self.EchoHandler] + get_handlers 390 self.EchoHandler] + get_handlers
390 head_handlers = [ 391 head_handlers = [
(...skipping 524 matching lines...) Expand 10 before | Expand all | Expand 10 after
915 916
916 def PostOnlyFileHandler(self): 917 def PostOnlyFileHandler(self):
917 """This handler sends the contents of the requested file on a POST.""" 918 """This handler sends the contents of the requested file on a POST."""
918 prefix = urlparse.urljoin(self.server.file_root_url, 'post/') 919 prefix = urlparse.urljoin(self.server.file_root_url, 'post/')
919 if not self.path.startswith(prefix): 920 if not self.path.startswith(prefix):
920 return False 921 return False
921 self.ReadRequestBody() 922 self.ReadRequestBody()
922 return self._FileHandlerHelper(prefix) 923 return self._FileHandlerHelper(prefix)
923 924
924 def _FileHandlerHelper(self, prefix): 925 def _FileHandlerHelper(self, prefix):
926 old_protocol_version = self.protocol_version
925 _, _, url_path, _, query, _ = urlparse.urlparse(self.path) 927 _, _, url_path, _, query, _ = urlparse.urlparse(self.path)
926 sub_path = url_path[len(prefix):] 928 sub_path = url_path[len(prefix):]
927 entries = sub_path.split('/') 929 entries = sub_path.split('/')
928 file_path = os.path.join(self.server.data_dir, *entries) 930 file_path = os.path.join(self.server.data_dir, *entries)
929 if os.path.isdir(file_path): 931 if os.path.isdir(file_path):
930 file_path = os.path.join(file_path, 'index.html') 932 file_path = os.path.join(file_path, 'index.html')
931 933
932 if not os.path.isfile(file_path): 934 if not os.path.isfile(file_path):
933 print "File not found " + sub_path + " full path:" + file_path 935 print "File not found " + sub_path + " full path:" + file_path
934 self.send_error(404) 936 self.send_error(404)
935 return True 937 return True
936 938
937 f = open(file_path, "rb") 939 f = open(file_path, "rb")
938 data = f.read() 940 data = f.read()
939 f.close() 941 f.close()
940 942
941 data = self._ReplaceFileData(data, query) 943 data = self._ReplaceFileData(data, query)
942 944
943 # If file.mock-http-headers exists, it contains the headers we 945 # If file.mock-http-headers exists, it contains the headers we
944 # should send. Read them in and parse them. 946 # should send. Read them in and parse them.
945 headers_path = file_path + '.mock-http-headers' 947 headers_path = file_path + '.mock-http-headers'
946 if os.path.isfile(headers_path): 948 if os.path.isfile(headers_path):
947 f = open(headers_path, "r") 949 f = open(headers_path, "r")
948 950
949 # "HTTP/1.1 200 OK" 951 # "HTTP/1.1 200 OK"
950 response = f.readline() 952 response = f.readline()
951 status_code = re.findall('HTTP/\d+.\d+ (\d+)', response)[0] 953 http_major, http_minor, status_code = re.findall(
954 'HTTP/(\d+).(\d+) (\d+)', response)[0]
955 self.protocol_version = "HTTP/%s.%s" % (http_major, http_minor)
952 self.send_response(int(status_code)) 956 self.send_response(int(status_code))
953 957
954 for line in f: 958 for line in f:
955 header_values = re.findall('(\S+):\s*(.*)', line) 959 header_values = re.findall('(\S+):\s*(.*)', line)
956 if len(header_values) > 0: 960 if len(header_values) > 0:
957 # "name: value" 961 # "name: value"
958 name, value = header_values[0] 962 name, value = header_values[0]
959 self.send_header(name, value) 963 self.send_header(name, value)
960 f.close() 964 f.close()
961 else: 965 else:
(...skipping 21 matching lines...) Expand all
983 987
984 self.send_header('Content-Type', self.GetMIMETypeFromName(file_path)) 988 self.send_header('Content-Type', self.GetMIMETypeFromName(file_path))
985 self.send_header('Accept-Ranges', 'bytes') 989 self.send_header('Accept-Ranges', 'bytes')
986 self.send_header('Content-Length', len(data)) 990 self.send_header('Content-Length', len(data))
987 self.send_header('ETag', '\'' + file_path + '\'') 991 self.send_header('ETag', '\'' + file_path + '\'')
988 self.end_headers() 992 self.end_headers()
989 993
990 if (self.command != 'HEAD'): 994 if (self.command != 'HEAD'):
991 self.wfile.write(data) 995 self.wfile.write(data)
992 996
997 self.protocol_version = old_protocol_version
993 return True 998 return True
994 999
995 def SetCookieHandler(self): 1000 def SetCookieHandler(self):
996 """This handler just sets a cookie, for testing cookie handling.""" 1001 """This handler just sets a cookie, for testing cookie handling."""
997 1002
998 if not self._ShouldHandleRequest("/set-cookie"): 1003 if not self._ShouldHandleRequest("/set-cookie"):
999 return False 1004 return False
1000 1005
1001 query_char = self.path.find('?') 1006 query_char = self.path.find('?')
1002 if query_char != -1: 1007 if query_char != -1:
(...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after
1420 self.send_header('Content-Type', 'text/plain') 1425 self.send_header('Content-Type', 'text/plain')
1421 self.end_headers() 1426 self.end_headers()
1422 try: 1427 try:
1423 for (action, sessionID) in self.server.session_cache.log: 1428 for (action, sessionID) in self.server.session_cache.log:
1424 self.wfile.write('%s\t%s\n' % (action, sessionID.encode('hex'))) 1429 self.wfile.write('%s\t%s\n' % (action, sessionID.encode('hex')))
1425 except AttributeError, e: 1430 except AttributeError, e:
1426 self.wfile.write('Pass --https-record-resume in order to use' + 1431 self.wfile.write('Pass --https-record-resume in order to use' +
1427 ' this request') 1432 ' this request')
1428 return True 1433 return True
1429 1434
1435 def CloseSocketHandler(self):
1436 """Closes the socket without sending anything."""
1437
1438 if not self._ShouldHandleRequest('/close-socket'):
1439 return False
1440
1441 self.wfile.close()
1442 return True
1443
1430 def DefaultResponseHandler(self): 1444 def DefaultResponseHandler(self):
1431 """This is the catch-all response handler for requests that aren't handled 1445 """This is the catch-all response handler for requests that aren't handled
1432 by one of the special handlers above. 1446 by one of the special handlers above.
1433 Note that we specify the content-length as without it the https connection 1447 Note that we specify the content-length as without it the https connection
1434 is not closed properly (and the browser keeps expecting data).""" 1448 is not closed properly (and the browser keeps expecting data)."""
1435 1449
1436 contents = "Default response given for path: " + self.path 1450 contents = "Default response given for path: " + self.path
1437 self.send_response(200) 1451 self.send_response(200)
1438 self.send_header('Content-Type', 'text/html') 1452 self.send_header('Content-Type', 'text/html')
1439 self.send_header('Content-Length', len(contents)) 1453 self.send_header('Content-Length', len(contents))
(...skipping 565 matching lines...) Expand 10 before | Expand all | Expand 10 after
2005 'random key if none is specified on the command ' 2019 'random key if none is specified on the command '
2006 'line.') 2020 'line.')
2007 option_parser.add_option('', '--policy-user', default='user@example.com', 2021 option_parser.add_option('', '--policy-user', default='user@example.com',
2008 dest='policy_user', 2022 dest='policy_user',
2009 help='Specify the user name the server should ' 2023 help='Specify the user name the server should '
2010 'report back to the client as the user owning the ' 2024 'report back to the client as the user owning the '
2011 'token used for making the policy request.') 2025 'token used for making the policy request.')
2012 options, args = option_parser.parse_args() 2026 options, args = option_parser.parse_args()
2013 2027
2014 sys.exit(main(options, args)) 2028 sys.exit(main(options, args))
OLDNEW
« no previous file with comments | « net/base/net_error_list.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698