63 lines
1.9 KiB
Python
63 lines
1.9 KiB
Python
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 |