| OLD | NEW |
| 1 #!/usr/bin/python2.4 | 1 #!/usr/bin/python2.4 |
| 2 # Copyright (c) 2006-2010 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2006-2010 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 server used for testing Chrome. | 6 """This is a simple HTTP 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 575 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 586 # request is subject to value of the request header being echoed. | 586 # request is subject to value of the request header being echoed. |
| 587 if len(header_name) > 0: | 587 if len(header_name) > 0: |
| 588 self.send_header('Vary', header_name) | 588 self.send_header('Vary', header_name) |
| 589 self.end_headers() | 589 self.end_headers() |
| 590 | 590 |
| 591 if len(header_name) > 0: | 591 if len(header_name) > 0: |
| 592 self.wfile.write(self.headers.getheader(header_name)) | 592 self.wfile.write(self.headers.getheader(header_name)) |
| 593 | 593 |
| 594 return True | 594 return True |
| 595 | 595 |
| 596 def ReadRequestBody(self): |
| 597 """This function reads the body of the current HTTP request, handling |
| 598 both plain and chunked transfer encoded requests.""" |
| 599 |
| 600 if self.headers.getheader('transfer-encoding') != 'chunked': |
| 601 length = int(self.headers.getheader('content-length')) |
| 602 return self.rfile.read(length) |
| 603 |
| 604 # Read the request body as chunks. |
| 605 body = "" |
| 606 while True: |
| 607 line = self.rfile.readline() |
| 608 length = int(line, 16) |
| 609 if length == 0: |
| 610 self.rfile.readline() |
| 611 break |
| 612 body += self.rfile.read(length) |
| 613 self.rfile.read(2) |
| 614 return body |
| 615 |
| 596 def EchoHandler(self): | 616 def EchoHandler(self): |
| 597 """This handler just echoes back the payload of the request, for testing | 617 """This handler just echoes back the payload of the request, for testing |
| 598 form submission.""" | 618 form submission.""" |
| 599 | 619 |
| 600 if not self._ShouldHandleRequest("/echo"): | 620 if not self._ShouldHandleRequest("/echo"): |
| 601 return False | 621 return False |
| 602 | 622 |
| 603 self.send_response(200) | 623 self.send_response(200) |
| 604 self.send_header('Content-type', 'text/html') | 624 self.send_header('Content-type', 'text/html') |
| 605 self.end_headers() | 625 self.end_headers() |
| 606 length = int(self.headers.getheader('content-length')) | 626 self.wfile.write(self.ReadRequestBody()) |
| 607 request = self.rfile.read(length) | |
| 608 self.wfile.write(request) | |
| 609 return True | 627 return True |
| 610 | 628 |
| 611 def EchoTitleHandler(self): | 629 def EchoTitleHandler(self): |
| 612 """This handler is like Echo, but sets the page title to the request.""" | 630 """This handler is like Echo, but sets the page title to the request.""" |
| 613 | 631 |
| 614 if not self._ShouldHandleRequest("/echotitle"): | 632 if not self._ShouldHandleRequest("/echotitle"): |
| 615 return False | 633 return False |
| 616 | 634 |
| 617 self.send_response(200) | 635 self.send_response(200) |
| 618 self.send_header('Content-type', 'text/html') | 636 self.send_header('Content-type', 'text/html') |
| 619 self.end_headers() | 637 self.end_headers() |
| 620 length = int(self.headers.getheader('content-length')) | 638 request = self.ReadRequestBody() |
| 621 request = self.rfile.read(length) | |
| 622 self.wfile.write('<html><head><title>') | 639 self.wfile.write('<html><head><title>') |
| 623 self.wfile.write(request) | 640 self.wfile.write(request) |
| 624 self.wfile.write('</title></head></html>') | 641 self.wfile.write('</title></head></html>') |
| 625 return True | 642 return True |
| 626 | 643 |
| 627 def EchoAllHandler(self): | 644 def EchoAllHandler(self): |
| 628 """This handler yields a (more) human-readable page listing information | 645 """This handler yields a (more) human-readable page listing information |
| 629 about the request header & contents.""" | 646 about the request header & contents.""" |
| 630 | 647 |
| 631 if not self._ShouldHandleRequest("/echoall"): | 648 if not self._ShouldHandleRequest("/echoall"): |
| 632 return False | 649 return False |
| 633 | 650 |
| 634 self.send_response(200) | 651 self.send_response(200) |
| 635 self.send_header('Content-type', 'text/html') | 652 self.send_header('Content-type', 'text/html') |
| 636 self.end_headers() | 653 self.end_headers() |
| 637 self.wfile.write('<html><head><style>' | 654 self.wfile.write('<html><head><style>' |
| 638 'pre { border: 1px solid black; margin: 5px; padding: 5px }' | 655 'pre { border: 1px solid black; margin: 5px; padding: 5px }' |
| 639 '</style></head><body>' | 656 '</style></head><body>' |
| 640 '<div style="float: right">' | 657 '<div style="float: right">' |
| 641 '<a href="/echo">back to referring page</a></div>' | 658 '<a href="/echo">back to referring page</a></div>' |
| 642 '<h1>Request Body:</h1><pre>') | 659 '<h1>Request Body:</h1><pre>') |
| 643 | 660 |
| 644 if self.command == 'POST' or self.command == 'PUT': | 661 if self.command == 'POST' or self.command == 'PUT': |
| 645 length = int(self.headers.getheader('content-length')) | 662 qs = self.ReadRequestBody() |
| 646 qs = self.rfile.read(length) | |
| 647 params = cgi.parse_qs(qs, keep_blank_values=1) | 663 params = cgi.parse_qs(qs, keep_blank_values=1) |
| 648 | 664 |
| 649 for param in params: | 665 for param in params: |
| 650 self.wfile.write('%s=%s\n' % (param, params[param][0])) | 666 self.wfile.write('%s=%s\n' % (param, params[param][0])) |
| 651 | 667 |
| 652 self.wfile.write('</pre>') | 668 self.wfile.write('</pre>') |
| 653 | 669 |
| 654 self.wfile.write('<h1>Request Headers:</h1><pre>%s</pre>' % self.headers) | 670 self.wfile.write('<h1>Request Headers:</h1><pre>%s</pre>' % self.headers) |
| 655 | 671 |
| 656 self.wfile.write('</body></html>') | 672 self.wfile.write('</body></html>') |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 738 def FileHandler(self): | 754 def FileHandler(self): |
| 739 """This handler sends the contents of the requested file. Wow, it's like | 755 """This handler sends the contents of the requested file. Wow, it's like |
| 740 a real webserver!""" | 756 a real webserver!""" |
| 741 | 757 |
| 742 prefix = self.server.file_root_url | 758 prefix = self.server.file_root_url |
| 743 if not self.path.startswith(prefix): | 759 if not self.path.startswith(prefix): |
| 744 return False | 760 return False |
| 745 | 761 |
| 746 # Consume a request body if present. | 762 # Consume a request body if present. |
| 747 if self.command == 'POST' or self.command == 'PUT' : | 763 if self.command == 'POST' or self.command == 'PUT' : |
| 748 self.rfile.read(int(self.headers.getheader('content-length'))) | 764 self.ReadRequestBody() |
| 749 | 765 |
| 750 _, _, url_path, _, query, _ = urlparse.urlparse(self.path) | 766 _, _, url_path, _, query, _ = urlparse.urlparse(self.path) |
| 751 sub_path = url_path[len(prefix):] | 767 sub_path = url_path[len(prefix):] |
| 752 entries = sub_path.split('/') | 768 entries = sub_path.split('/') |
| 753 file_path = os.path.join(self.server.data_dir, *entries) | 769 file_path = os.path.join(self.server.data_dir, *entries) |
| 754 if os.path.isdir(file_path): | 770 if os.path.isdir(file_path): |
| 755 file_path = os.path.join(file_path, 'index.html') | 771 file_path = os.path.join(file_path, 'index.html') |
| 756 | 772 |
| 757 if not os.path.isfile(file_path): | 773 if not os.path.isfile(file_path): |
| 758 print "File not found " + sub_path + " full path:" + file_path | 774 print "File not found " + sub_path + " full path:" + file_path |
| (...skipping 496 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1255 self.send_header("Content-Length", len(contents)) | 1271 self.send_header("Content-Length", len(contents)) |
| 1256 self.end_headers() | 1272 self.end_headers() |
| 1257 self.wfile.write(contents) | 1273 self.wfile.write(contents) |
| 1258 return True | 1274 return True |
| 1259 | 1275 |
| 1260 def DeviceManagementHandler(self): | 1276 def DeviceManagementHandler(self): |
| 1261 """Delegates to the device management service used for cloud policy.""" | 1277 """Delegates to the device management service used for cloud policy.""" |
| 1262 if not self._ShouldHandleRequest("/device_management"): | 1278 if not self._ShouldHandleRequest("/device_management"): |
| 1263 return False | 1279 return False |
| 1264 | 1280 |
| 1265 length = int(self.headers.getheader('content-length')) | 1281 raw_request = self.ReadRequestBody() |
| 1266 raw_request = self.rfile.read(length) | |
| 1267 | 1282 |
| 1268 if not self.server._device_management_handler: | 1283 if not self.server._device_management_handler: |
| 1269 import device_management | 1284 import device_management |
| 1270 policy_path = os.path.join(self.server.data_dir, 'device_management') | 1285 policy_path = os.path.join(self.server.data_dir, 'device_management') |
| 1271 self.server._device_management_handler = ( | 1286 self.server._device_management_handler = ( |
| 1272 device_management.TestServer(policy_path)) | 1287 device_management.TestServer(policy_path)) |
| 1273 | 1288 |
| 1274 http_response, raw_reply = ( | 1289 http_response, raw_reply = ( |
| 1275 self.server._device_management_handler.HandleRequest(self.path, | 1290 self.server._device_management_handler.HandleRequest(self.path, |
| 1276 self.headers, | 1291 self.headers, |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1317 def ChromiumSyncCommandHandler(self): | 1332 def ChromiumSyncCommandHandler(self): |
| 1318 """Handle a chromiumsync command arriving via http. | 1333 """Handle a chromiumsync command arriving via http. |
| 1319 | 1334 |
| 1320 This covers all sync protocol commands: authentication, getupdates, and | 1335 This covers all sync protocol commands: authentication, getupdates, and |
| 1321 commit. | 1336 commit. |
| 1322 """ | 1337 """ |
| 1323 test_name = "/chromiumsync/command" | 1338 test_name = "/chromiumsync/command" |
| 1324 if not self._ShouldHandleRequest(test_name): | 1339 if not self._ShouldHandleRequest(test_name): |
| 1325 return False | 1340 return False |
| 1326 | 1341 |
| 1327 length = int(self.headers.getheader('content-length')) | 1342 raw_request = self.ReadRequestBody() |
| 1328 raw_request = self.rfile.read(length) | |
| 1329 | 1343 |
| 1330 http_response, raw_reply = self.server.HandleCommand( | 1344 http_response, raw_reply = self.server.HandleCommand( |
| 1331 self.path, raw_request) | 1345 self.path, raw_request) |
| 1332 self.send_response(http_response) | 1346 self.send_response(http_response) |
| 1333 self.end_headers() | 1347 self.end_headers() |
| 1334 self.wfile.write(raw_reply) | 1348 self.wfile.write(raw_reply) |
| 1335 return True | 1349 return True |
| 1336 | 1350 |
| 1337 | 1351 |
| 1338 def MakeDataDir(): | 1352 def MakeDataDir(): |
| (...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1498 'option may appear multiple times, indicating ' | 1512 'option may appear multiple times, indicating ' |
| 1499 'multiple algorithms should be enabled.'); | 1513 'multiple algorithms should be enabled.'); |
| 1500 option_parser.add_option('', '--file-root-url', default='/files/', | 1514 option_parser.add_option('', '--file-root-url', default='/files/', |
| 1501 help='Specify a root URL for files served.') | 1515 help='Specify a root URL for files served.') |
| 1502 option_parser.add_option('', '--startup-pipe', type='int', | 1516 option_parser.add_option('', '--startup-pipe', type='int', |
| 1503 dest='startup_pipe', | 1517 dest='startup_pipe', |
| 1504 help='File handle of pipe to parent process') | 1518 help='File handle of pipe to parent process') |
| 1505 options, args = option_parser.parse_args() | 1519 options, args = option_parser.parse_args() |
| 1506 | 1520 |
| 1507 sys.exit(main(options, args)) | 1521 sys.exit(main(options, args)) |
| OLD | NEW |