#!/usr/bin/env python3 """ Simple reverse proxy: port 7860 -> Neo4j on port 7474 Strips X-Frame-Options so Neo4j Browser can be embedded in HuggingFace iframe. """ import http.server import urllib.request import urllib.error import sys TARGET = "http://127.0.0.1:7474" STRIP_HEADERS = {'x-frame-options', 'content-security-policy', 'transfer-encoding'} class ProxyHandler(http.server.BaseHTTPRequestHandler): def log_message(self, fmt, *args): print(f"[proxy] {self.command} {self.path} -> {args[1] if len(args)>1 else ''}", flush=True) def do_request(self): url = TARGET + self.path length = int(self.headers.get('Content-Length', 0)) body = self.rfile.read(length) if length > 0 else None fwd_headers = {} for k, v in self.headers.items(): if k.lower() not in ('host', 'connection', 'transfer-encoding'): fwd_headers[k] = v req = urllib.request.Request(url, data=body, headers=fwd_headers, method=self.command) try: with urllib.request.urlopen(req, timeout=60) as resp: data = resp.read() self.send_response(resp.status) for k, v in resp.headers.items(): if k.lower() not in STRIP_HEADERS: self.send_header(k, v) self.send_header('X-Frame-Options', 'ALLOWALL') self.send_header('Access-Control-Allow-Origin', '*') self.send_header('Content-Length', str(len(data))) self.end_headers() self.wfile.write(data) except urllib.error.HTTPError as e: data = e.read() self.send_response(e.code) for k, v in e.headers.items(): if k.lower() not in STRIP_HEADERS: self.send_header(k, v) self.send_header('Content-Length', str(len(data))) self.end_headers() self.wfile.write(data) except Exception as e: msg = str(e).encode() self.send_response(502) self.send_header('Content-Length', str(len(msg))) self.end_headers() self.wfile.write(msg) def do_GET(self): self.do_request() def do_POST(self): self.do_request() def do_PUT(self): self.do_request() def do_DELETE(self): self.do_request() def do_OPTIONS(self): self.do_request() def do_HEAD(self): self.do_request() if __name__ == '__main__': server = http.server.HTTPServer(('0.0.0.0', 7860), ProxyHandler) print(">>> Python proxy listening on 0.0.0.0:7860 -> Neo4j 127.0.0.1:7474", flush=True) sys.stdout.flush() server.serve_forever()