about summary refs log tree commit diff
diff options
context:
space:
mode:
authorUltraQbik <no1skill@yandex.ru>2024-08-22 22:38:08 +0300
committerUltraQbik <no1skill@yandex.ru>2024-08-22 22:38:08 +0300
commit422e9c74b070ee82d225c0ef17193b295907e0b5 (patch)
tree6f021abfa64ed2fb9efe64427c8cda9f073c63ee
parent832f86f4697f314d296264bfb7b8e485a560bf55 (diff)
downloadhttpy-422e9c74b070ee82d225c0ef17193b295907e0b5.tar.gz
httpy-422e9c74b070ee82d225c0ef17193b295907e0b5.zip
Update things slightly
-rw-r--r--main.py23
-rw-r--r--src/APIv1.py10
-rw-r--r--src/socks.py9
3 files changed, 30 insertions, 12 deletions
diff --git a/main.py b/main.py
index 9ff95e6..dc9f97d 100644
--- a/main.py
+++ b/main.py
@@ -132,6 +132,7 @@ class HTTPServer:
 
             # if socket was closed -> break
             except OSError as e:
+                print(e)
                 print("Closed.")
                 break
 
@@ -144,6 +145,8 @@ class HTTPServer:
         Handles client's connection
         """
 
+        loop = asyncio.get_event_loop()
+
         while True:
             # receive request from client
             raw_request = await self._recvall(client)
@@ -211,9 +214,10 @@ class HTTPServer:
         # if it's an API request
         elif (api_version := request.path.split("/")[1]) in API_VERSIONS:
             data = b''
+            headers = {}
             match api_version:
                 case "APIv1":
-                    status, data = await APIv1.respond(client, request)
+                    status, data, headers = await APIv1.respond(client, request)
                 case _:
                     status = 400
 
@@ -223,7 +227,7 @@ class HTTPServer:
                 return
 
             # send data if no error
-            await HTTPServer._send(client, status, data)
+            await HTTPServer._send(client, status, data, headers)
 
             # return after answer
             return
@@ -279,7 +283,7 @@ class HTTPServer:
             byte_header += f"{key}: {value}\r\n".encode("ascii")
 
         # send response to the client
-        await ssl_sock_sendall(
+        await asyncio.get_event_loop().create_task(ssl_sock_sendall(
             client,
             b'HTTP/1.1 ' +
             get_response_code(response) +
@@ -287,7 +291,18 @@ class HTTPServer:
             byte_header +  # if empty, we'll just get b'\r\n\r\n'
             b'\r\n' +
             data
-        )
+        ))
+
+        # # send response to the client
+        # await ssl_sock_sendall(
+        #     client,
+        #     b'HTTP/1.1 ' +
+        #     get_response_code(response) +
+        #     b'\r\n' +
+        #     byte_header +  # if empty, we'll just get b'\r\n\r\n'
+        #     b'\r\n' +
+        #     data
+        # )
 
     def _close_client(self, client: socket.socket):
         """
diff --git a/src/APIv1.py b/src/APIv1.py
index a3254aa..7304e87 100644
--- a/src/APIv1.py
+++ b/src/APIv1.py
@@ -59,7 +59,7 @@ def decode_size(size: str) -> int:
     return size
 
 
-async def respond(client: SSLSocket, request: Request) -> tuple[int, bytes]:
+async def respond(client: SSLSocket, request: Request) -> tuple[int, bytes, dict]:
     """
     Respond to clients API request
     """
@@ -78,10 +78,10 @@ async def respond(client: SSLSocket, request: Request) -> tuple[int, bytes]:
 
             # check size
             if size < API_FILE_RANDOM_MIN_SIZE_LIMIT or size > API_FILE_RANDOM_MAX_SIZE_LIMIT:
-                return 400, b''
+                return 400, b'', {}
 
-            return 200, random_data_gen(size)
+            return 200, random_data_gen(size), {}
         else:
-            return 400, b''
+            return 400, b'', {}
     else:
-        return 400, b''
+        return 400, b'', {}
diff --git a/src/socks.py b/src/socks.py
index 119a62a..bcb76c0 100644
--- a/src/socks.py
+++ b/src/socks.py
@@ -1,18 +1,21 @@
-import time
+import asyncio
 from ssl import SSLSocket
 
 
+_SOCK_TIME_DELAY = 1.e-3
+
+
 async def ssl_sock_accept(sock: SSLSocket) -> tuple[SSLSocket, str]:
     while True:
         try:
             return sock.accept()
         except BlockingIOError:
-            time.sleep(1.e-3)
+            await asyncio.sleep(_SOCK_TIME_DELAY)
 
 
 async def ssl_sock_recv(sock: SSLSocket, buflen: int = 1024):
     while (msg := sock.recv(buflen)) == b'':
-        time.sleep(1.e-3)
+        await asyncio.sleep(_SOCK_TIME_DELAY)
     return msg