Added logging and Request classes.
1 #! /usr/bin/env python3
4 Author: Eugen Sawin <sawine@me73.com>
7 from argparse import ArgumentParser
8 from http.server import BaseHTTPRequestHandler, HTTPServer
10 from urllib.parse import urlparse
17 parser = ArgumentParser(description="")
18 parser.add_argument("-p", type=int, default=8080, help="port")
19 parser.add_argument("-a", default="localhost", help="host address")
20 parser.add_argument("-l", default="log/server.log", help="log file")
21 return parser.parse_args()
26 logging.basicConfig(filename=args.l, level=logging.DEBUG,
27 format="[%(levelname)s @ %(asctime)s] %(message)s",
28 datefmt="%d.%m.%Y %I:%M:%S")
29 server = Server(args.a, args.p, GetHandler)
33 class GetHandler(BaseHTTPRequestHandler):
36 logging.debug("Received query: %s" % self.path)
37 request = Request(self.path)
38 logging.info("Request: %s" % request)
40 self.path = "/machine.html"
41 parsed_path = urlparse(self.path)
42 message = "\n".join(("client: %s:%i" % self.client_address,
43 "path: %s" % parsed_path.path,
44 "query: %s" % parsed_path.query,
45 "params: %s" % parsed_path.params))
46 self.send_response(200)
48 if parsed_path.path.endswith(".html"):
49 self.send_header("Content-type", "text/html")
50 elif parsed_path.path.endswith(".css"):
51 self.send_header("Content-type", "text/css")
52 elif parsed_path.path.endswith(".js"):
53 self.send_header("Content-type", "application/javascript")
55 self.send_header("Content-type", "application/json")
59 self.wfile.write(bytes(open("../client" + parsed_path.path).read(), ENCODING))
61 self.wfile.write(bytes("{'time': 73}", ENCODING))
64 class Server(HTTPServer):
66 def __init__(self, host, port, handler):
67 HTTPServer.__init__(self, (host, port), handler)
72 logging.info("Server ready and listening at port %i." % self.port)
77 _request_types = {"help": []}
79 def __init__(self, query):
83 self.__class__ = WebRequest
84 self.args["doc"] = query
88 for t, args in _request_types:
92 return "%s(%s)" % (str(self.__class__).partition(".")[-1].rstrip("'>"),
93 ", ".join(["%s: %s" % (k, str(v))
94 for k, v in self.args.items()]))
96 class WebRequest(Request):
102 if __name__ == "__main__":