Files
BanGUI/e2e/proxy_server.py
Lukas 848531c134 docs: update tasks from E2E test run; add proxy server
- Docs/Tasks.md: document 122 E2E test failures (fail2ban missing)
- e2e/proxy_server.py: add HTTP proxy for frontend dev server
- e2e/resources/common.resource: update test resource
2026-06-21 11:21:20 +02:00

94 lines
2.9 KiB
Python

#!/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()