diff options
| author | Qubik <89706156+UltraQbik@users.noreply.github.com> | 2024-08-23 20:27:27 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-08-23 20:27:27 +0200 |
| commit | 9aca00d7265b9d05f908b4201a03b7b0808c5ca1 (patch) | |
| tree | 47346be37cc68fc18aa8e5603eef58a48d9b2e04 /src | |
| parent | a96b13f6816ca0657d9f65097b97d0e87e1a0366 (diff) | |
| parent | fd8c46cac1c914851613cac425d2afe68d360d9d (diff) | |
| download | httpy-9aca00d7265b9d05f908b4201a03b7b0808c5ca1.tar.gz httpy-9aca00d7265b9d05f908b4201a03b7b0808c5ca1.zip | |
Merge pull request #2 from UltraQbik/threading-rewrite
Threading rewrite
Diffstat (limited to 'src')
| -rw-r--r-- | src/APIv1.py | 22 | ||||
| -rw-r--r-- | src/request.py | 25 | ||||
| -rw-r--r-- | src/status_code.py | 34 |
3 files changed, 69 insertions, 12 deletions
diff --git a/src/APIv1.py b/src/APIv1.py index db8c4f3..f163c5b 100644 --- a/src/APIv1.py +++ b/src/APIv1.py @@ -1,6 +1,6 @@ import random -from ssl import SSLSocket -from src.request import Request +from src.request import * +from src.status_code import * API_FILE_RANDOM_MIN_SIZE_LIMIT = 1 @@ -59,29 +59,27 @@ def decode_size(size: str) -> int: return size -def respond(client: SSLSocket, request: Request) -> tuple[int, bytes, dict]: +def api_call(client: SSLSocket, request: Request) -> Response: """ Respond to clients API request """ # decode API request - split_path = request.path.split("/") - api_level1 = split_path[2] - api_request = split_path[3] + split_path = request.path.split("/", maxsplit=16)[1:] # do something with it (oh god) - if api_level1 == "file": - if api_request == "random": + if len(split_path) > 1 and split_path[1] == "file": + if len(split_path) > 2 and split_path[2] == "random": # get size size_str = request.path_args.get("size", "16mib") size = decode_size(size_str) # check size if size < API_FILE_RANDOM_MIN_SIZE_LIMIT or size > API_FILE_RANDOM_MAX_SIZE_LIMIT: - return 400, b'', {} + return Response(b'', STATUS_CODE_BAD_REQUEST) - return 200, random_data_gen(size), {} + return Response(random_data_gen(size), STATUS_CODE_OK, compress=False) else: - return 400, b'', {} + return Response(b'', STATUS_CODE_BAD_REQUEST) else: - return 400, b'', {} + return Response(b'', STATUS_CODE_BAD_REQUEST) diff --git a/src/request.py b/src/request.py index 0437dfd..003783a 100644 --- a/src/request.py +++ b/src/request.py @@ -1,3 +1,8 @@ +from typing import Any +from ssl import SSLSocket +from src.status_code import StatusCode + + class Request: """ Just a request @@ -54,3 +59,23 @@ class Request: def __str__(self): 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, **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() + self.compress: bool = kwargs.get("compress", True) diff --git a/src/status_code.py b/src/status_code.py new file mode 100644 index 0000000..a63712c --- /dev/null +++ b/src/status_code.py @@ -0,0 +1,34 @@ +class StatusCode: + """ + HTML status code + """ + + def __init__(self, code: int, message: str): + self._code: int = code + self._message: str = message + + def __bytes__(self): + return f"{self._code} {self._message}".encode("ascii") + + def __str__(self): + return f"{self._code} {self._message}" + + @property + def code(self): + return self._code + + @property + def message(self): + return self._message + + +# Status codes! +STATUS_CODE_OK = StatusCode(200, "OK") +STATUS_CODE_BAD_REQUEST = StatusCode(400, "Bad Request") +STATUS_CODE_UNAUTHORIZED = StatusCode(401, "Unauthorized") +STATUS_CODE_FORBIDDEN = StatusCode(403, "Forbidden") +STATUS_CODE_NOT_FOUND = StatusCode(404, "Not Found") +STATUS_CODE_PAYLOAD_TOO_LARGE = StatusCode(413, "Payload Too Large") +STATUS_CODE_URI_TOO_LONG = StatusCode(414, "URI Too Long") +STATUS_CODE_IM_A_TEAPOT = StatusCode(418, "I'm a teapot") # I followed mozilla's dev page, it was there +STATUS_CODE_FUNNY_NUMBER = StatusCode(6969, "UwU") |