summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorScott Bahling <sbahling@mudgum.net>2013-03-25 10:10:57 +0100
committerScott Bahling <sbahling@mudgum.net>2013-03-25 10:10:57 +0100
commit7d60b63712598c5d01f89e63d10f8676eda40e26 (patch)
treeb36618d04bca2150a9e591f91bc812dd9b3556d0
parentce3a78a39914f37a73a061bcf4575849b28198cb (diff)
downloadpanfry-0.1.0.tar.gz
panfry-0.1.0.tar.xz
panfry-0.1.0.zip
Make panfry serve stopablepanfry-0.1.0
-rwxr-xr-xpanfry/main.py44
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():