From 742d62aa71a58e765e9888d71238bb6cd1b31a77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=B2=D0=B0=D0=BD=20=D0=A1=D0=BE=D0=BB=D0=BD=D1=86?= =?UTF-8?q?=D0=B5=D0=B2?= Date: Sat, 30 Dec 2023 15:45:47 +0300 Subject: [PATCH] Create Response class --- .gitignore | 1 + __main__.py | 62 +++++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 52 insertions(+), 11 deletions(-) diff --git a/.gitignore b/.gitignore index fc6fa6e..b8c0a98 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ +__pycache__/ *.log *.swp diff --git a/__main__.py b/__main__.py index 965fc9f..415030f 100755 --- a/__main__.py +++ b/__main__.py @@ -9,6 +9,32 @@ import config MAX_REQLINE = 64 * 1024 +STATUS_CODE = { + 200: "OK", + 404: "Not Found", + 500: "Internal Server Error", +} + + +class Response: + def __init__(self, status_code=200, additional_headers={}, data=None): + self.status_code = status_code + self.additional_headers = additional_headers + self.data = data + + def get(self): + resp = f"HTTP/1.1 {self.status_code} {STATUS_CODE[self.status_code]}\r\n" + resp += "Server: cnserv\r\n" + resp += "Connection: close\r\n" + resp += "\r\n" + + resp = resp.encode("UTF-8") + + if self.data: + resp += self.data + + return resp + class HTTPHandler: http_type = "" @@ -72,10 +98,10 @@ class HTTPHandler: else: decoded_data = raw.decode("UTF-8").rstrip("\r\n") decoded_data_split = decoded_data.split(":", 1) - self.headers.update({decoded_data_split[0]: decoded_data_split[1]}) + self.headers.update({decoded_data_split[0]: decoded_data_split[1].strip(" ")}) def http_data_handle(self): - # Get from headers Content-Length and get body from request + # TODO: Get from headers Content-Length and get body from request """ raw = self.read_fb.readline(1024) @@ -90,21 +116,35 @@ class HTTPHandler: raw = self.read_fb.readline(1024) """ - print(self.http_type) - print(self.http_address) - print(self.headers) - print(self.data) + logging.debug(self.http_type) + logging.debug(self.http_address) + logging.debug(self.headers) + logging.debug(self.data) self.send_form_data() def send_form_data(self): - if self.http_address == "/" and self.http_type == "GET": - self.write_fb.write(b"HTTP/1.1 200 OK\r\nConnection: close\r\nServer: cnserv\r\n\r\nTested!") + if self.http_type == "GET": + if self.http_address == "/": + r = Response(data=b"Tested!") + self.write_fb.write(r.get()) + + elif self.http_address == "/server-status": + form_data = "{\"server-name\": \"cnserv\", \"state\": \"running\"}" + r = Response(data=form_data.encode("UTF-8")) + self.write_fb.write(r.get()) + + else: + form_data = "Not found!" + r = Response(status_code=404, data=form_data.encode("UTF-8")) + self.write_fb.write(r.get()) + self.write_fb.flush() - self.write_fb.close() - self.read_fb.close() - self.conn.close() + self.write_fb.close() + self.read_fb.close() + self.conn.close() + if __name__ == "__main__": logging.basicConfig(filename="main.log", filemode="a", encoding="UTF-8",