|
|
from fastapi import FastAPI, Request, HTTPException |
|
|
from fastapi.responses import Response |
|
|
import httpx |
|
|
import os |
|
|
|
|
|
app = FastAPI() |
|
|
|
|
|
PROXY_KEY = os.environ.get("PROXY_KEY") |
|
|
|
|
|
@app.post("/proxy") |
|
|
async def generic_proxy(request: Request): |
|
|
|
|
|
if PROXY_KEY: |
|
|
if request.headers.get("x-proxy-key") != PROXY_KEY: |
|
|
raise HTTPException(status_code=403, detail="Forbidden") |
|
|
|
|
|
payload = await request.json() |
|
|
|
|
|
url = payload.get("url") |
|
|
if not url or not url.startswith(("http://", "https://")): |
|
|
raise HTTPException(400, "Invalid url") |
|
|
|
|
|
method = payload.get("method", "GET").upper() |
|
|
headers = payload.get("headers", {}) |
|
|
params = payload.get("params") |
|
|
body = payload.get("body") |
|
|
|
|
|
async with httpx.AsyncClient( |
|
|
follow_redirects=True, |
|
|
timeout=60 |
|
|
) as client: |
|
|
resp = await client.request( |
|
|
method=method, |
|
|
url=url, |
|
|
headers=headers, |
|
|
params=params, |
|
|
content=body if isinstance(body, (str, bytes)) else None, |
|
|
json=body if isinstance(body, (dict, list)) else None, |
|
|
) |
|
|
|
|
|
return Response( |
|
|
content=resp.content, |
|
|
status_code=resp.status_code, |
|
|
headers={ |
|
|
k: v for k, v in resp.headers.items() |
|
|
if k.lower() not in ["content-encoding", "transfer-encoding"] |
|
|
}, |
|
|
) |
|
|
|
|
|
if __name__ == "__main__": |
|
|
import uvicorn |
|
|
uvicorn.run( |
|
|
"app:app", |
|
|
host="0.0.0.0", |
|
|
port=7860, |
|
|
reload=False |
|
|
) |