From 82178d2facb95ee953ab1e97f5ee15f94b1d3472 Mon Sep 17 00:00:00 2001 From: UltraQbik Date: Fri, 23 Aug 2024 17:39:20 +0300 Subject: Basic responses working --- src/request.py | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) (limited to 'src/request.py') diff --git a/src/request.py b/src/request.py index 0437dfd..d9e8a86 100644 --- a/src/request.py +++ b/src/request.py @@ -1,3 +1,10 @@ +import gzip +import brotli +from typing import Any +from ssl import SSLSocket +from src.status_code import StatusCode + + class Request: """ Just a request @@ -54,3 +61,36 @@ class Request: def __str__(self): return '\n'.join([f"{key}: {val}" for key, val in self.__dict__.items()]) + + +def send_response(sock: SSLSocket, data: bytes, status: StatusCode, headers: dict[str, Any] = None): + """ + Sends response to client. + Probably ran inside a daemonic thread + :param sock: client's socket + :param data: raw data to send + :param status: status code + :param headers: headers to include + """ + + # process header data + if headers is None: + headers = dict() + if headers.get("Content-Encoding") is not None: + if headers["Content-Encoding"] == "br": + data = brotli.compress(data) + elif headers["Content-Encoding"] == "gzip": + data = gzip.compress(data) + if headers.get("Content-Length") is None: + headers["Content-Length"] = len(data) + if headers.get("Connection") is None: + headers["Connection"] = "close" + + # generate basic message + message = b'HTTP/1.1 ' + status.__bytes__() + b'\r\n' + for key, value in headers.items(): + message += f"{key}: {value}\r\n".encode("ascii") + message += b'\r\n' + data + + # send message + sock.sendall(message) -- cgit 1.4.1 From 0169a1834d9cd228fb2ee2810eee9599748b3b67 Mon Sep 17 00:00:00 2001 From: UltraQbik Date: Fri, 23 Aug 2024 20:17:43 +0300 Subject: Add response --- src/request.py | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'src/request.py') diff --git a/src/request.py b/src/request.py index d9e8a86..b0fb13f 100644 --- a/src/request.py +++ b/src/request.py @@ -63,6 +63,17 @@ class Request: return '\n'.join([f"{key}: {val}" for key, val in self.__dict__.items()]) +class Response: + """ + Server response + """ + + def __init__(self, data: bytes, status: StatusCode, headers: dict[str, Any] = None): + self.data: bytes = data + self.status: StatusCode = status + self.headers: dict[str, Any] = headers if headers is not None else dict() + + def send_response(sock: SSLSocket, data: bytes, status: StatusCode, headers: dict[str, Any] = None): """ Sends response to client. -- cgit 1.4.1 From fb24bdfccedcc95e9cdfb97db375120933bb451c Mon Sep 17 00:00:00 2001 From: UltraQbik Date: Fri, 23 Aug 2024 21:05:56 +0300 Subject: remove useless code --- src/request.py | 35 +---------------------------------- 1 file changed, 1 insertion(+), 34 deletions(-) (limited to 'src/request.py') diff --git a/src/request.py b/src/request.py index b0fb13f..889b894 100644 --- a/src/request.py +++ b/src/request.py @@ -71,37 +71,4 @@ class Response: def __init__(self, data: bytes, status: StatusCode, headers: dict[str, Any] = None): self.data: bytes = data self.status: StatusCode = status - self.headers: dict[str, Any] = headers if headers is not None else dict() - - -def send_response(sock: SSLSocket, data: bytes, status: StatusCode, headers: dict[str, Any] = None): - """ - Sends response to client. - Probably ran inside a daemonic thread - :param sock: client's socket - :param data: raw data to send - :param status: status code - :param headers: headers to include - """ - - # process header data - if headers is None: - headers = dict() - if headers.get("Content-Encoding") is not None: - if headers["Content-Encoding"] == "br": - data = brotli.compress(data) - elif headers["Content-Encoding"] == "gzip": - data = gzip.compress(data) - if headers.get("Content-Length") is None: - headers["Content-Length"] = len(data) - if headers.get("Connection") is None: - headers["Connection"] = "close" - - # generate basic message - message = b'HTTP/1.1 ' + status.__bytes__() + b'\r\n' - for key, value in headers.items(): - message += f"{key}: {value}\r\n".encode("ascii") - message += b'\r\n' + data - - # send message - sock.sendall(message) + self.headers: dict[str, Any] = headers if headers is not None else dict() \ No newline at end of file -- cgit 1.4.1 From a37413d9077a6ae6c711a4583b269251a42d9257 Mon Sep 17 00:00:00 2001 From: UltraQbik Date: Fri, 23 Aug 2024 21:10:51 +0300 Subject: Update response class --- src/request.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'src/request.py') diff --git a/src/request.py b/src/request.py index 889b894..28d7c14 100644 --- a/src/request.py +++ b/src/request.py @@ -68,7 +68,8 @@ class Response: Server response """ - def __init__(self, data: bytes, status: StatusCode, headers: dict[str, Any] = None): + def __init__(self, data: bytes, status: StatusCode, headers: dict[str, Any] = None, **kwargs): self.data: bytes = data self.status: StatusCode = status - self.headers: dict[str, Any] = headers if headers is not None else dict() \ No newline at end of file + self.headers: dict[str, Any] = headers if headers is not None else dict() + self.compress: bool = kwargs.get("compress", False) -- cgit 1.4.1 From e9f7ae54d64be673117e4cabe32badd01048bb69 Mon Sep 17 00:00:00 2001 From: UltraQbik Date: Fri, 23 Aug 2024 21:11:20 +0300 Subject: Update API and response class --- src/APIv1.py | 2 +- src/request.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'src/request.py') diff --git a/src/APIv1.py b/src/APIv1.py index c9ba2da..f163c5b 100644 --- a/src/APIv1.py +++ b/src/APIv1.py @@ -78,7 +78,7 @@ def api_call(client: SSLSocket, request: Request) -> Response: if size < API_FILE_RANDOM_MIN_SIZE_LIMIT or size > API_FILE_RANDOM_MAX_SIZE_LIMIT: return Response(b'', STATUS_CODE_BAD_REQUEST) - return Response(random_data_gen(size), STATUS_CODE_OK) + return Response(random_data_gen(size), STATUS_CODE_OK, compress=False) else: return Response(b'', STATUS_CODE_BAD_REQUEST) else: diff --git a/src/request.py b/src/request.py index 28d7c14..df0d433 100644 --- a/src/request.py +++ b/src/request.py @@ -72,4 +72,4 @@ class Response: self.data: bytes = data self.status: StatusCode = status self.headers: dict[str, Any] = headers if headers is not None else dict() - self.compress: bool = kwargs.get("compress", False) + self.compress: bool = kwargs.get("compress", True) -- cgit 1.4.1 From 9b5c0ee8f79b24a0a269be2a9984dc09244fd278 Mon Sep 17 00:00:00 2001 From: UltraQbik Date: Fri, 23 Aug 2024 21:12:25 +0300 Subject: Update docs --- src/request.py | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'src/request.py') diff --git a/src/request.py b/src/request.py index df0d433..79c545a 100644 --- a/src/request.py +++ b/src/request.py @@ -69,6 +69,14 @@ class Response: """ def __init__(self, data: bytes, status: StatusCode, headers: dict[str, Any] = None, **kwargs): + """ + + :param data: response data + :param status: response status code + :param headers: headers to include + :param kwarg: compress - whether to compress data or not + """ + self.data: bytes = data self.status: StatusCode = status self.headers: dict[str, Any] = headers if headers is not None else dict() -- cgit 1.4.1 From fd8c46cac1c914851613cac425d2afe68d360d9d Mon Sep 17 00:00:00 2001 From: UltraQbik Date: Fri, 23 Aug 2024 21:27:04 +0300 Subject: Remove some things --- src/request.py | 2 -- 1 file changed, 2 deletions(-) (limited to 'src/request.py') diff --git a/src/request.py b/src/request.py index 79c545a..003783a 100644 --- a/src/request.py +++ b/src/request.py @@ -1,5 +1,3 @@ -import gzip -import brotli from typing import Any from ssl import SSLSocket from src.status_code import StatusCode -- cgit 1.4.1