from http.server import BaseHTTPRequestHandler import urllib.parse as urllib import logger def generate_class(response_callback): class Handler(BaseHTTPRequestHandler): def _send_error(self, code: int, message: str): 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): 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): self._handle_request() def do_POST(self): self._handle_request() def do_PUT(self): self._handle_request() def do_DELETE(self): self._handle_request() def do_PATCH(self): self._handle_request() def do_OPTIONS(self): self._handle_request() def log_message(self, format, *args): return return Handler