Files
zeus-filter/app/handler.py
2026-01-23 15:08:27 +01:00

64 lines
2.1 KiB
Python

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