from http.server import HTTPServer, BaseHTTPRequestHandler from urllib.parse import parse_qs from json import dumps from router import run from utils import HTTP_STATUS_CODES, parse_multipart_form import logging class MyHTTPRequestHandler(BaseHTTPRequestHandler): def _set_response(self, code, content_type): self.send_response(code) self.send_header('Content-type', content_type) self.end_headers() def do_GET(self): try: content_length = int(self.headers['Content-Length']) get_data = parse_qs(self.rfile.read(content_length).decode('utf-8')) except TypeError: get_data = {} for key in get_data: get_data[key] = get_data[key][0] self.finalize_request(run({ 'url': self.path, 'method': 'GET', 'query': get_data })) def do_POST(self): content_length = int(self.headers['Content-Length']) content_type = self.headers['Content-type'] post_data = self.rfile.read(content_length) if content_type.split(';')[0] == 'multipart/form-data': files = parse_multipart_form(post_data) self.finalize_request(run({ 'url': self.path, 'method': 'POST', 'query': {'files': files} })) elif content_type.split(';')[0] == 'text/plain': post_data = parse_qs(post_data.decode('utf-8')) for key in post_data: post_data[key] = post_data[key][0] self.finalize_request(run({ 'url': self.path, 'method': 'POST', 'query': post_data })) def finalize_request(self, response): if isinstance(response, int): self._set_response(response, 'text/html') response = f'

ERROR {response} {HTTP_STATUS_CODES[response].upper()}

'.encode('utf-8') elif isinstance(response, (dict, list)): self._set_response(200, 'application/json') response = dumps(response).encode('utf-8') elif isinstance(response, tuple): if response[0] == 'image': self._set_response(200, f'image/{response[1]}') response = response[2] elif response[0] in ['css', 'js']: self._set_response(200, f'text/{response[1]}') response = response[2].encode('utf-8') else: self._set_response(200, 'text/html') response = response.encode('utf-8') self.wfile.write(response) def start_server(host, port): server_address = (host, port) httpd = HTTPServer(server_address, MyHTTPRequestHandler) logging.getLogger('tableApp').info(f'Server started on {host}:{port}') httpd.serve_forever()