about summary refs log tree commit diff
diff options
context:
space:
mode:
authorUltraQbik <no1skill@yandex.ru>2024-08-28 19:56:59 +0300
committerUltraQbik <no1skill@yandex.ru>2024-08-28 19:56:59 +0300
commit1c830f9d95117cdafd3840f4590b9d1fdb87f04f (patch)
treeb0dc0a1133cc06bf4553b0c537c3f24c94971e39
parentb557d5266b61cfd105e322ca3f0a46cb68412053 (diff)
downloadhttpy-1c830f9d95117cdafd3840f4590b9d1fdb87f04f.tar.gz
httpy-1c830f9d95117cdafd3840f4590b9d1fdb87f04f.zip
Add proper logging
Now any exception that is not related to sockets will be logged

Threads should still clear themselves even after exception
-rw-r--r--main.py48
1 files changed, 27 insertions, 21 deletions
diff --git a/main.py b/main.py
index e6a7b9f..3c7a1fe 100644
--- a/main.py
+++ b/main.py
@@ -9,7 +9,6 @@ import signal
 import logging
 import argparse
 import threading
-import traceback
 from src import APIv1
 from src import file_man
 from src.config import *
@@ -19,6 +18,16 @@ from src.status_code import *
 # typing
 _usocket = socket.socket | ssl.SSLSocket
 
+# logging
+logging.basicConfig(
+    level=logging.INFO,
+    format="%(asctime)s [%(levelname)s] %(message)s",
+    handlers=[
+        logging.FileHandler("runtime.log"),
+        logging.StreamHandler()
+    ]
+)
+
 # parser
 _parser = argparse.ArgumentParser(
     prog="httpy",
@@ -50,17 +59,6 @@ _parser.add_argument("-v", "--verbose",
                      action="store_true")
 ARGS = _parser.parse_args()
 
-# logging
-logging.basicConfig(
-    level=logging.INFO,
-    format="%(asctime)s [%(levelname)s] %(message)s",
-    handlers=[
-        logging.FileHandler("runtime.log"),
-        logging.StreamHandler()
-    ]
-)
-
-
 class HTTPServer:
     """
     The mightier HTTP server!
@@ -125,18 +123,23 @@ class HTTPServer:
         self.sock.setblocking(False)
         self.sock.listen()
 
-        # listen and respond handler
-        while not self.stop_event.is_set():
-            # accept new client
+        def _accept_client():
             client = self._accept()
             if client is None:
-                continue
+                return
 
             # create thread for new client and append it to the list
             th = threading.Thread(target=self._client_thread, args=[client])
             self.client_threads.append(th)
             th.start()
 
+        # loop
+        while not self.stop_event.is_set():
+            try:
+                _accept_client()
+            except Exception as e:
+                logging.warning(f"ignoring exception:", exc_info=e)
+
         # close server socket
         self.sock.close()
 
@@ -147,11 +150,14 @@ class HTTPServer:
         """
 
         self.semaphore.acquire()
-        client.setblocking(False)
-        request = self._recv_request(client)
-        # logging.info(f"ip: {client.getpeername()[0]}\n{request}")
-        if request is not None:
-            self._client_request_handler(client, request)
+
+        try:
+            client.setblocking(False)
+            request = self._recv_request(client)
+            if request is not None:
+                self._client_request_handler(client, request)
+        except Exception as e:
+            logging.warning("ignoring error:", exc_info=e)
 
         # Remove self from thread list and close the connection
         self.client_threads.remove(threading.current_thread())