import time import BaseHTTPServer import urlparse import json import os __path__ = os.path.abspath(os.path.dirname(__file__)) server_registry = dict() class MyHandler(BaseHTTPServer.BaseHTTPRequestHandler): def do_HEAD(s): s.send_response(200) s.send_header("Content-type", "text/html") s.end_headers() def do_GET(s): """Respond to a GET request.""" #extract the path and set default o = urlparse.urlparse(s.path) args = server_registry[s.server] path = o.path #handle json requests if path.endswith('.json'): s.send_response(200) s.send_header("Content-type", "application/json") s.end_headers() if path == '/args.json': arg_strs = dict((str(k), str(v)) for k, v in args.iteritems()) s.wfile.write(json.dumps(arg_strs)) else: #why the fuck does no OS ever patch boost when there is a bug #https://svn.boost.org/trac/boost/ticket/6785 #serialize the path args into xml -- but I just wanted json def xml_from_qs(k, v): if not isinstance(v, list): v = [v] return ''.join(['<%s>%s%s>'%(k, v_i, k) for v_i in v]) query_args = [xml_from_qs(k,v) for k,v in urlparse.parse_qs(o.query).iteritems()] query_args.append(xml_from_qs('path', path)) xml_args = xml_from_qs('args', ''.join(query_args)) s.wfile.write(args['top_block'].query(xml_args)) return #clean up path for filesystem if path.startswith('/'): path = path[1:] if not path: path = 'main.html' target = os.path.join(__path__, path) #get files from the local file system if os.path.exists(target): s.send_response(200) if target.endswith('.js'): s.send_header("Content-type", "text/javascript") elif target.endswith('.css'): s.send_header("Content-type", "text/css") else: s.send_header("Content-type", "text") s.end_headers() s.wfile.write(open(target).read()) #otherwise not found do 404 else: s.send_response(404) s.send_header("Content-type", "text/html") s.end_headers() s.wfile.write("
not found
") import select class http_server(object): def __init__(self, args, **kwargs): server_class = BaseHTTPServer.HTTPServer self._httpd = server_class(args, MyHandler) server_registry[self._httpd] = kwargs def serve_forever(self): while True: try: self._httpd.serve_forever() except select.error: pass