# HG changeset patch # User Eugen Sawin # Date 1323574228 -3600 # Node ID 4d3f6e49e8fc2e9de5eb700c5e8ad9832a7640bf # Parent ab694dc54515a0b9e9618b1715bb83131fbbdec4 Basic HTTP handling. diff -r ab694dc54515 -r 4d3f6e49e8fc server/server.py --- a/server/server.py Sun Dec 11 02:27:29 2011 +0100 +++ b/server/server.py Sun Dec 11 04:30:28 2011 +0100 @@ -4,99 +4,107 @@ Author: Eugen Sawin """ +import socketserver +import logging +import os.path +from urllib.parse import urlparse from argparse import ArgumentParser from http.server import BaseHTTPRequestHandler, HTTPServer -import socketserver -from urllib.parse import urlparse -import logging ENCODING = "utf-8" - def parse_args(): parser = ArgumentParser(description="") parser.add_argument("-p", type=int, default=8080, help="port") parser.add_argument("-a", default="localhost", help="host address") parser.add_argument("-l", default="log/server.log", help="log file") + parser.add_argument("-d", default="../client", help="http docs path") return parser.parse_args() def main(): args = parse_args() logging.basicConfig(filename=args.l, level=logging.DEBUG, - format="[%(levelname)s @ %(asctime)s] %(message)s", + format="[%(levelname)s@%(asctime)s] %(message)s", datefmt="%d.%m.%Y %I:%M:%S") - server = Server(args.a, args.p, GetHandler) + server = Server(args.a, args.p, args.d, GetHandler) server.run() class GetHandler(BaseHTTPRequestHandler): def do_GET(self): - logging.debug("Received query: %s" % self.path) - request = Request(self.path) + request = Request(self.path, self.server.docs_path) logging.info("Request: %s" % request) - if self.path == "/": - self.path = "/machine.html" - parsed_path = urlparse(self.path) - message = "\n".join(("client: %s:%i" % self.client_address, - "path: %s" % parsed_path.path, - "query: %s" % parsed_path.query, - "params: %s" % parsed_path.params)) - self.send_response(200) - resource = True - if parsed_path.path.endswith(".html"): - self.send_header("Content-type", "text/html") - elif parsed_path.path.endswith(".css"): - self.send_header("Content-type", "text/css") - elif parsed_path.path.endswith(".js"): - self.send_header("Content-type", "application/javascript") - else: - self.send_header("Content-type", "application/json") - resource = False + code, content_type, data = request() + self.send_response(code) + self.send_header("Content-type", content_type) self.end_headers() - if resource: - self.wfile.write(bytes(open("../client" + parsed_path.path).read(), ENCODING)) - else: - self.wfile.write(bytes("{'time': 73}", ENCODING)) + self.wfile.write(data) + + def log_message(self, format, *args): + pass class Server(HTTPServer): - def __init__(self, host, port, handler): + def __init__(self, host, port, docs_path, handler): HTTPServer.__init__(self, (host, port), handler) self.host = host self.port = port + self.docs_path = docs_path def run(self): logging.info("Server ready and listening at port %i." % self.port) self.serve_forever() + class Request: _request_types = {"help": []} + + @classmethod + def _content_type(cls, doc): + if doc.endswith(".html"): + return "text/html" + elif doc.endswith(".css"): + return "text/css" + elif doc.endswith(".js"): + return "application/javascript" + else: + return "text/plain" - def __init__(self, query): + def __init__(self, query, docs_path): self.args = {} - pos = query.find("?") - if pos == -1: + self.docs_path = docs_path + self.parsed = urlparse(query) + if self.parsed.query == "": self.__class__ = WebRequest - self.args["doc"] = query - else: - com = query[:pos] - arg_str = query[pos:] - for t, args in _request_types: - pass + self.args["doc"] = self.parsed.path + else: + com = self.parsed.path.strip("/") + self.args = dict([q.split("=") for q in self.parsed.query.split("&")]) def __str__(self): return "%s(%s)" % (str(self.__class__).partition(".")[-1].rstrip("'>"), ", ".join(["%s: %s" % (k, str(v)) for k, v in self.args.items()])) + class WebRequest(Request): def __call__(self): - pass + if self.args["doc"] == "/": + self.args["doc"] = "/machine.html" + content_type = self._content_type(self.args["doc"]) + data = "" + rel_path = self.docs_path + self.args["doc"] + if os.path.exists(rel_path): + data = open(rel_path).read() + code = 200 + else: + code = 404 + return (code, content_type, bytes(data, ENCODING)) if __name__ == "__main__":