| # Copyright 2016 The Chromium Authors. All rights reserved. | 
 | # Use of this source code is governed by a BSD-style license that can be | 
 | # found in the LICENSE file. | 
 |  | 
 | """Communications server. | 
 |  | 
 | This is the HTTP server class. The server is run in a separate thread allowing | 
 | the calling code to proceed normally after calling start(). shutdown() must | 
 | be called to tear the server down. Failure to do this will most likely end up | 
 | hanging the program. | 
 | """ | 
 |  | 
 | import BaseHTTPServer | 
 | import SocketServer | 
 | import threading | 
 |  | 
 | from legion.lib import common_lib | 
 | from legion.lib.comm_server import server_handler | 
 |  | 
 |  | 
 | class CommServer(SocketServer.ThreadingMixIn, | 
 |                      BaseHTTPServer.HTTPServer): | 
 |   """An extension of the HTTPServer class which handles requests in threads.""" | 
 |  | 
 |   def __init__(self, address='', port=None): | 
 |     self._port = port or common_lib.GetUnusedPort() | 
 |     self._address = address | 
 |     BaseHTTPServer.HTTPServer.__init__(self, | 
 |                                        (self._address, self._port), | 
 |                                        server_handler.ServerHandler) | 
 |  | 
 |   @property | 
 |   def port(self): | 
 |     return self._port | 
 |  | 
 |   @property | 
 |   def address(self): | 
 |     return self._address | 
 |  | 
 |   def start(self): | 
 |     """Starts the server in another thread. | 
 |  | 
 |     The thread will stay active until shutdown() is called. There is no reason | 
 |     to hold a reference to the thread object. | 
 |  | 
 |     The naming convention used here (lowercase) is used to match the base | 
 |     server's naming convention. | 
 |     """ | 
 |     threading.Thread(target=self.serve_forever).start() |