| 2483 | self.callback(self) |
| 2484 | |
| 2485 | class ServerThread(threading.Thread): |
| 2486 | |
| 2487 | def __init__(self, urlhandler, host, port): |
| 2488 | self.urlhandler = urlhandler |
| 2489 | self.host = host |
| 2490 | self.port = int(port) |
| 2491 | threading.Thread.__init__(self) |
| 2492 | self.serving = False |
| 2493 | self.error = None |
| 2494 | self.docserver = None |
| 2495 | |
| 2496 | def run(self): |
| 2497 | """Start the server.""" |
| 2498 | try: |
| 2499 | DocServer.base = http.server.HTTPServer |
| 2500 | DocServer.handler = DocHandler |
| 2501 | DocHandler.MessageClass = email.message.Message |
| 2502 | DocHandler.urlhandler = staticmethod(self.urlhandler) |
| 2503 | docsvr = DocServer(self.host, self.port, self.ready) |
| 2504 | self.docserver = docsvr |
| 2505 | docsvr.serve_until_quit() |
| 2506 | except Exception as e: |
| 2507 | self.error = e |
| 2508 | |
| 2509 | def ready(self, server): |
| 2510 | self.serving = True |
| 2511 | self.host = server.host |
| 2512 | self.port = server.server_port |
| 2513 | self.url = 'http://%s:%d/' % (self.host, self.port) |
| 2514 | |
| 2515 | def stop(self): |
| 2516 | """Stop the server and this thread nicely""" |
| 2517 | self.docserver.quit = True |
| 2518 | self.join() |
| 2519 | # explicitly break a reference cycle: DocServer.callback |
| 2520 | # has indirectly a reference to ServerThread. |
| 2521 | self.docserver = None |
| 2522 | self.serving = False |
| 2523 | self.url = None |
| 2524 | |
| 2525 | thread = ServerThread(urlhandler, hostname, port) |
| 2526 | thread.start() |