-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserver.py
124 lines (113 loc) · 5.59 KB
/
server.py
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
import json
import sys
import urllib
import urllib.parse
from decimal import Decimal
from http.server import BaseHTTPRequestHandler
from urllib.parse import urlparse, parse_qs
from urllib.parse import unquote
from loguru import logger
import router.router
from controller.currencies_controller import CurrenciesController
from controller.currency_controller import CurrencyController
from controller.rate_controller import RateController
from controller.rates_controller import RatesController
from service.service import ServiceExchange
logger.add(sys.stdout, format="{time} {level} {message}", level="DEBUG", serialize=True)
logger.info('Server Started')
class Server(BaseHTTPRequestHandler):
def do_OPTIONS(self):
self.send_response(204)
self.send_header('Access-Control-Allow-Methods', 'GET,POST,PUT,PATCH,OPTIONS')
self.send_header('Access-Control-Max-Age', '1728000')
self.send_header('Access-Control-Allow-Origin', '*')
self.send_header('Access-Control-Allow-Headers', 'Content-Type, Accept')
self.send_header('Content-Type', 'application/json')
self.send_header('X-Content-Type-Options', 'nosniff')
self.send_header("Cache-Control", "no-cache")
self.end_headers()
def send_error_response(self, error_response):
error_code = list(error_response.keys())[0]
error_message = error_response[error_code]
self.send_response(error_code)
self.send_header('Content-type', 'application/json')
self.send_header('Access-Control-Allow-Origin', '*')
self.send_header('X-Content-Type-Options', 'nosniff')
self.send_header("Cache-Control", "no-cache")
self.end_headers()
response_message = {'message': error_message}
response_body = json.dumps(response_message).encode('utf-8')
self.wfile.write(response_body)
@logger.catch
def do_GET(self):
logger.info('GET request')
parsed_url = urlparse(self.path)
path = parsed_url.path.split('/')[1]
if path in router.router.routes:
handler_class = router.router.routes[path]
if isinstance(handler_class(), (RatesController, CurrenciesController)):
response = handler_class.do_GET(self)
if isinstance(handler_class(), (RateController, CurrencyController)):
code = parsed_url.path.split('/')[-1]
response = handler_class.do_GET(self, code)
if isinstance(handler_class(), ServiceExchange):
query = parsed_url.query
query_params = parse_qs(query)
from_currency = query_params['from'][0]
to_currency = query_params['to'][0]
amount = float(Decimal(query_params['amount'][0]))
response = handler_class.do_GET(self, from_currency, to_currency, amount)
if len(response) == 1:
self.send_error_response(response)
else:
self.send_response(200)
self.send_header('Access-Control-Allow-Origin', '*')
self.send_header('Content-Type', 'application/json')
self.send_header('X-Content-Type-Options', 'nosniff')
self.send_header("Cache-Control", "no-cache")
self.end_headers()
self.wfile.write(json.dumps(response).encode('utf-8'))
@logger.catch
def do_POST(self):
content_type = self.headers.get('Content-Type')
if content_type.startswith('application/x-www-form-urlencoded'):
content_length = int(self.headers.get('Content-Length', 0))
post_data = self.rfile.read(content_length).decode('utf-8')
post_data_dict = dict(urllib.parse.parse_qsl(post_data))
if self.path == '/exchangeRates':
rates_obj = RatesController()
response = rates_obj.do_POST(post_data_dict)
if self.path == '/currencies':
currencies_obj = CurrenciesController()
response = currencies_obj.do_POST(post_data_dict)
if len(response) == 1:
self.send_error_response(response)
else:
self.send_response(201)
self.send_header('Access-Control-Allow-Origin', '*')
self.send_header('Content-Type', 'application/json')
self.send_header('X-Content-Type-Options', 'nosniff')
self.send_header("Cache-Control", "no-cache")
self.end_headers()
self.wfile.write(json.dumps(response).encode('utf-8'))
def do_PATCH(self):
content_length = int(self.headers['Content-Length'])
post_data = self.rfile.read(content_length).decode('utf-8')
post_data_dict = dict(urllib.parse.parse_qsl(post_data))
parsed_url = urlparse(self.path)
path = parsed_url.path.split('/')[1]
if path in router.router.routes:
handler_class = router.router.routes[path]
if isinstance(handler_class(), RateController):
name_currencies = unquote(parsed_url.path.split('/')[-1]).replace('%20', ' ')
response = handler_class.do_PATCH(self, name_currencies, post_data_dict)
if len(response) == 1:
self.send_error_response(response)
else:
self.send_response(201)
self.send_header('Access-Control-Allow-Origin', '*')
self.send_header('Content-Type', 'application/json')
self.send_header('X-Content-Type-Options', 'nosniff')
self.send_header("Cache-Control", "no-cache")
self.end_headers()
self.wfile.write(json.dumps(response).encode('utf-8'))