diff options
| author | UltraQbik <no1skill@yandex.ru> | 2024-08-22 22:38:08 +0300 |
|---|---|---|
| committer | UltraQbik <no1skill@yandex.ru> | 2024-08-22 22:38:08 +0300 |
| commit | 422e9c74b070ee82d225c0ef17193b295907e0b5 (patch) | |
| tree | 6f021abfa64ed2fb9efe64427c8cda9f073c63ee | |
| parent | 832f86f4697f314d296264bfb7b8e485a560bf55 (diff) | |
| download | httpy-422e9c74b070ee82d225c0ef17193b295907e0b5.tar.gz httpy-422e9c74b070ee82d225c0ef17193b295907e0b5.zip | |
Update things slightly
| -rw-r--r-- | main.py | 23 | ||||
| -rw-r--r-- | src/APIv1.py | 10 | ||||
| -rw-r--r-- | src/socks.py | 9 |
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 |