summaryrefslogtreecommitdiff
path: root/day9/task5_vue/backend/server.py
diff options
context:
space:
mode:
Diffstat (limited to 'day9/task5_vue/backend/server.py')
-rw-r--r--day9/task5_vue/backend/server.py73
1 files changed, 73 insertions, 0 deletions
diff --git a/day9/task5_vue/backend/server.py b/day9/task5_vue/backend/server.py
new file mode 100644
index 0000000..48d5946
--- /dev/null
+++ b/day9/task5_vue/backend/server.py
@@ -0,0 +1,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()