from http.server import BaseHTTPRequestHandler, HTTPServer import importlib # module = importlib.import_module('controlers') import controleurs base_html = """ Mini-Serveur {body} """ # HTTPRequestHandler class class MiniHTTPServerRequestHandler(BaseHTTPRequestHandler): paths = { "/": "HomeController", "/login": "LoginController", "/register": "RegisterController" } # GET def do_GET(self): if not self.path in self.paths.keys(): self.send_response(404) self.end_headers() return controller_class = self.paths[self.path] print(controller_class) class_ = getattr(controleurs, controller_class) instance = class_() html = instance.do_GET() # Send response status code self.send_response(200) # Send headers self.send_header('Content-type','text/html') self.end_headers() # Send message back to client message = base_html.replace("{body}", html) # Write content as utf-8 data self.wfile.write(bytes(message, "utf8")) return # POST: copier-coller en grande partie de do_GET: # - on a ajouté deux lignes au début # - on renvoie au client ce qu'il nous a envoyé (message = post_body) def do_POST(self): if not self.path in self.paths.keys(): self.send_response(404) self.end_headers() return # Cette ligne récupère le(s) header(s) content-length # Même s'il n'y en a qu'un, get_all() renvoie une liste d'un élément content_len_headers = self.headers.get_all('content-length') # Si cette liste est vide, on ne peut pas continuer, car on ne sait pas combien # d'octets on doit lire : on renvoie une réponse avec code 400 (Bad Request) if not content_len_headers: self.send_response(400) self.end_headers() return # On convertit en entier la valeur string contenue dans le header content-type content_len = int(content_len_headers[0]) # On lit ce nombre d'octets dans la requête post_body = self.rfile.read(content_len) # On convertit en chaîne le body body_str = str(post_body, 'utf-8') controller_class = self.paths[self.path] print(controller_class) class_ = getattr(controleurs, controller_class) instance = class_() html = instance.do_POST(body_str) # Send response status code self.send_response(200) # Send headers self.send_header('Content-type','text/html') self.end_headers() # On renvoie cela tel quel au client message = base_html.replace("{body}", html) # Write content as utf-8 data self.wfile.write(bytes(message, "utf8")) return def run(): print('starting server...') # Server settings # Choose port 8080, for port 80, which is normally used for a http server, you need root access server_address = ('127.0.0.1', 8081) httpd = HTTPServer(server_address, MiniHTTPServerRequestHandler) print('running server...') httpd.serve_forever() run()