-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserver.py
More file actions
83 lines (62 loc) · 2.27 KB
/
server.py
File metadata and controls
83 lines (62 loc) · 2.27 KB
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
import socket
from concurrent.futures import ThreadPoolExecutor
HOST = "localhost"
PORT = 3021
executer = ThreadPoolExecutor(max_workers = 32)
routes = list()
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen()
def request_parser(request_raw):
lines = request_raw.split('\r\n')
method, uri, http_version = lines[0].split(' ')
return {
'method': method,
'uri': uri,
'http_version': http_version,
'message_body': lines[-1],
}
def response_builder(http_version, status_code, reason_phrase, message_body):
return f'''{http_version} {status_code} {reason_phrase}
{message_body}
'''
def response_handler(request):
for route in routes:
if route['path'] == request['uri'] and route['method'] == request['method']:
message_body = route['function'](request['message_body'])
return response_builder(request['http_version'], '200', 'OK', message_body)
return response_builder(request['http_version'], '404', 'Not Found', f'<h1>Seu {request["uri"]} com o método {request["method"]} não foi encontrado</h1>')
def handler_connection(connection, address):
request_raw = connection.recv(4096).decode('utf-8')
request = request_parser(request_raw)
response = response_handler(request)
connection.sendall(response.encode('utf-8'))
connection.close()
def route(path, method):
def wrapper(function):
routes.append({
'path': path,
'method': method,
'function': function,
})
return function
return wrapper
### --- Routes ---- ¨$&@*)#$
value = 'aopa!'
@route(path='/', method='GET')
def index(message_body):
return f'<h1>{value}</h1>'
@route(path='/photos', method='GET')
def photos(message_body):
return '<img src="https://w7.pngwing.com/pngs/921/373/png-transparent-kyary-pamyu-pamyu-youtube-funny-face-musician-meme-joke-musician-meme-girl-thumbnail.png"></img>'
@route(path='/echo', method='POST')
def echo(message_body):
return f'<h2>{message_body}</h2>'
@route(path='/', method='PUT')
def update(message_body):
global value
value = message_body
return 'Foi atualizado with sucesso'
while True:
conn, addr = s.accept()
executer.submit(handler_connection, conn, addr)