From 7d60b63712598c5d01f89e63d10f8676eda40e26 Mon Sep 17 00:00:00 2001 From: Scott Bahling Date: Mon, 25 Mar 2013 10:10:57 +0100 Subject: Make panfry serve stopable --- panfry/main.py | 44 +++++++++++++++++++++++++++++++++++++++----- 1 file 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:""" + 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(): -- cgit v1.2.3