|
1 | | -import http.server |
2 | | -import urllib.parse |
3 | | -from http import HTTPStatus |
4 | | - |
| 1 | +from http.server import BaseHTTPRequestHandler, HTTPServer |
| 2 | +from urllib.parse import urlparse, parse_qs |
| 3 | +import json |
5 | 4 |
|
6 | 5 | class ControlMessage: |
7 | 6 | def __init__(self, text, number): |
8 | 7 | self.text = text |
9 | 8 | self.number = number |
10 | 9 |
|
| 10 | + def __str__(self): |
| 11 | + return f"Text: {self.text}, Number: {self.number}" |
11 | 12 |
|
12 | | -class AdminHandler(http.server.BaseHTTPRequestHandler): |
13 | | - def do_POST(self): |
14 | | - parsed_path = urllib.parse.urlparse(self.path) |
15 | | - if parsed_path.path == "/admin": |
16 | | - self.handle_admin_post() |
17 | | - else: |
18 | | - self.send_error(HTTPStatus.NOT_FOUND, "Not Found") |
19 | | - |
20 | | - def handle_admin_post(self): |
21 | | - content_length = int(self.headers.get("Content-Length", 0)) |
22 | | - post_data = self.rfile.read(content_length).decode("utf-8") |
23 | | - parsed_data = urllib.parse.parse_qs(post_data) |
24 | | - |
25 | | - text = parsed_data.get("text", [""])[0] |
26 | | - number = parsed_data.get("number", [None])[0] |
27 | | - |
28 | | - if not text or not number.isdigit(): |
29 | | - self.send_error(HTTPStatus.BAD_REQUEST, "Bad Request") |
30 | | - return |
31 | | - |
32 | | - message = ControlMessage(text, number) |
33 | | - process_message(message) |
34 | | - |
35 | | - self.send_response(HTTPStatus.OK) |
| 13 | +class RequestHandler(BaseHTTPRequestHandler): |
| 14 | + def do_GET(self): |
| 15 | + self.send_response(200) |
36 | 16 | self.send_header("Content-type", "text/plain") |
37 | 17 | self.end_headers() |
| 18 | + self.wfile.write(bytes("OK: It's a GET method or URL not in \"/admin\"", "utf-8")) |
38 | 19 |
|
39 | | -def process_message(message): |
40 | | - # Print the accepted control message |
41 | | - print("Accepted Control message, Text: {}, Number: {}".format( |
42 | | - message.text, message.number)) |
43 | | - |
| 20 | + def do_POST(self): |
| 21 | + if self.path.startswith("/admin"): |
| 22 | + content_length = int(self.headers.get("Content-Length", 0)) |
| 23 | + body = self.rfile.read(content_length).decode("utf-8") |
| 24 | + params = parse_qs(body) |
| 25 | + text = params.get("text", [None])[0] |
| 26 | + number = params.get("number", [None])[0] |
| 27 | + |
| 28 | + if text is None or number is None or not number.isdigit(): |
| 29 | + self.send_response(400) |
| 30 | + self.send_header("Content-type", "text/plain") |
| 31 | + self.end_headers() |
| 32 | + self.wfile.write(bytes("Bad Request", "utf-8")) |
| 33 | + return |
| 34 | + |
| 35 | + message = ControlMessage(text, int(number)) |
| 36 | + self.send_response(200) |
| 37 | + self.send_header("Content-type", "text/plain") |
| 38 | + self.end_headers() |
| 39 | + self.wfile.write(bytes(f"OK, Accepted Control message: {message}", "utf-8")) |
| 40 | + process_message(message) |
| 41 | + else: |
| 42 | + self.send_response(200) |
| 43 | + self.send_header("Content-type", "text/plain") |
| 44 | + self.end_headers() |
| 45 | + self.wfile.write(bytes("OK: It's a GET method or URL not in \"/admin\"", "utf-8")) |
44 | 46 |
|
45 | | -if __name__ == "__main__": |
46 | | - # Set up the server |
47 | | - server_address = ("", 3020) |
48 | | - admin_handler = AdminHandler |
| 47 | +def process_message(message): |
| 48 | + print(f"Accepted Control message: {message}") |
49 | 49 |
|
50 | | - httpd = http.server.HTTPServer(server_address, admin_handler) |
51 | | - print("Server is started at http://localhost:"+str(server_address[1])) |
| 50 | +def start_server(): |
| 51 | + host = "localhost" |
| 52 | + port = 3020 |
| 53 | + print(f"Server is started at http://{host}:{port}") |
52 | 54 |
|
53 | | - try: |
54 | | - # Start serving requests |
55 | | - httpd.serve_forever() |
56 | | - except KeyboardInterrupt: |
57 | | - pass |
| 55 | + server = HTTPServer((host, port), RequestHandler) |
| 56 | + server.serve_forever() |
58 | 57 |
|
59 | | - # Shut down the server |
60 | | - httpd.server_close() |
| 58 | +start_server() |
0 commit comments