OLD | NEW |
(Empty) | |
| 1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. |
| 4 |
| 5 import BaseHTTPServer |
| 6 import os |
| 7 import threading |
| 8 |
| 9 |
| 10 class _FileRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): |
| 11 """Sends back file resources relative to the server's |root_dir|.""" |
| 12 |
| 13 def do_GET(self): |
| 14 if self.path.endswith('favicon.ico'): |
| 15 self.send_error(404) |
| 16 return |
| 17 path = os.path.join(self.server.root_dir, *self.path.split('/')) |
| 18 with open(path, 'r') as f: |
| 19 data = f.read() |
| 20 self.send_response(200) |
| 21 self.send_header('Content-Length', len(data)) |
| 22 self.end_headers() |
| 23 self.wfile.write(data) |
| 24 |
| 25 |
| 26 class WebServer(object): |
| 27 """An HTTP or HTTPS server that serves files on its own thread.""" |
| 28 |
| 29 def __init__(self, root_dir, server_cert_and_key_path=None): |
| 30 """Starts the web server on its own thread on an ephemeral port. |
| 31 It is an HTTP server if parameter server_cert_and_key_path is not provided. |
| 32 Otherwise, it is an HTTPS server. |
| 33 |
| 34 After this function returns, it is safe to assume the server is ready |
| 35 to receive requests. |
| 36 |
| 37 Args: |
| 38 root_dir: root path to serve files from. This parameter is required. |
| 39 server_cert_and_key_path: path to a PEM file containing the cert and key. |
| 40 if it is None, start the server as an HTTP one. |
| 41 """ |
| 42 self._server = BaseHTTPServer.HTTPServer( |
| 43 ('127.0.0.1', 0), _FileRequestHandler) |
| 44 self._server.root_dir = root_dir |
| 45 if server_cert_and_key_path is not None: |
| 46 self._is_https_enabled = True |
| 47 self._server.socket = ssl.wrap_socket( |
| 48 self._server.socket, certfile=server_cert_and_key_path, |
| 49 server_side=True) |
| 50 else: |
| 51 self._is_https_enabled = False |
| 52 |
| 53 self._thread = threading.Thread(target=self._server.serve_forever) |
| 54 self._thread.start() |
| 55 |
| 56 def GetUrl(self): |
| 57 """Returns the base URL of the server.""" |
| 58 if self._is_https_enabled: |
| 59 return 'https://127.0.0.1:%s' % self._server.server_port |
| 60 return 'http://127.0.0.1:%s' % self._server.server_port |
| 61 |
| 62 def Shutdown(self): |
| 63 """Shuts down the server synchronously.""" |
| 64 self._server.shutdown() |
| 65 self._thread.join() |
OLD | NEW |