1212from starlette .datastructures import MutableHeaders
1313from starlette .responses import StreamingResponse
1414
15- from ..utils import filters
15+ from ..utils import di , filters
1616
1717logger = logging .getLogger (__name__ )
1818
@@ -22,6 +22,8 @@ class ReverseProxyHandler:
2222 """Reverse proxy functionality."""
2323
2424 upstream : str
25+ auth_dependency : Callable
26+
2527 client : httpx .AsyncClient = None
2628
2729 # Filters
@@ -34,21 +36,21 @@ def __post_init__(self):
3436 base_url = self .upstream ,
3537 timeout = httpx .Timeout (timeout = 15.0 ),
3638 )
39+ self .collections_filter = (
40+ self .collections_filter () if self .collections_filter else None
41+ )
42+ self .items_filter = self .items_filter () if self .items_filter else None
3743
38- # Update annotations to support FastAPI's dependency injection
39- for endpoint in [self .proxy_request , self .stream ]:
40- endpoint .__annotations__ ["collections_filter" ] = Annotated [
44+ # Inject auth dependency into filters
45+ for endpoint in [self .collections_filter , self .items_filter ]:
46+ if not endpoint :
47+ continue
48+ endpoint .__annotations__ ["auth_token" ] = Annotated [
4149 Optional [Expr ],
42- Depends (self .collections_filter or ( lambda : None ) ),
50+ Depends (self .auth_dependency ),
4351 ]
4452
45- async def proxy_request (
46- self ,
47- request : Request ,
48- * ,
49- collections_filter : Annotated [Optional [Expr ], Depends (...)] = None ,
50- stream = False ,
51- ) -> httpx .Response :
53+ async def proxy_request (self , request : Request , * , stream = False ) -> httpx .Response :
5254 """Proxy a request to the upstream STAC API."""
5355 headers = MutableHeaders (request .headers )
5456 headers .setdefault ("X-Forwarded-For" , request .client .host )
@@ -58,12 +60,23 @@ async def proxy_request(
5860 query = request .url .query
5961
6062 # Apply filters
61- if filters .is_collection_endpoint (path ) and collections_filter :
62- if request .method == "GET" and path == "/collections" :
63+ if filters .is_collection_endpoint (path ) and self .collections_filter :
64+ collections_filter = await di .call_with_injected_dependencies (
65+ func = self .collections_filter ,
66+ request = request ,
67+ )
68+ if request .method == "GET" :
6369 query = filters .insert_filter (qs = query , filter = collections_filter )
64- elif filters .is_item_endpoint (path ) and self .items_filter :
70+ else :
71+ # TODO: Augment body
72+ ...
73+
74+ if filters .is_item_endpoint (path ) and self .items_filter :
6575 if request .method == "GET" :
6676 query = filters .insert_filter (qs = query , filter = self .items_filter )
77+ else :
78+ # TODO: Augment body
79+ ...
6780
6881 # https://github.com/fastapi/fastapi/discussions/7382#discussioncomment-5136466
6982 rp_req = self .client .build_request (
@@ -87,15 +100,11 @@ async def proxy_request(
87100 rp_resp .headers ["X-Upstream-Time" ] = f"{ proxy_time :.3f} "
88101 return rp_resp
89102
90- async def stream (
91- self ,
92- request : Request ,
93- collections_filter : Annotated [Optional [Expr ], Depends (...)],
94- ) -> StreamingResponse :
103+ async def stream (self , request : Request ) -> StreamingResponse :
95104 """Transparently proxy a request to the upstream STAC API."""
96105 rp_resp = await self .proxy_request (
97106 request ,
98- collections_filter = collections_filter ,
107+ # collections_filter=collections_filter,
99108 stream = True ,
100109 )
101110 return StreamingResponse (
0 commit comments