From edfdc94747a6b2ce59d110d9f8759c84aa7ea45f Mon Sep 17 00:00:00 2001 From: Arthur Bols Date: Thu, 25 Mar 2021 12:16:40 +0100 Subject: [PATCH] update --- client/response_handler.py | 2 +- httplib/exceptions.py | 23 ++++++++++++++++++++++- httplib/retriever.py | 2 -- server/RequestHandler.py | 13 ++++++++++++- server/worker.py | 13 +++++++------ 5 files changed, 42 insertions(+), 11 deletions(-) diff --git a/client/response_handler.py b/client/response_handler.py index 85acc10..cfedca7 100644 --- a/client/response_handler.py +++ b/client/response_handler.py @@ -239,7 +239,7 @@ class HTMLDownloadHandler(DownloadHandler): new_url = self.__download_image(tag["src"], host, base_url) processed[tag["src"]] = new_url if new_url: - tag["src"] = new_url + tag["src"] = os.path.basename(new_url) except Exception as e: logging.error("Failed to download image: %s, skipping...", tag["src"], exc_info=e) diff --git a/httplib/exceptions.py b/httplib/exceptions.py index 3765614..bbe62be 100644 --- a/httplib/exceptions.py +++ b/httplib/exceptions.py @@ -28,20 +28,41 @@ class IncompleteResponse(HTTPException): def __init(self, cause): self.cause = cause + class HTTPServerException(Exception): """ Base class for HTTP Server exceptions """ + status_code: str + message: str class BadRequest(HTTPServerException): """ Malformed HTTP request""" + status_code = 400 + message = "Bad Request" + class MethodNotAllowed(HTTPServerException): """ Method is not allowed """ + status_code = 405 + message = "Method Not Allowed" + def __init(self, allowed_methods): self.allowed_methods = allowed_methods + +class InternalServerError(HTTPServerException): + """ Internal Server Error """ + status_code = 500 + message = "Internal Server Error" + + class NotImplemented(HTTPServerException): """ Functionality not implemented """ + status_code = 501 + message = "Not Implemented" + class NotFound(HTTPServerException): - """ Resource not found """ \ No newline at end of file + """ Resource not found """ + status_code = 404 + message = "Not Found" diff --git a/httplib/retriever.py b/httplib/retriever.py index eaee0cf..eeaa736 100644 --- a/httplib/retriever.py +++ b/httplib/retriever.py @@ -97,8 +97,6 @@ class ContentLengthRetriever(Retriever): cur_payload_size += len(buffer) yield buffer - return b"" - class RawRetriever(Retriever): diff --git a/server/RequestHandler.py b/server/RequestHandler.py index cbd2b40..8070a99 100644 --- a/server/RequestHandler.py +++ b/server/RequestHandler.py @@ -78,7 +78,8 @@ class RequestHandler: def _has_body(self, headers): return "transfer-encoding" in headers or "content-encoding" in headers - def _get_date(self): + @staticmethod + def _get_date(): now = datetime.now() stamp = mktime(now.timetuple()) return format_date_time(stamp) @@ -114,3 +115,13 @@ class RequestHandler: logging.debug("Sending: %r", message) self.conn.conn.sendall(message) + + @staticmethod + def send_error(client: socket, code, message): + message = f"HTTP/1.1 {code} {message}\r\n" + message += RequestHandler._get_date() + "\r\n" + message += "Content-Length: 0\r\n" + message += "\r\n" + + logging.debug("Sending: %r", message) + client.sendall(message.encode(FORMAT)) diff --git a/server/worker.py b/server/worker.py index 36b2c5d..361536b 100644 --- a/server/worker.py +++ b/server/worker.py @@ -1,10 +1,10 @@ import logging import multiprocessing as mp +import socket import threading from concurrent.futures import ThreadPoolExecutor -from logging import Logger -import socket +from httplib.exceptions import HTTPServerException, InternalServerError from server.RequestHandler import RequestHandler THREAD_LIMIT = 128 @@ -23,10 +23,8 @@ def worker(address, name, logging_level, queue: mp.Queue, stop_event: mp.Event): class Worker: - host: str name: str - logger: Logger queue: mp.Queue executor: ThreadPoolExecutor stop_event: mp.Event @@ -68,8 +66,11 @@ class Worker: handler = RequestHandler(conn, self.host) handler.listen() - except Exception: - logging.debug("Internal error") + except HTTPServerException as e: + RequestHandler.send_error(conn, e.status_code, e.message) + except Exception as e: + RequestHandler.send_error(conn, InternalServerError.status_code, InternalServerError.message) + logging.debug("Internal error", exc_info=e) conn.shutdown(socket.SHUT_RDWR) conn.close()