import http.server import urllib.parse import socket import threading from logbook import Logger from service.settings import CRESTSettings pyfalog = Logger(__name__) # noinspection PyPep8 HTML = '''
{}
".format(ex.message) finally: self.send_response(200) self.end_headers() self.wfile.write(str.encode(HTML.format(msg))) if step2: # Only stop once if we've received something in the querystring self.server.stop() def log_message(self, format, *args): return # http://code.activestate.com/recipes/425210-simple-stoppable-server-using-socket-timeout/ class StoppableHTTPServer(http.server.HTTPServer): def server_bind(self): http.server.HTTPServer.server_bind(self) self.settings = CRESTSettings.getInstance() # Allow listening for x seconds sec = self.settings.get('timeout') pyfalog.debug("Running server for {0} seconds", sec) self.socket.settimeout(1) self.max_tries = sec / self.socket.gettimeout() self.tries = 0 self.run = True def get_request(self): while self.run: try: sock, addr = self.socket.accept() sock.settimeout(None) return sock, addr except socket.timeout: pyfalog.warning("Server timed out waiting for connection") pass def stop(self): pyfalog.warning("Setting CREST server to stop.") self.run = False def handle_timeout(self): pyfalog.debug("Number of tries: {0}", self.tries) self.tries += 1 if self.tries == self.max_tries: pyfalog.debug("Server timed out waiting for connection") self.stop() def serve(self, callback=None): self.callback = callback while self.run: try: self.handle_request() except TypeError: pyfalog.debug("Caught exception in serve") pass self.server_close() if __name__ == "__main__": httpd = StoppableHTTPServer(('', 6461), AuthHandler) t = threading.Thread(target=httpd.serve) input("Press