|
from contextlib import asynccontextmanager |
|
from typing import AsyncIterator |
|
|
|
from fastapi import FastAPI |
|
from fastapi_proxy_lib.core.http import ForwardHttpProxy |
|
from fastapi_proxy_lib.core.tool import default_proxy_filter |
|
from httpx import AsyncClient |
|
from starlette.requests import Request |
|
|
|
proxy = ForwardHttpProxy(AsyncClient(), proxy_filter=default_proxy_filter) |
|
|
|
@asynccontextmanager |
|
async def close_proxy_event(_: FastAPI) -> AsyncIterator[None]: |
|
"""Close proxy.""" |
|
yield |
|
await proxy.aclose() |
|
|
|
app = FastAPI(lifespan=close_proxy_event) |
|
|
|
@app.api_route("/{path:path}", methods=["GET", "POST", "PUT", "DELETE", "PATCH", "HEAD", "OPTIONS", "CONNECT"]) |
|
async def _(request: Request, path: str = ""): |
|
return await proxy.proxy(request=request, path=path) |
|
|
|
|
|
if __name__ == '__main__': |
|
import uvicorn |
|
uvicorn.run("run:app", host="0.0.0.0", port="8080") |
|
|