| 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 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 264 self.ClientRedirectHandler, | 264 self.ClientRedirectHandler, |
| 265 self.MultipartHandler, | 265 self.MultipartHandler, |
| 266 self.MultipartSlowHandler, | 266 self.MultipartSlowHandler, |
| 267 self.GetSSLSessionCacheHandler, | 267 self.GetSSLSessionCacheHandler, |
| 268 self.CloseSocketHandler, | 268 self.CloseSocketHandler, |
| 269 self.RangeResetHandler, | 269 self.RangeResetHandler, |
| 270 self.DefaultResponseHandler] | 270 self.DefaultResponseHandler] |
| 271 post_handlers = [ | 271 post_handlers = [ |
| 272 self.EchoTitleHandler, | 272 self.EchoTitleHandler, |
| 273 self.EchoHandler, | 273 self.EchoHandler, |
| 274 self.DeviceManagementHandler, | |
| 275 self.PostOnlyFileHandler] + get_handlers | 274 self.PostOnlyFileHandler] + get_handlers |
| 276 put_handlers = [ | 275 put_handlers = [ |
| 277 self.EchoTitleHandler, | 276 self.EchoTitleHandler, |
| 278 self.EchoHandler] + get_handlers | 277 self.EchoHandler] + get_handlers |
| 279 head_handlers = [ | 278 head_handlers = [ |
| 280 self.FileHandler, | 279 self.FileHandler, |
| 281 self.DefaultResponseHandler] | 280 self.DefaultResponseHandler] |
| 282 | 281 |
| 283 self._mime_types = { | 282 self._mime_types = { |
| 284 'crx' : 'application/x-chrome-extension', | 283 'crx' : 'application/x-chrome-extension', |
| (...skipping 1290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1575 with 400 to CONNECT requests.""" | 1574 with 400 to CONNECT requests.""" |
| 1576 | 1575 |
| 1577 contents = "Your client has issued a malformed or illegal request." | 1576 contents = "Your client has issued a malformed or illegal request." |
| 1578 self.send_response(400) # bad request | 1577 self.send_response(400) # bad request |
| 1579 self.send_header('Content-Type', 'text/html') | 1578 self.send_header('Content-Type', 'text/html') |
| 1580 self.send_header('Content-Length', len(contents)) | 1579 self.send_header('Content-Length', len(contents)) |
| 1581 self.end_headers() | 1580 self.end_headers() |
| 1582 self.wfile.write(contents) | 1581 self.wfile.write(contents) |
| 1583 return True | 1582 return True |
| 1584 | 1583 |
| 1585 def DeviceManagementHandler(self): | |
| 1586 """Delegates to the device management service used for cloud policy.""" | |
| 1587 | |
| 1588 if not self._ShouldHandleRequest("/device_management"): | |
| 1589 return False | |
| 1590 | |
| 1591 raw_request = self.ReadRequestBody() | |
| 1592 | |
| 1593 if not self.server._device_management_handler: | |
| 1594 import device_management | |
| 1595 policy_path = os.path.join(self.server.data_dir, 'device_management') | |
| 1596 self.server._device_management_handler = ( | |
| 1597 device_management.TestServer(policy_path, self.server.policy_keys)) | |
| 1598 | |
| 1599 http_response, raw_reply = ( | |
| 1600 self.server._device_management_handler.HandleRequest(self.path, | |
| 1601 self.headers, | |
| 1602 raw_request)) | |
| 1603 self.send_response(http_response) | |
| 1604 if (http_response == 200): | |
| 1605 self.send_header('Content-Type', 'application/x-protobuffer') | |
| 1606 self.end_headers() | |
| 1607 self.wfile.write(raw_reply) | |
| 1608 return True | |
| 1609 | |
| 1610 # called by the redirect handling function when there is no parameter | 1584 # called by the redirect handling function when there is no parameter |
| 1611 def sendRedirectHelp(self, redirect_name): | 1585 def sendRedirectHelp(self, redirect_name): |
| 1612 self.send_response(200) | 1586 self.send_response(200) |
| 1613 self.send_header('Content-Type', 'text/html') | 1587 self.send_header('Content-Type', 'text/html') |
| 1614 self.end_headers() | 1588 self.end_headers() |
| 1615 self.wfile.write('<html><body><h1>Error: no redirect destination</h1>') | 1589 self.wfile.write('<html><body><h1>Error: no redirect destination</h1>') |
| 1616 self.wfile.write('Use <pre>%s?http://dest...</pre>' % redirect_name) | 1590 self.wfile.write('Use <pre>%s?http://dest...</pre>' % redirect_name) |
| 1617 self.wfile.write('</body></html>') | 1591 self.wfile.write('</body></html>') |
| 1618 | 1592 |
| 1619 # called by chunked handling function | 1593 # called by chunked handling function |
| (...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1875 self.options.record_resume, | 1849 self.options.record_resume, |
| 1876 self.options.tls_intolerant) | 1850 self.options.tls_intolerant) |
| 1877 print 'HTTPS server started on %s:%d...' % (host, server.server_port) | 1851 print 'HTTPS server started on %s:%d...' % (host, server.server_port) |
| 1878 else: | 1852 else: |
| 1879 server = HTTPServer((host, port), TestPageHandler) | 1853 server = HTTPServer((host, port), TestPageHandler) |
| 1880 print 'HTTP server started on %s:%d...' % (host, server.server_port) | 1854 print 'HTTP server started on %s:%d...' % (host, server.server_port) |
| 1881 | 1855 |
| 1882 server.data_dir = self.__make_data_dir() | 1856 server.data_dir = self.__make_data_dir() |
| 1883 server.file_root_url = self.options.file_root_url | 1857 server.file_root_url = self.options.file_root_url |
| 1884 server_data['port'] = server.server_port | 1858 server_data['port'] = server.server_port |
| 1885 server._device_management_handler = None | |
| 1886 server.policy_keys = self.options.policy_keys | |
| 1887 elif self.options.server_type == SERVER_WEBSOCKET: | 1859 elif self.options.server_type == SERVER_WEBSOCKET: |
| 1888 # Launch pywebsocket via WebSocketServer. | 1860 # Launch pywebsocket via WebSocketServer. |
| 1889 logger = logging.getLogger() | 1861 logger = logging.getLogger() |
| 1890 logger.addHandler(logging.StreamHandler()) | 1862 logger.addHandler(logging.StreamHandler()) |
| 1891 # TODO(toyoshim): Remove following os.chdir. Currently this operation | 1863 # TODO(toyoshim): Remove following os.chdir. Currently this operation |
| 1892 # is required to work correctly. It should be fixed from pywebsocket side. | 1864 # is required to work correctly. It should be fixed from pywebsocket side. |
| 1893 os.chdir(self.__make_data_dir()) | 1865 os.chdir(self.__make_data_dir()) |
| 1894 websocket_options = WebSocketOptions(host, port, '.') | 1866 websocket_options = WebSocketOptions(host, port, '.') |
| 1895 if self.options.cert_and_key_file: | 1867 if self.options.cert_and_key_file: |
| 1896 websocket_options.use_tls = True | 1868 websocket_options.use_tls = True |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2029 self.option_parser.add_option('--ssl-bulk-cipher', action='append', | 2001 self.option_parser.add_option('--ssl-bulk-cipher', action='append', |
| 2030 help='Specify the bulk encryption ' | 2002 help='Specify the bulk encryption ' |
| 2031 'algorithm(s) that will be accepted by the ' | 2003 'algorithm(s) that will be accepted by the ' |
| 2032 'SSL server. Valid values are "aes256", ' | 2004 'SSL server. Valid values are "aes256", ' |
| 2033 '"aes128", "3des", "rc4". If omitted, all ' | 2005 '"aes128", "3des", "rc4". If omitted, all ' |
| 2034 'algorithms will be used. This option may ' | 2006 'algorithms will be used. This option may ' |
| 2035 'appear multiple times, indicating ' | 2007 'appear multiple times, indicating ' |
| 2036 'multiple algorithms should be enabled.'); | 2008 'multiple algorithms should be enabled.'); |
| 2037 self.option_parser.add_option('--file-root-url', default='/files/', | 2009 self.option_parser.add_option('--file-root-url', default='/files/', |
| 2038 help='Specify a root URL for files served.') | 2010 help='Specify a root URL for files served.') |
| 2039 self.option_parser.add_option('--policy-key', action='append', | |
| 2040 dest='policy_keys', | |
| 2041 help='Specify a path to a PEM-encoded ' | |
| 2042 'private key to use for policy signing. May ' | |
| 2043 'be specified multiple times in order to ' | |
| 2044 'load multipe keys into the server. If the ' | |
| 2045 'server has multiple keys, it will rotate ' | |
| 2046 'through them in at each request a ' | |
| 2047 'round-robin fashion. The server will ' | |
| 2048 'generate a random key if none is specified ' | |
| 2049 'on the command line.') | |
| 2050 | 2011 |
| 2051 | 2012 |
| 2052 if __name__ == '__main__': | 2013 if __name__ == '__main__': |
| 2053 sys.exit(ServerRunner().main()) | 2014 sys.exit(ServerRunner().main()) |
| OLD | NEW |