diff options
Diffstat (limited to 'panfry/main.py')
| -rwxr-xr-x | panfry/main.py | 44 |
1 files changed, 39 insertions, 5 deletions
diff --git a/panfry/main.py b/panfry/main.py index 0713a8f..40c2b15 100755 --- a/panfry/main.py +++ b/panfry/main.py @@ -2,25 +2,46 @@ # -*- coding: utf-8 -*- from __future__ import print_function import os +import signal import shutil import shlex import SimpleHTTPServer -import SocketServer +import BaseHTTPServer +import httplib import panfry.cli from panfry.templater import Templater from panfry.document import Document +class StoppableHttpRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler): + """http request handler with QUIT stopping the server""" + + def do_QUIT(self): + """send 200 OK response, and set server.stop to True""" + self.send_response(200) + self.end_headers() + self.server.stop = True + + +class StoppableHttpServer(BaseHTTPServer.HTTPServer): + """http server that reacts to self.stop flag""" + + def serve_forever(self): + """Handle one request at a time until stopped.""" + self.stop = False + while not self.stop: + self.handle_request() + + def get_env(): env = panfry.cli.init_argparser().parse_args() env.pub_path = os.path.abspath(env.pub_path) - + if env.cmd in ['gen']: if not os.path.isdir(env.doc_path): print("%s directory not found. Aborting..." % env.doc_path) exit(1) - if not env.templates_path: env.templates_path = os.path.join(env.doc_path, 'templates') @@ -75,11 +96,24 @@ def gen(env): def serve(env): os.chdir(env.pub_path) - Handler = SimpleHTTPServer.SimpleHTTPRequestHandler - httpd = SocketServer.TCPServer(("", int(env.port)), Handler) + def signal_handler(signal, frame): + print('You pressed Ctrl+C!') + + def stop_server(port): + """send QUIT request to http server running on localhost:<port>""" + conn = httplib.HTTPConnection("localhost:%d" % env.port) + conn.request("QUIT", "/") + conn.getresponse() + exit(0) + + signal.signal(signal.SIGINT, signal_handler) + Handler = StoppableHttpRequestHandler + + httpd = StoppableHttpServer(("", int(env.port)), Handler) print("serving at port: %s" % int(env.port)) httpd.serve_forever() + signal.pause() def main(): |
