1212
1313from .config import Settings
1414from .handlers import HealthzHandler , ReverseProxyHandler
15+ from .lifespan import LifespanManager , ServerHealthCheck
1516from .middleware import (
1617 AddProcessTimeHeaderMiddleware ,
1718 ApplyCql2FilterMiddleware ,
@@ -27,12 +28,44 @@ def create_app(settings: Optional[Settings] = None) -> FastAPI:
2728 """FastAPI Application Factory."""
2829 settings = settings or Settings ()
2930
31+ #
32+ # Application
33+ #
34+ upstream_urls = [
35+ settings .upstream_url ,
36+ settings .oidc_discovery_internal_url or settings .oidc_discovery_url ,
37+ ]
38+ lifespan = LifespanManager (
39+ on_startup = (
40+ [ServerHealthCheck (url = url ) for url in upstream_urls ]
41+ if settings .wait_for_upstream
42+ else []
43+ )
44+ )
45+
3046 app = FastAPI (
3147 openapi_url = None , # Disable OpenAPI schema endpoint, we want to serve upstream's schema
48+ lifespan = lifespan ,
3249 )
3350
34- app .add_middleware (AddProcessTimeHeaderMiddleware )
51+ #
52+ # Handlers (place catch-all proxy handler last)
53+ #
54+ if settings .healthz_prefix :
55+ app .include_router (
56+ HealthzHandler (upstream_url = str (settings .upstream_url )).router ,
57+ prefix = settings .healthz_prefix ,
58+ )
59+
60+ app .add_api_route (
61+ "/{path:path}" ,
62+ ReverseProxyHandler (upstream = str (settings .upstream_url )).stream ,
63+ methods = ["GET" , "POST" , "PUT" , "PATCH" , "DELETE" ],
64+ )
3565
66+ #
67+ # Middleware (order is important, last added = first to run)
68+ #
3669 if settings .openapi_spec_endpoint :
3770 app .add_middleware (
3871 OpenApiMiddleware ,
@@ -44,10 +77,11 @@ def create_app(settings: Optional[Settings] = None) -> FastAPI:
4477 )
4578
4679 if settings .items_filter :
47- app .add_middleware (ApplyCql2FilterMiddleware )
80+ app .add_middleware (
81+ ApplyCql2FilterMiddleware ,
82+ )
4883 app .add_middleware (
4984 BuildCql2FilterMiddleware ,
50- # collections_filter=settings.collections_filter,
5185 items_filter = settings .items_filter (),
5286 )
5387
@@ -57,18 +91,11 @@ def create_app(settings: Optional[Settings] = None) -> FastAPI:
5791 private_endpoints = settings .private_endpoints ,
5892 default_public = settings .default_public ,
5993 oidc_config_url = settings .oidc_discovery_url ,
94+ oidc_config_internal_url = settings .oidc_discovery_internal_url ,
6095 )
6196
62- if settings .healthz_prefix :
63- healthz_handler = HealthzHandler (upstream_url = str (settings .upstream_url ))
64- app .include_router (healthz_handler .router , prefix = "/healthz" )
65-
66- # Catchall for any endpoint
67- proxy_handler = ReverseProxyHandler (upstream = str (settings .upstream_url ))
68- app .add_api_route (
69- "/{path:path}" ,
70- proxy_handler .stream ,
71- methods = ["GET" , "POST" , "PUT" , "PATCH" , "DELETE" ],
97+ app .add_middleware (
98+ AddProcessTimeHeaderMiddleware ,
7299 )
73100
74101 return app
0 commit comments