Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 #!/usr/bin/python2.4 | 1 #!/usr/bin/python2.4 |
| 2 # Copyright (c) 2011 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2011 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 12 matching lines...) Expand all Loading... | |
| 23 import re | 23 import re |
| 24 import select | 24 import select |
| 25 import simplejson | 25 import simplejson |
| 26 import SocketServer | 26 import SocketServer |
| 27 import socket | 27 import socket |
| 28 import sys | 28 import sys |
| 29 import struct | 29 import struct |
| 30 import time | 30 import time |
| 31 import urlparse | 31 import urlparse |
| 32 import warnings | 32 import warnings |
| 33 import zlib | |
| 33 | 34 |
| 34 # Ignore deprecation warnings, they make our output more cluttered. | 35 # Ignore deprecation warnings, they make our output more cluttered. |
| 35 warnings.filterwarnings("ignore", category=DeprecationWarning) | 36 warnings.filterwarnings("ignore", category=DeprecationWarning) |
| 36 | 37 |
| 37 import pyftpdlib.ftpserver | 38 import pyftpdlib.ftpserver |
| 38 import tlslite | 39 import tlslite |
| 39 import tlslite.api | 40 import tlslite.api |
| 40 | 41 |
| 41 try: | 42 try: |
| 42 import hashlib | 43 import hashlib |
| (...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 273 self.CacheMustRevalidateHandler, | 274 self.CacheMustRevalidateHandler, |
| 274 self.CacheMustRevalidateMaxAgeHandler, | 275 self.CacheMustRevalidateMaxAgeHandler, |
| 275 self.CacheNoStoreHandler, | 276 self.CacheNoStoreHandler, |
| 276 self.CacheNoStoreMaxAgeHandler, | 277 self.CacheNoStoreMaxAgeHandler, |
| 277 self.CacheNoTransformHandler, | 278 self.CacheNoTransformHandler, |
| 278 self.DownloadHandler, | 279 self.DownloadHandler, |
| 279 self.DownloadFinishHandler, | 280 self.DownloadFinishHandler, |
| 280 self.EchoHeader, | 281 self.EchoHeader, |
| 281 self.EchoHeaderCache, | 282 self.EchoHeaderCache, |
| 282 self.EchoAllHandler, | 283 self.EchoAllHandler, |
| 284 self.ZipFileHandler, | |
| 283 self.FileHandler, | 285 self.FileHandler, |
| 284 self.SetCookieHandler, | 286 self.SetCookieHandler, |
| 285 self.AuthBasicHandler, | 287 self.AuthBasicHandler, |
| 286 self.AuthDigestHandler, | 288 self.AuthDigestHandler, |
| 287 self.SlowServerHandler, | 289 self.SlowServerHandler, |
| 288 self.ContentTypeHandler, | 290 self.ContentTypeHandler, |
| 289 self.NoContentHandler, | 291 self.NoContentHandler, |
| 290 self.ServerRedirectHandler, | 292 self.ServerRedirectHandler, |
| 291 self.ClientRedirectHandler, | 293 self.ClientRedirectHandler, |
| 292 self.MultipartHandler, | 294 self.MultipartHandler, |
| (...skipping 446 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 739 if len(replace_text_args) != 2: | 741 if len(replace_text_args) != 2: |
| 740 raise ValueError( | 742 raise ValueError( |
| 741 'replace_text must be of form old_text:new_text. Actual value: %s' % | 743 'replace_text must be of form old_text:new_text. Actual value: %s' % |
| 742 replace_text_value) | 744 replace_text_value) |
| 743 old_text_b64, new_text_b64 = replace_text_args | 745 old_text_b64, new_text_b64 = replace_text_args |
| 744 old_text = base64.urlsafe_b64decode(old_text_b64) | 746 old_text = base64.urlsafe_b64decode(old_text_b64) |
| 745 new_text = base64.urlsafe_b64decode(new_text_b64) | 747 new_text = base64.urlsafe_b64decode(new_text_b64) |
| 746 data = data.replace(old_text, new_text) | 748 data = data.replace(old_text, new_text) |
| 747 return data | 749 return data |
| 748 | 750 |
| 751 def ZipFileHandler(self): | |
| 752 """This handler sends the contents of the requested file in compressed form. | |
| 753 Can pass in a parameter that specifies that the content length be | |
| 754 C - the compressed size (OK), | |
| 755 U - the uncompressed size (Non-standard, but handled), | |
| 756 S - less than compressed (OK because we keep going), | |
| 757 M - larger than compressed but less than uncompressed (an error), | |
| 758 L - larger than uncompressed (an error) | |
| 759 Example: downloads/Picture_1.doc?C | |
| 760 """ | |
| 761 | |
| 762 prefix = self.server.file_root_url | |
| 763 if not self.path.startswith(prefix): | |
| 764 return False | |
| 765 | |
| 766 # Consume a request body if present. | |
| 767 if self.command == 'POST' or self.command == 'PUT' : | |
| 768 self.ReadRequestBody() | |
| 769 | |
| 770 _, _, url_path, _, query, _ = urlparse.urlparse(self.path) | |
| 771 | |
| 772 if not query in ('C', 'U', 'S', 'M', 'L'): | |
| 773 return False | |
| 774 | |
| 775 sub_path = url_path[len(prefix):] | |
| 776 entries = sub_path.split('/') | |
| 777 file_path = os.path.join(self.server.data_dir, *entries) | |
| 778 if os.path.isdir(file_path): | |
| 779 file_path = os.path.join(file_path, 'index.html') | |
| 780 | |
| 781 if not os.path.isfile(file_path): | |
| 782 print "File not found " + sub_path + " full path:" + file_path | |
| 783 self.send_error(404) | |
| 784 return True | |
| 785 | |
| 786 f = open(file_path, "rb") | |
| 787 data = f.read() | |
| 788 uncompressed_len = len(data) | |
| 789 f.close() | |
| 790 | |
| 791 # Compress the data. | |
| 792 data = zlib.compress(data) | |
| 793 compressed_len = len(data) | |
| 794 | |
| 795 content_length = compressed_len | |
| 796 if query == 'U': | |
| 797 content_length = uncompressed_len | |
| 798 elif query == 'S': | |
| 799 content_length = compressed_len / 2 | |
| 800 elif query == 'M': | |
| 801 content_length = (compressed_len + uncompressed_len) / 2 | |
| 802 elif query == 'L': | |
| 803 content_length = compressed_len + uncompressed_len | |
| 804 | |
| 805 self.send_response(200) | |
| 806 # self.send_header('Content-type', 'gzip') | |
|
ahendrickson
2011/05/22 06:43:34
Removing these commented-out lines . . .
| |
| 807 ## self.send_header('Content-encoding', 'gzip') | |
| 808 self.send_header('Content-type', 'application/msword') | |
| 809 self.send_header('Content-encoding', 'deflate') | |
| 810 self.send_header('Connection', 'close') | |
| 811 self.send_header('Content-Length', content_length) | |
| 812 self.send_header('ETag', '\'' + file_path + '\'') | |
| 813 self.end_headers() | |
| 814 | |
| 815 self.wfile.write(data) | |
| 816 | |
| 817 return True | |
| 818 | |
| 749 def FileHandler(self): | 819 def FileHandler(self): |
| 750 """This handler sends the contents of the requested file. Wow, it's like | 820 """This handler sends the contents of the requested file. Wow, it's like |
| 751 a real webserver!""" | 821 a real webserver!""" |
| 752 | 822 |
| 753 prefix = self.server.file_root_url | 823 prefix = self.server.file_root_url |
| 754 if not self.path.startswith(prefix): | 824 if not self.path.startswith(prefix): |
| 755 return False | 825 return False |
| 756 | 826 |
| 757 # Consume a request body if present. | 827 # Consume a request body if present. |
| 758 if self.command == 'POST' or self.command == 'PUT' : | 828 if self.command == 'POST' or self.command == 'PUT' : |
| (...skipping 736 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1495 'random key if none is specified on the command ' | 1565 'random key if none is specified on the command ' |
| 1496 'line.') | 1566 'line.') |
| 1497 option_parser.add_option('', '--policy-user', default='user@example.com', | 1567 option_parser.add_option('', '--policy-user', default='user@example.com', |
| 1498 dest='policy_user', | 1568 dest='policy_user', |
| 1499 help='Specify the user name the server should ' | 1569 help='Specify the user name the server should ' |
| 1500 'report back to the client as the user owning the ' | 1570 'report back to the client as the user owning the ' |
| 1501 'token used for making the policy request.') | 1571 'token used for making the policy request.') |
| 1502 options, args = option_parser.parse_args() | 1572 options, args = option_parser.parse_args() |
| 1503 | 1573 |
| 1504 sys.exit(main(options, args)) | 1574 sys.exit(main(options, args)) |
| OLD | NEW |