summaryrefslogtreecommitdiff
path: root/day9/task5_vue/backend/server.py
blob: 48d5946ff8aadd970bb519f5b31caf1b4f1b4752 (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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
from http.server import HTTPServer, BaseHTTPRequestHandler
from urllib.parse import parse_qs

from backend.router import run
from backend.utils import parse_multipart_form

import logging
import json


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] in ['text/plain', 'application/x-www-form-urlencoded']:
            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
            }))

        elif content_type.split(';')[0] == 'application/json':
            self.finalize_request(run({
                'url': self.path,
                'method': 'POST',
                'query': json.loads(post_data.decode('utf-8'))
            }))

    def finalize_request(self, response):
        self._set_response(response.status_code, response.content_type)
        self.wfile.write(response.content)


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()