3737
3838def _get_base_storage_url (app : web .Application ) -> URL :
3939 settings : StorageSettings = get_plugin_settings (app )
40-
41- # storage service API endpoint
42- return URL (settings .base_url )
40+ return URL (settings .base_url , encoded = True )
4341
4442
45- def _get_storage_prefix (app : web .Application ) -> str :
43+ def _get_storage_vtag (app : web .Application ) -> str :
4644 settings : StorageSettings = get_plugin_settings (app )
4745 storage_prefix : str = settings .STORAGE_VTAG
4846 return storage_prefix
4947
5048
51- def _resolve_storage_url (request : web .Request ) -> URL :
52- """Composes a new url against storage API """
49+ def _to_storage_url (request : web .Request ) -> URL :
50+ """Converts web-api url to storage-api url """
5351 userid = request [RQT_USERID_KEY ]
5452
5553 # storage service API endpoint
56- endpoint = _get_base_storage_url (request .app )
54+ url = _get_base_storage_url (request .app )
5755
5856 basepath_index = 3
5957 # strip basepath from webserver API path (i.e. webserver api version)
6058 # >>> URL('http://storage:1234/v5/storage/asdf/').raw_parts[3:]
6159 suffix = "/" .join (request .url .raw_parts [basepath_index :])
6260
63- return (endpoint / suffix ).with_query (request .query ).update_query (user_id = userid )
61+ return (
62+ url .joinpath (suffix , encoded = True )
63+ .with_query (request .query )
64+ .update_query (user_id = userid )
65+ )
66+
67+
68+ def _from_storage_url (request : web .Request , storage_url : AnyUrl ) -> AnyUrl :
69+ """Converts storage-api url to web-api url"""
70+ assert storage_url .path # nosec
71+
72+ prefix = f"/{ _get_storage_vtag (request .app )} "
73+ converted_url = request .url .with_path (
74+ f"/v0/storage{ storage_url .path .removeprefix (prefix )} " , encoded = True
75+ ).with_scheme (request .headers .get (X_FORWARDED_PROTO , request .url .scheme ))
76+
77+ webserver_url : AnyUrl = parse_obj_as (AnyUrl , f"{ converted_url } " )
78+ return webserver_url
6479
6580
6681class _ResponseTuple (NamedTuple ):
@@ -71,7 +86,7 @@ class _ResponseTuple(NamedTuple):
7186async def _forward_request_to_storage (
7287 request : web .Request , method : str , body : dict [str , Any ] | None = None , ** kwargs
7388) -> _ResponseTuple :
74- url = _resolve_storage_url (request )
89+ url = _to_storage_url (request )
7590 session = get_client_session (request .app )
7691
7792 async with session .request (
@@ -81,16 +96,6 @@ async def _forward_request_to_storage(
8196 return _ResponseTuple (payload = payload , status_code = resp .status )
8297
8398
84- def _unresolve_storage_url (request : web .Request , storage_url : AnyUrl ) -> AnyUrl :
85- assert storage_url .path # nosec
86- prefix = f"/{ _get_storage_prefix (request .app )} "
87- converted_url = request .url .with_path (
88- f"/v0/storage{ storage_url .path .removeprefix (prefix )} "
89- ).with_scheme (request .headers .get (X_FORWARDED_PROTO , request .url .scheme ))
90- converted_url_ : AnyUrl = parse_obj_as (AnyUrl , f"{ converted_url } " )
91- return converted_url_
92-
93-
9499# ---------------------------------------------------------------------
95100
96101routes = web .RouteTableDef ()
@@ -233,10 +238,10 @@ class _QueryParams(BaseModel):
233238 payload , status = await _forward_request_to_storage (request , "PUT" , body = None )
234239 data , _ = unwrap_envelope (payload )
235240 file_upload_schema = FileUploadSchema .parse_obj (data )
236- file_upload_schema .links .complete_upload = _unresolve_storage_url (
241+ file_upload_schema .links .complete_upload = _from_storage_url (
237242 request , file_upload_schema .links .complete_upload
238243 )
239- file_upload_schema .links .abort_upload = _unresolve_storage_url (
244+ file_upload_schema .links .abort_upload = _from_storage_url (
240245 request , file_upload_schema .links .abort_upload
241246 )
242247 return create_data_response (jsonable_encoder (file_upload_schema ), status = status )
@@ -261,7 +266,7 @@ class _PathParams(BaseModel):
261266 )
262267 data , _ = unwrap_envelope (payload )
263268 file_upload_complete = FileUploadCompleteResponse .parse_obj (data )
264- file_upload_complete .links .state = _unresolve_storage_url (
269+ file_upload_complete .links .state = _from_storage_url (
265270 request , file_upload_complete .links .state
266271 )
267272 return create_data_response (jsonable_encoder (file_upload_complete ), status = status )
0 commit comments