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') 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