| @@ -4,6 +4,8 @@ Contains classes and utilities for serving a site | |||||
| generated from hyde. | generated from hyde. | ||||
| """ | """ | ||||
| import os | import os | ||||
| import select | |||||
| import threading | |||||
| import urlparse | import urlparse | ||||
| import urllib | import urllib | ||||
| from SimpleHTTPServer import SimpleHTTPRequestHandler | from SimpleHTTPServer import SimpleHTTPRequestHandler | ||||
| @@ -132,8 +134,46 @@ class HydeWebServer(HTTPServer): | |||||
| self.generator = Generator(self.site) | self.generator = Generator(self.site) | ||||
| self.request_time = datetime.strptime('1-1-1999', '%m-%d-%Y') | self.request_time = datetime.strptime('1-1-1999', '%m-%d-%Y') | ||||
| self.regeneration_time = datetime.strptime('1-1-1998', '%m-%d-%Y') | self.regeneration_time = datetime.strptime('1-1-1998', '%m-%d-%Y') | ||||
| self.__is_shut_down = threading.Event() | |||||
| self.__shutdown_request = False | |||||
| HTTPServer.__init__(self, (address, port), | HTTPServer.__init__(self, (address, port), | ||||
| HydeRequestHandler) | HydeRequestHandler) | ||||
| ####### Code from python 2.7.1: Socket server | |||||
| ####### Duplicated to make sure shutdown works in Python v > 2.6 | |||||
| ####### | |||||
| def serve_forever(self, poll_interval=0.5): | |||||
| """Handle one request at a time until shutdown. | |||||
| Polls for shutdown every poll_interval seconds. Ignores | |||||
| self.timeout. If you need to do periodic tasks, do them in | |||||
| another thread. | |||||
| """ | |||||
| self.__is_shut_down.clear() | |||||
| try: | |||||
| while not self.__shutdown_request: | |||||
| # XXX: Consider using another file descriptor or | |||||
| # connecting to the socket to wake this up instead of | |||||
| # polling. Polling reduces our responsiveness to a | |||||
| # shutdown request and wastes cpu at all other times. | |||||
| r, w, e = select.select([self], [], [], poll_interval) | |||||
| if self in r: | |||||
| self._handle_request_noblock() | |||||
| finally: | |||||
| self.__shutdown_request = False | |||||
| self.__is_shut_down.set() | |||||
| def shutdown(self): | |||||
| """Stops the serve_forever loop. | |||||
| Blocks until the loop has finished. This must be called while | |||||
| serve_forever() is running in another thread, or it will | |||||
| deadlock. | |||||
| """ | |||||
| self.__shutdown_request = True | |||||
| self.__is_shut_down.wait() | |||||
| ############## Duplication End. | |||||
| def regenerate(self): | def regenerate(self): | ||||
| """ | """ | ||||