Fast-API und X-FORWARDED-PREFIX

Beim bauen eines FAST-API MicroService für Momentum bin ich über das Problem gestossen, dass FastAPI leider den Header x-forwarded-prefix ignoriert. Dadurch ist zum Beispiel die Swagger Seite defekt. Dies kann man lösen, in dem man folgende Middleware definiert:

@app.middleware("http")
async def set_root_path_for_api_gateway(request: Request, call_next):
    prefix = request.headers.get('x-forwarded-prefix')
    if prefix: 
        request.scope['root_path'] = prefix

    response = await call_next(request)
    return response

Falls jemand das selbe Problem haben sollte.

Alternativ kann es auch als Middleware Klasse definiert werden:

from typing import Union, cast
from starlette.types import ASGIApp, Scope, Receive, Send
from asgiref.typing import (
    HTTPScope,
    WebSocketScope,
)

class XPrefixHeaderFixMiddleWare:
    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 = cast(Union[HTTPScope, WebSocketScope], scope)
            headers = dict(scope["headers"])
            if b"x-forwarded-prefix" in headers:
                prefix = headers[b"x-forwarded-prefix"].decode("UTF-8")
                scope['root_path'] = prefix

        return await self.app(scope, receive, send)

Diese Klasse kann dann wie folgt eingebunden werden:

app.add_middleware(XPrefixHeaderFixMiddleWare)

Das Ganze habe ich auf dem Beispiel von Uvicon ProxyHeadersMiddleware aufgebaut. Diese Middleware beachtet leider den Header x-forwarded-prefix nicht.

1 „Gefällt mir“

Das ist ja verrückt, dass es diese Klasse nicht bereits als Modul gibt. Wenn dem so ist, sollen wir das allenfalls auf (zusätzlich auf Englisch dokumentieren) und paketieren?