#!/usr/bin/env python3 """Simple HTTP server that serves frontend dist and proxies /api to backend.""" import http.server import os import socketserver import urllib.request PORT = 5173 BACKEND_URL = "http://localhost:8000" DIST_DIR = "/home/lukas/Volume/repo/BanGUI/frontend/dist" class ProxyHandler(http.server.SimpleHTTPRequestHandler): def __init__(self, *args, **kwargs): super().__init__(*args, directory=DIST_DIR, **kwargs) def do_GET(self): if self.path.startswith("/api/"): self.proxy_request("GET") else: super().do_GET() def do_POST(self): if self.path.startswith("/api/"): self.proxy_request("POST") else: self.send_error(405) def do_PUT(self): if self.path.startswith("/api/"): self.proxy_request("PUT") else: self.send_error(405) def do_DELETE(self): if self.path.startswith("/api/"): self.proxy_request("DELETE") else: self.send_error(405) def do_PATCH(self): if self.path.startswith("/api/"): self.proxy_request("PATCH") else: self.send_error(405) def proxy_request(self, method): url = BACKEND_URL + self.path content_length = self.headers.get("Content-Length") data = None if content_length: data = self.rfile.read(int(content_length)) req = urllib.request.Request(url, method=method, data=data) for key, value in self.headers.items(): if key.lower() not in ("host", "content-length"): req.add_header(key, value) try: with urllib.request.urlopen(req) as resp: self.send_response(resp.status) for key, value in resp.headers.items(): if key.lower() not in ("transfer-encoding", "content-encoding"): self.send_header(key, value) self.end_headers() self.wfile.write(resp.read()) except urllib.error.HTTPError as e: self.send_response(e.code) for key, value in e.headers.items(): self.send_header(key, value) self.end_headers() self.wfile.write(e.read()) except Exception as e: self.send_error(502, str(e)) def end_headers(self): self.send_header("Access-Control-Allow-Origin", "*") self.send_header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, PATCH, OPTIONS") self.send_header("Access-Control-Allow-Headers", "*") super().end_headers() def do_OPTIONS(self): self.send_response(204) self.end_headers() if __name__ == "__main__": os.chdir(DIST_DIR) with socketserver.TCPServer(("", PORT), ProxyHandler) as httpd: print(f"Serving frontend at http://localhost:{PORT}") print(f"Proxying /api to {BACKEND_URL}") httpd.serve_forever()