From 1c830f9d95117cdafd3840f4590b9d1fdb87f04f Mon Sep 17 00:00:00 2001 From: UltraQbik Date: Wed, 28 Aug 2024 19:56:59 +0300 Subject: Add proper logging Now any exception that is not related to sockets will be logged Threads should still clear themselves even after exception --- main.py | 48 +++++++++++++++++++++++++++--------------------- 1 file 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()) -- cgit 1.4.1