| OLD | NEW |
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright 2013 The Chromium Authors. All rights reserved. | 2 # Copyright 2013 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/TCP/UDP/BASIC_AUTH_PROXY/WEBSOCKET server used for | 6 """This is a simple HTTP/FTP/TCP/UDP/BASIC_AUTH_PROXY/WEBSOCKET server used for |
| 7 testing Chrome. | 7 testing Chrome. |
| 8 | 8 |
| 9 It supports several test URLs, as specified by the handlers in TestPageHandler. | 9 It supports several test URLs, as specified by the handlers in TestPageHandler. |
| 10 By default, it listens on an ephemeral port and sends the port number back to | 10 By default, it listens on an ephemeral port and sends the port number back to |
| (...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 265 self.MultipartHandler, | 265 self.MultipartHandler, |
| 266 self.MultipartSlowHandler, | 266 self.MultipartSlowHandler, |
| 267 self.GetSSLSessionCacheHandler, | 267 self.GetSSLSessionCacheHandler, |
| 268 self.SSLManySmallRecords, | 268 self.SSLManySmallRecords, |
| 269 self.CloseSocketHandler, | 269 self.CloseSocketHandler, |
| 270 self.RangeResetHandler, | 270 self.RangeResetHandler, |
| 271 self.DefaultResponseHandler] | 271 self.DefaultResponseHandler] |
| 272 post_handlers = [ | 272 post_handlers = [ |
| 273 self.EchoTitleHandler, | 273 self.EchoTitleHandler, |
| 274 self.EchoHandler, | 274 self.EchoHandler, |
| 275 self.DeviceManagementHandler, | |
| 276 self.PostOnlyFileHandler] + get_handlers | 275 self.PostOnlyFileHandler] + get_handlers |
| 277 put_handlers = [ | 276 put_handlers = [ |
| 278 self.EchoTitleHandler, | 277 self.EchoTitleHandler, |
| 279 self.EchoHandler] + get_handlers | 278 self.EchoHandler] + get_handlers |
| 280 head_handlers = [ | 279 head_handlers = [ |
| 281 self.FileHandler, | 280 self.FileHandler, |
| 282 self.DefaultResponseHandler] | 281 self.DefaultResponseHandler] |
| 283 | 282 |
| 284 self._mime_types = { | 283 self._mime_types = { |
| 285 'crx' : 'application/x-chrome-extension', | 284 'crx' : 'application/x-chrome-extension', |
| (...skipping 1308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1594 with 400 to CONNECT requests.""" | 1593 with 400 to CONNECT requests.""" |
| 1595 | 1594 |
| 1596 contents = "Your client has issued a malformed or illegal request." | 1595 contents = "Your client has issued a malformed or illegal request." |
| 1597 self.send_response(400) # bad request | 1596 self.send_response(400) # bad request |
| 1598 self.send_header('Content-Type', 'text/html') | 1597 self.send_header('Content-Type', 'text/html') |
| 1599 self.send_header('Content-Length', len(contents)) | 1598 self.send_header('Content-Length', len(contents)) |
| 1600 self.end_headers() | 1599 self.end_headers() |
| 1601 self.wfile.write(contents) | 1600 self.wfile.write(contents) |
| 1602 return True | 1601 return True |
| 1603 | 1602 |
| 1604 def DeviceManagementHandler(self): | |
| 1605 """Delegates to the device management service used for cloud policy.""" | |
| 1606 | |
| 1607 if not self._ShouldHandleRequest("/device_management"): | |
| 1608 return False | |
| 1609 | |
| 1610 raw_request = self.ReadRequestBody() | |
| 1611 | |
| 1612 if not self.server._device_management_handler: | |
| 1613 import device_management | |
| 1614 policy_path = os.path.join(self.server.data_dir, 'device_management') | |
| 1615 self.server._device_management_handler = ( | |
| 1616 device_management.TestServer(policy_path, self.server.policy_keys)) | |
| 1617 | |
| 1618 http_response, raw_reply = ( | |
| 1619 self.server._device_management_handler.HandleRequest(self.path, | |
| 1620 self.headers, | |
| 1621 raw_request)) | |
| 1622 self.send_response(http_response) | |
| 1623 if (http_response == 200): | |
| 1624 self.send_header('Content-Type', 'application/x-protobuffer') | |
| 1625 self.end_headers() | |
| 1626 self.wfile.write(raw_reply) | |
| 1627 return True | |
| 1628 | |
| 1629 # called by the redirect handling function when there is no parameter | 1603 # called by the redirect handling function when there is no parameter |
| 1630 def sendRedirectHelp(self, redirect_name): | 1604 def sendRedirectHelp(self, redirect_name): |
| 1631 self.send_response(200) | 1605 self.send_response(200) |
| 1632 self.send_header('Content-Type', 'text/html') | 1606 self.send_header('Content-Type', 'text/html') |
| 1633 self.end_headers() | 1607 self.end_headers() |
| 1634 self.wfile.write('<html><body><h1>Error: no redirect destination</h1>') | 1608 self.wfile.write('<html><body><h1>Error: no redirect destination</h1>') |
| 1635 self.wfile.write('Use <pre>%s?http://dest...</pre>' % redirect_name) | 1609 self.wfile.write('Use <pre>%s?http://dest...</pre>' % redirect_name) |
| 1636 self.wfile.write('</body></html>') | 1610 self.wfile.write('</body></html>') |
| 1637 | 1611 |
| 1638 # called by chunked handling function | 1612 # called by chunked handling function |
| (...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1894 self.options.record_resume, | 1868 self.options.record_resume, |
| 1895 self.options.tls_intolerant) | 1869 self.options.tls_intolerant) |
| 1896 print 'HTTPS server started on %s:%d...' % (host, server.server_port) | 1870 print 'HTTPS server started on %s:%d...' % (host, server.server_port) |
| 1897 else: | 1871 else: |
| 1898 server = HTTPServer((host, port), TestPageHandler) | 1872 server = HTTPServer((host, port), TestPageHandler) |
| 1899 print 'HTTP server started on %s:%d...' % (host, server.server_port) | 1873 print 'HTTP server started on %s:%d...' % (host, server.server_port) |
| 1900 | 1874 |
| 1901 server.data_dir = self.__make_data_dir() | 1875 server.data_dir = self.__make_data_dir() |
| 1902 server.file_root_url = self.options.file_root_url | 1876 server.file_root_url = self.options.file_root_url |
| 1903 server_data['port'] = server.server_port | 1877 server_data['port'] = server.server_port |
| 1904 server._device_management_handler = None | |
| 1905 server.policy_keys = self.options.policy_keys | |
| 1906 elif self.options.server_type == SERVER_WEBSOCKET: | 1878 elif self.options.server_type == SERVER_WEBSOCKET: |
| 1907 # Launch pywebsocket via WebSocketServer. | 1879 # Launch pywebsocket via WebSocketServer. |
| 1908 logger = logging.getLogger() | 1880 logger = logging.getLogger() |
| 1909 logger.addHandler(logging.StreamHandler()) | 1881 logger.addHandler(logging.StreamHandler()) |
| 1910 # TODO(toyoshim): Remove following os.chdir. Currently this operation | 1882 # TODO(toyoshim): Remove following os.chdir. Currently this operation |
| 1911 # is required to work correctly. It should be fixed from pywebsocket side. | 1883 # is required to work correctly. It should be fixed from pywebsocket side. |
| 1912 os.chdir(self.__make_data_dir()) | 1884 os.chdir(self.__make_data_dir()) |
| 1913 websocket_options = WebSocketOptions(host, port, '.') | 1885 websocket_options = WebSocketOptions(host, port, '.') |
| 1914 if self.options.cert_and_key_file: | 1886 if self.options.cert_and_key_file: |
| 1915 websocket_options.use_tls = True | 1887 websocket_options.use_tls = True |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2048 self.option_parser.add_option('--ssl-bulk-cipher', action='append', | 2020 self.option_parser.add_option('--ssl-bulk-cipher', action='append', |
| 2049 help='Specify the bulk encryption ' | 2021 help='Specify the bulk encryption ' |
| 2050 'algorithm(s) that will be accepted by the ' | 2022 'algorithm(s) that will be accepted by the ' |
| 2051 'SSL server. Valid values are "aes256", ' | 2023 'SSL server. Valid values are "aes256", ' |
| 2052 '"aes128", "3des", "rc4". If omitted, all ' | 2024 '"aes128", "3des", "rc4". If omitted, all ' |
| 2053 'algorithms will be used. This option may ' | 2025 'algorithms will be used. This option may ' |
| 2054 'appear multiple times, indicating ' | 2026 'appear multiple times, indicating ' |
| 2055 'multiple algorithms should be enabled.'); | 2027 'multiple algorithms should be enabled.'); |
| 2056 self.option_parser.add_option('--file-root-url', default='/files/', | 2028 self.option_parser.add_option('--file-root-url', default='/files/', |
| 2057 help='Specify a root URL for files served.') | 2029 help='Specify a root URL for files served.') |
| 2058 self.option_parser.add_option('--policy-key', action='append', | |
| 2059 dest='policy_keys', | |
| 2060 help='Specify a path to a PEM-encoded ' | |
| 2061 'private key to use for policy signing. May ' | |
| 2062 'be specified multiple times in order to ' | |
| 2063 'load multipe keys into the server. If the ' | |
| 2064 'server has multiple keys, it will rotate ' | |
| 2065 'through them in at each request a ' | |
| 2066 'round-robin fashion. The server will ' | |
| 2067 'generate a random key if none is specified ' | |
| 2068 'on the command line.') | |
| 2069 | 2030 |
| 2070 | 2031 |
| 2071 if __name__ == '__main__': | 2032 if __name__ == '__main__': |
| 2072 sys.exit(ServerRunner().main()) | 2033 sys.exit(ServerRunner().main()) |
| OLD | NEW |