-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
112 lines (92 loc) · 3.43 KB
/
main.py
File metadata and controls
112 lines (92 loc) · 3.43 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
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
import mimetypes
import pathlib
from http.server import HTTPServer, BaseHTTPRequestHandler
import urllib.parse
from datetime import datetime
import socket
import json
import socketserver
import threading
class HttpHandler(BaseHTTPRequestHandler):
def do_GET(self):
pr_url = urllib.parse.urlparse(self.path)
if pr_url.path == '/':
self.send_html_file('index.html')
elif pr_url.path == '/message':
self.send_html_file('message.html')
else:
if pathlib.Path().joinpath(pr_url.path[1:]).exists():
self.send_static()
else:
self.send_html_file('error.html', 404)
def do_POST(self):
data = self.rfile.read(int(self.headers['Content-Length']))
data_parse = urllib.parse.unquote_plus(data.decode())
data_dict = {
str(datetime.now()): {key: value for key, value in [el.split('=') for el in data_parse.split('&')]}}
self.send_response(302)
self.send_header('Location', '/')
self.end_headers()
send_to_socket_server(data_dict)
def send_html_file(self, filename, status=200):
self.send_response(status)
self.send_header('Content-type', 'text/html')
self.end_headers()
with open(filename, 'rb') as fd:
self.wfile.write(fd.read())
def send_static(self):
self.send_response(200)
mt = mimetypes.guess_type(self.path)
if mt:
self.send_header("Content-type", mt[0])
else:
self.send_header("Content-type", 'text/plain')
self.end_headers()
with open(f'.{self.path}', 'rb') as file:
self.wfile.write(file.read())
class SocketServerHandler(socketserver.BaseRequestHandler):
@staticmethod
def save_to_json_file(data_dict):
file_path = 'storage/data.json'
with open(file_path, 'r') as file:
try:
data = json.load(file)
except json.JSONDecodeError:
data = {}
data.update(data_dict)
with open(file_path, 'w') as file:
json.dump(data, file)
def handle(self):
data = self.request[0].decode('UTF-8')
try:
data_dict = json.loads(data)
self.save_to_json_file(data_dict)
except json.JSONDecodeError as e:
print(f'Error decoding JSON: {e}')
print(f'Received data: {data}')
def run_http_server(server_class=HTTPServer, handler_class=HttpHandler):
server_address = ('', 3000)
http = server_class(server_address, handler_class)
try:
http.serve_forever()
except KeyboardInterrupt:
http.server_close()
def run_socket_server(server_class=socketserver.UDPServer, handler_class=SocketServerHandler):
server_address = ('', 5000)
socket_server = server_class(server_address, handler_class)
try:
socket_server.serve_forever()
except KeyboardInterrupt:
socket_server.server_close()
def send_to_socket_server(data_dict):
server_address = ('localhost', 5000)
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as sock:
data = json.dumps(data_dict).encode('UTF-8')
sock.sendto(data, server_address)
if __name__ == '__main__':
http_thread = threading.Thread(target=run_http_server)
socket_thread = threading.Thread(target=run_socket_server)
http_thread.start()
socket_thread.start()
http_thread.join()
socket_thread.join()