server/server.py
author Eugen Sawin <sawine@me73.com>
Sun, 11 Dec 2011 02:27:29 +0100
changeset 10 ab694dc54515
parent 9 44d912089ce1
child 11 4d3f6e49e8fc
permissions -rwxr-xr-x
Added logging and Request classes.
     1 #! /usr/bin/env python3
     2 """
     3 Name: Machine Server
     4 Author: Eugen Sawin <sawine@me73.com>
     5 """
     6 
     7 from argparse import ArgumentParser
     8 from http.server import BaseHTTPRequestHandler, HTTPServer
     9 import socketserver
    10 from urllib.parse import urlparse
    11 import logging
    12 
    13 ENCODING = "utf-8"
    14 
    15 
    16 def parse_args():
    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()	
    22 
    23 
    24 def main():
    25     args = 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)
    30     server.run()
    31 
    32 
    33 class GetHandler(BaseHTTPRequestHandler):
    34 
    35     def do_GET(self):
    36         logging.debug("Received query: %s" % self.path)
    37         request = Request(self.path)
    38         logging.info("Request: %s" % request)
    39         if self.path == "/":
    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)        
    47         resource = True
    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")
    54         else:
    55             self.send_header("Content-type", "application/json")  
    56             resource = False
    57         self.end_headers()
    58         if resource:
    59             self.wfile.write(bytes(open("../client" + parsed_path.path).read(), ENCODING))
    60         else:           
    61             self.wfile.write(bytes("{'time': 73}", ENCODING))
    62 
    63 		
    64 class Server(HTTPServer):
    65 
    66     def __init__(self, host, port, handler):
    67         HTTPServer.__init__(self, (host, port), handler)
    68         self.host = host
    69         self.port = port
    70 
    71     def run(self):
    72         logging.info("Server ready and listening at port %i." % self.port)
    73         self.serve_forever()
    74 
    75 class Request:
    76 
    77     _request_types = {"help": []}
    78             
    79     def __init__(self, query):
    80         self.args = {}
    81         pos = query.find("?")
    82         if pos == -1:
    83             self.__class__ = WebRequest     
    84             self.args["doc"] = query
    85         else:
    86             com = query[:pos]
    87             arg_str = query[pos:]
    88             for t, args in _request_types:
    89                 pass
    90 
    91     def __str__(self):
    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()]))
    95 
    96 class WebRequest(Request):
    97 
    98     def __call__(self):
    99         pass
   100 
   101 
   102 if __name__ == "__main__":
   103 	main()
   104