mirror of https://github.com/tiangolo/fastapi.git
32 lines
966 B
Python
32 lines
966 B
Python
from fastapi import FastAPI, Request
|
|
from starlette.types import ASGIApp, Receive, Scope, Send
|
|
|
|
|
|
class ForwardedPrefixMiddleware:
|
|
def __init__(self, app: ASGIApp):
|
|
self.app = app
|
|
|
|
async def __call__(self, scope: Scope, receive: Receive, send: Send):
|
|
if scope["type"] in ("http", "websocket"):
|
|
scope_headers: list[tuple[bytes, bytes]] = scope.get("headers", [])
|
|
headers = {
|
|
k.decode("latin-1"): v.decode("latin-1") for k, v in scope_headers
|
|
}
|
|
prefix = headers.get("x-forwarded-prefix", "").rstrip("/")
|
|
if prefix:
|
|
scope["root_path"] = prefix
|
|
await self.app(scope, receive, send)
|
|
|
|
|
|
app = FastAPI()
|
|
app.add_middleware(ForwardedPrefixMiddleware)
|
|
|
|
|
|
@app.get("/app")
|
|
def read_main(request: Request):
|
|
return {
|
|
"message": "Hello World",
|
|
"path": request.scope.get("path"),
|
|
"root_path": request.scope.get("root_path"),
|
|
}
|