summaryrefslogtreecommitdiff
path: root/day9/task5/server.py
blob: d9fdc783a013a294492de0b0a9221eb7e0dfd60e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
from http.server import HTTPServer, BaseHTTPRequestHandler
from urllib.parse import parse_qs

from router import run
from utils import HTTP_STATUS_CODES


class MyHTTPRequestHandler(BaseHTTPRequestHandler):
    def _set_response(self, code):
        self.send_response(code)
        self.send_header('Content-type', 'text/html')
        self.end_headers()

    def do_GET(self):
        self.finalize_request(run({
            'url': self.path,
            'method': 'GET',
            'query': {}
        }))

    def do_POST(self):
        content_length = int(self.headers['Content-Length'])
        post_data = parse_qs(self.rfile.read(content_length).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)
            response = f'<center><h1>ERROR {response} {HTTP_STATUS_CODES[response].upper()}</h1></center>'
        else:
            self._set_response(200)

        self.wfile.write(response.encode('utf-8'))


def start_server(host, port):
    server_address = (host, port)
    httpd = HTTPServer(server_address, MyHTTPRequestHandler)
    httpd.serve_forever()