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