| from fastapi import FastAPI, Query, Request, Response |
| import httpx |
| import uvicorn |
|
|
| app = FastAPI() |
|
|
| @app.api_route("/", methods=["GET", "POST", "PUT", "DELETE"]) |
| @app.api_route("/{path:path}", methods=["GET", "POST", "PUT", "DELETE"]) |
| async def proxy(request: Request, url: str = Query(...)): |
| async with httpx.AsyncClient() as client: |
| method = request.method |
| headers = dict(request.headers) |
| headers.pop("host", None) |
| |
| content = await request.body() |
| |
| try: |
| target_response = await client.request( |
| method, |
| url, |
| headers=headers, |
| content=content, |
| follow_redirects=True |
| ) |
| except Exception as e: |
| return Response(content=str(e), status_code=500) |
|
|
| excluded_headers = [ |
| "content-encoding", |
| "content-length", |
| "transfer-encoding", |
| "connection" |
| ] |
| |
| response_headers = { |
| k: v for k, v in target_response.headers.items() |
| if k.lower() not in excluded_headers |
| } |
|
|
| return Response( |
| content=target_response.content, |
| status_code=target_response.status_code, |
| headers=response_headers, |
| media_type=target_response.headers.get("content-type") |
| ) |
|
|
| if __name__ == "__main__": |
| uvicorn.run(app, host="0.0.0.0", port=7860) |