from SimpleHTTPServer import SimpleHTTPRequestHandler import BaseHTTPServer import httplib import threading from os.path import join, abspath class RequestHandler(SimpleHTTPRequestHandler): def do_QUIT (self): self.send_response(200) self.end_headers() self.server.stop = True def translate_path(self, path): return NotImplementedError() class StoppableServer(BaseHTTPServer.HTTPServer): def serve_forever (self): self.stop = False while not self.stop: self.handle_request() def _make_handler(root): class MyRequestHandler(RequestHandler): def translate_path(self, path): startdir = abspath(root) path = [d for d in path.split('/') if d != '..'] return join(startdir, *path) return MyRequestHandler class Server(): def __init__(self, port, root): self.port = port self.handler_class = _make_handler(root) def start(self): self.httpd = StoppableServer(('', self.port), self.handler_class) t = threading.Thread(target=self.httpd.serve_forever) t.setDaemon(True) t.start() print 'Started SimpleHTTPServer on port', self.port def stop(self): conn = httplib.HTTPConnection('localhost:%d' % self.port) conn.request('QUIT', '/') conn.getresponse()