HgfaceNeoj4 / proxy.py
gunnybd01's picture
Create proxy.py
d4ce1bc verified
#!/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()