about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorQubik <89706156+UltraQbik@users.noreply.github.com>2024-08-23 20:27:27 +0200
committerGitHub <noreply@github.com>2024-08-23 20:27:27 +0200
commit9aca00d7265b9d05f908b4201a03b7b0808c5ca1 (patch)
tree47346be37cc68fc18aa8e5603eef58a48d9b2e04 /src
parenta96b13f6816ca0657d9f65097b97d0e87e1a0366 (diff)
parentfd8c46cac1c914851613cac425d2afe68d360d9d (diff)
downloadhttpy-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.py22
-rw-r--r--src/request.py25
-rw-r--r--src/status_code.py34
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")