temp egress probe
Browse files- Dockerfile +3 -0
- README.md +2 -7
- app.py +25 -0
Dockerfile
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
FROM python:3.12-slim
|
| 2 |
+
COPY app.py /app.py
|
| 3 |
+
CMD ["python", "/app.py"]
|
README.md
CHANGED
|
@@ -1,10 +1,5 @@
|
|
| 1 |
---
|
| 2 |
-
title:
|
| 3 |
-
emoji: 🐠
|
| 4 |
-
colorFrom: yellow
|
| 5 |
-
colorTo: red
|
| 6 |
sdk: docker
|
| 7 |
-
|
| 8 |
---
|
| 9 |
-
|
| 10 |
-
Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
|
|
|
|
| 1 |
---
|
| 2 |
+
title: probe
|
|
|
|
|
|
|
|
|
|
| 3 |
sdk: docker
|
| 4 |
+
app_port: 7860
|
| 5 |
---
|
|
|
|
|
|
app.py
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# 临时出口探针:只转发到 mp-staging.kaggle.net / ipinfo.io,Kaggle key 放 X-Kaggle-Auth
|
| 2 |
+
import json, os, hmac, urllib.request, urllib.error
|
| 3 |
+
from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
|
| 4 |
+
ALLOWED = ("https://mp-staging.kaggle.net/", "https://ipinfo.io/")
|
| 5 |
+
class H(BaseHTTPRequestHandler):
|
| 6 |
+
def _go(self, method):
|
| 7 |
+
if not hmac.compare_digest(self.headers.get("X-Probe", ""), os.environ.get("PROBE_SECRET", "-")):
|
| 8 |
+
self.send_response(401); self.end_headers(); return
|
| 9 |
+
target = self.headers.get("X-Target", "")
|
| 10 |
+
if not target.startswith(ALLOWED):
|
| 11 |
+
self.send_response(404); self.end_headers(); return
|
| 12 |
+
body = self.rfile.read(int(self.headers.get("Content-Length") or 0)) if method == "POST" else None
|
| 13 |
+
hdr = {"Content-Type": "application/json"}
|
| 14 |
+
if self.headers.get("X-Kaggle-Auth"): hdr["Authorization"] = self.headers["X-Kaggle-Auth"]
|
| 15 |
+
req = urllib.request.Request(target, data=body, headers=hdr, method=method)
|
| 16 |
+
try:
|
| 17 |
+
with urllib.request.urlopen(req, timeout=90) as r: code, data = r.status, r.read()
|
| 18 |
+
except urllib.error.HTTPError as e: code, data = e.code, e.read()
|
| 19 |
+
except Exception as e: code, data = 599, str(e).encode()
|
| 20 |
+
self.send_response(code); self.send_header("Content-Type", "application/json"); self.end_headers(); self.wfile.write(data)
|
| 21 |
+
def do_GET(self):
|
| 22 |
+
if self.path == "/": self.send_response(200); self.end_headers(); self.wfile.write(b"ok"); return
|
| 23 |
+
self._go("GET")
|
| 24 |
+
def do_POST(self): self._go("POST")
|
| 25 |
+
ThreadingHTTPServer(("0.0.0.0", 7860), H).serve_forever()
|