blob: 70d1c85247c94561544038fe8147549ab1f32f95 [file] [log] [blame]
# 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()