from http.server import BaseHTTPRequestHandler import urllib.parse as urllib from typing import Callable import logger def generate_class(response_callback: Callable[[str, str], str | None]) -> type[BaseHTTPRequestHandler]: class Handler(BaseHTTPRequestHandler): def _send_error(self, code: int, message: str) -> None: self.send_response(code) self.send_header("Content-Type", "text/plain") self.end_headers() self.wfile.write(message.encode("utf-8")) def _handle_request(self) -> None: host = self.client_address[0] method = self.command url = urllib.urlparse(self.path) path = url.path query = urllib.parse_qs(url.query) if method != "GET" or path != "/calendar.ics": logger.info(f"Invalid {method} request on {path} from {host}") self._send_error(404, "Invalid endpoint") return logger.info(f"Received calendar request from {host}") td_group = (query.get("td") or ["all"])[0] sh_group = (query.get("sh") or ["all"])[0] response = response_callback(td_group, sh_group) if not response: self._send_error(500, "Unable to generate calendar") return logger.info(f"Generated calendar for {host}") self.send_response(200) self.send_header("Content-Type", "text/calendar") self.end_headers() self.wfile.write(response.encode("utf-8")) def do_GET(self) -> None: self._handle_request() def do_POST(self) -> None: self._handle_request() def do_PUT(self) -> None: self._handle_request() def do_DELETE(self) -> None: self._handle_request() def do_PATCH(self) -> None: self._handle_request() def do_OPTIONS(self) -> None: self._handle_request() def log_message(self, format: str, *args) -> None: return return Handler