Basic HTTP handling.
1 #! /usr/bin/env python3
4 Author: Eugen Sawin <sawine@me73.com>
10 from urllib.parse import urlparse
11 from argparse import ArgumentParser
12 from http.server import BaseHTTPRequestHandler, HTTPServer
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 parser.add_argument("-d", default="../client", help="http docs path")
22 return parser.parse_args()
27 logging.basicConfig(filename=args.l, level=logging.DEBUG,
28 format="[%(levelname)s@%(asctime)s] %(message)s",
29 datefmt="%d.%m.%Y %I:%M:%S")
30 server = Server(args.a, args.p, args.d, GetHandler)
34 class GetHandler(BaseHTTPRequestHandler):
37 request = Request(self.path, self.server.docs_path)
38 logging.info("Request: %s" % request)
39 code, content_type, data = request()
40 self.send_response(code)
41 self.send_header("Content-type", content_type)
43 self.wfile.write(data)
45 def log_message(self, format, *args):
49 class Server(HTTPServer):
51 def __init__(self, host, port, docs_path, handler):
52 HTTPServer.__init__(self, (host, port), handler)
55 self.docs_path = docs_path
58 logging.info("Server ready and listening at port %i." % self.port)
64 _request_types = {"help": []}
67 def _content_type(cls, doc):
68 if doc.endswith(".html"):
70 elif doc.endswith(".css"):
72 elif doc.endswith(".js"):
73 return "application/javascript"
77 def __init__(self, query, docs_path):
79 self.docs_path = docs_path
80 self.parsed = urlparse(query)
81 if self.parsed.query == "":
82 self.__class__ = WebRequest
83 self.args["doc"] = self.parsed.path
85 com = self.parsed.path.strip("/")
86 self.args = dict([q.split("=") for q in self.parsed.query.split("&")])
89 return "%s(%s)" % (str(self.__class__).partition(".")[-1].rstrip("'>"),
90 ", ".join(["%s: %s" % (k, str(v))
91 for k, v in self.args.items()]))
94 class WebRequest(Request):
97 if self.args["doc"] == "/":
98 self.args["doc"] = "/machine.html"
99 content_type = self._content_type(self.args["doc"])
101 rel_path = self.docs_path + self.args["doc"]
102 if os.path.exists(rel_path):
103 data = open(rel_path).read()
107 return (code, content_type, bytes(data, ENCODING))
110 if __name__ == "__main__":