server/server.py
changeset 10 ab694dc54515
parent 9 44d912089ce1
child 11 4d3f6e49e8fc
     1.1 --- a/server/server.py	Sat Oct 08 01:05:50 2011 +0200
     1.2 +++ b/server/server.py	Sun Dec 11 02:27:29 2011 +0100
     1.3 @@ -1,36 +1,49 @@
     1.4 -#!/usr/bin/python
     1.5 +#! /usr/bin/env python3
     1.6 +"""
     1.7 +Name: Machine Server
     1.8 +Author: Eugen Sawin <sawine@me73.com>
     1.9 +"""
    1.10  
    1.11  from argparse import ArgumentParser
    1.12 +from http.server import BaseHTTPRequestHandler, HTTPServer
    1.13 +import socketserver
    1.14 +from urllib.parse import urlparse
    1.15 +import logging
    1.16 +
    1.17 +ENCODING = "utf-8"
    1.18 +
    1.19  
    1.20  def parse_args():
    1.21      parser = ArgumentParser(description="")
    1.22 -    parser.add_argument("port", type=int, help="port")
    1.23 -    parser.add_argument("-a", help="host address")
    1.24 +    parser.add_argument("-p", type=int, default=8080, help="port")
    1.25 +    parser.add_argument("-a", default="localhost", help="host address")
    1.26 +    parser.add_argument("-l", default="log/server.log", help="log file")
    1.27      return parser.parse_args()	
    1.28  
    1.29 +
    1.30  def main():
    1.31      args = parse_args()
    1.32 -    port = args.port
    1.33 -    server = Server("localhost", port, GetHandler)
    1.34 +    logging.basicConfig(filename=args.l, level=logging.DEBUG,
    1.35 +                        format="[%(levelname)s @ %(asctime)s] %(message)s",
    1.36 +                        datefmt="%d.%m.%Y %I:%M:%S")
    1.37 +    server = Server(args.a, args.p, GetHandler)
    1.38      server.run()
    1.39  
    1.40 -from BaseHTTPServer import BaseHTTPRequestHandler
    1.41 -from BaseHTTPServer import HTTPServer
    1.42 -import SocketServer
    1.43 -import urlparse
    1.44  
    1.45  class GetHandler(BaseHTTPRequestHandler):
    1.46 +
    1.47      def do_GET(self):
    1.48 +        logging.debug("Received query: %s" % self.path)
    1.49 +        request = Request(self.path)
    1.50 +        logging.info("Request: %s" % request)
    1.51          if self.path == "/":
    1.52              self.path = "/machine.html"
    1.53 -
    1.54 -        parsed_path = urlparse.urlparse(self.path)
    1.55 -        message = '\n'.join(("client: %s:%i" % self.client_address,
    1.56 +        parsed_path = urlparse(self.path)
    1.57 +        message = "\n".join(("client: %s:%i" % self.client_address,
    1.58                               "path: %s" % parsed_path.path,
    1.59                               "query: %s" % parsed_path.query,
    1.60                               "params: %s" % parsed_path.params))
    1.61 -        self.send_response(200) 
    1.62 -       
    1.63 +        self.send_response(200)        
    1.64          resource = True
    1.65          if parsed_path.path.endswith(".html"):            
    1.66              self.send_header("Content-type", "text/html")          
    1.67 @@ -42,20 +55,50 @@
    1.68              self.send_header("Content-type", "application/json")  
    1.69              resource = False
    1.70          self.end_headers()
    1.71 +        if resource:
    1.72 +            self.wfile.write(bytes(open("../client" + parsed_path.path).read(), ENCODING))
    1.73 +        else:           
    1.74 +            self.wfile.write(bytes("{'time': 73}", ENCODING))
    1.75  
    1.76 -        if resource:
    1.77 -            self.wfile.write(open("../client" + parsed_path.path).read())
    1.78 -        else:           
    1.79 -            self.wfile.write("{\"time\": 73}")
    1.80  		
    1.81  class Server(HTTPServer):
    1.82 +
    1.83      def __init__(self, host, port, handler):
    1.84          HTTPServer.__init__(self, (host, port), handler)
    1.85          self.host = host
    1.86          self.port = port
    1.87 +
    1.88      def run(self):
    1.89 +        logging.info("Server ready and listening at port %i." % self.port)
    1.90          self.serve_forever()
    1.91  
    1.92 +class Request:
    1.93 +
    1.94 +    _request_types = {"help": []}
    1.95 +            
    1.96 +    def __init__(self, query):
    1.97 +        self.args = {}
    1.98 +        pos = query.find("?")
    1.99 +        if pos == -1:
   1.100 +            self.__class__ = WebRequest     
   1.101 +            self.args["doc"] = query
   1.102 +        else:
   1.103 +            com = query[:pos]
   1.104 +            arg_str = query[pos:]
   1.105 +            for t, args in _request_types:
   1.106 +                pass
   1.107 +
   1.108 +    def __str__(self):
   1.109 +        return "%s(%s)" % (str(self.__class__).partition(".")[-1].rstrip("'>"),
   1.110 +                           ", ".join(["%s: %s" % (k, str(v))
   1.111 +                                      for k, v in self.args.items()]))
   1.112 +
   1.113 +class WebRequest(Request):
   1.114 +
   1.115 +    def __call__(self):
   1.116 +        pass
   1.117 +
   1.118 +
   1.119  if __name__ == "__main__":
   1.120  	main()
   1.121