| 2435 | self.callback(self) |
| 2436 | |
| 2437 | class ServerThread(threading.Thread): |
| 2438 | |
| 2439 | def __init__(self, urlhandler, host, port): |
| 2440 | self.urlhandler = urlhandler |
| 2441 | self.host = host |
| 2442 | self.port = int(port) |
| 2443 | threading.Thread.__init__(self) |
| 2444 | self.serving = False |
| 2445 | self.error = None |
| 2446 | self.docserver = None |
| 2447 | |
| 2448 | def run(self): |
| 2449 | """Start the server.""" |
| 2450 | try: |
| 2451 | DocServer.base = http.server.HTTPServer |
| 2452 | DocServer.handler = DocHandler |
| 2453 | DocHandler.MessageClass = email.message.Message |
| 2454 | DocHandler.urlhandler = staticmethod(self.urlhandler) |
| 2455 | docsvr = DocServer(self.host, self.port, self.ready) |
| 2456 | self.docserver = docsvr |
| 2457 | docsvr.serve_until_quit() |
| 2458 | except Exception as err: |
| 2459 | self.error = err |
| 2460 | |
| 2461 | def ready(self, server): |
| 2462 | self.serving = True |
| 2463 | self.host = server.host |
| 2464 | self.port = server.server_port |
| 2465 | self.url = 'http://%s:%d/' % (self.host, self.port) |
| 2466 | |
| 2467 | def stop(self): |
| 2468 | """Stop the server and this thread nicely""" |
| 2469 | self.docserver.quit = True |
| 2470 | self.join() |
| 2471 | # explicitly break a reference cycle: DocServer.callback |
| 2472 | # has indirectly a reference to ServerThread. |
| 2473 | self.docserver = None |
| 2474 | self.serving = False |
| 2475 | self.url = None |
| 2476 | |
| 2477 | thread = ServerThread(urlhandler, hostname, port) |
| 2478 | thread.start() |