Skip to content

Commit c7ebf74

Browse files
committed
ongoing
1 parent a7d7e39 commit c7ebf74

File tree

2 files changed

+63
-20
lines changed

2 files changed

+63
-20
lines changed

services/web/server/src/simcore_service_webserver/storage/_handlers.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
"""
55

66
import logging
7+
import urllib.parse
78
from typing import Any, Final, NamedTuple
89
from urllib.parse import quote
910

@@ -59,10 +60,11 @@ def _to_storage_url(request: web.Request) -> URL:
5960
basepath_index = 3
6061
# strip basepath from webserver API path (i.e. webserver api version)
6162
# >>> URL('http://storage:1234/v5/storage/asdf/').raw_parts[3:]
62-
suffix = "/".join(request.url.raw_parts[basepath_index:])
63+
suffix = "/".join(request.url.parts[basepath_index:])
64+
fastapi_encoded_suffix = urllib.parse.quote(suffix, safe="/")
6365

6466
return (
65-
url.joinpath(suffix, encoded=True)
67+
url.joinpath(fastapi_encoded_suffix, encoded=True)
6668
.with_query(request.query)
6769
.update_query(user_id=userid)
6870
)

services/web/server/tests/unit/with_dbs/03/test_storage_handlers.py

Lines changed: 59 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -227,26 +227,67 @@ def test_url_storage_resolver_helpers(faker: Faker, app_environment: EnvVarsDict
227227
assert isinstance(encoded_web_url, AnyUrl)
228228
assert f"{encoded_web_url}" == f"{encoded_web_request.url}"
229229

230-
# since storage is FastAPI-base it now returns non encoded URLs
231-
non_encoded_url = URL(f"/v0/storage/locations/0/files/{file_id}:complete")
232-
non_encoded_web_request = make_mocked_request("GET", str(non_encoded_url), app=app)
233-
non_encoded_web_request[RQT_USERID_KEY] = faker.pyint()
234-
non_encoded_storage_url = _to_storage_url(non_encoded_web_request)
235-
assert (
236-
non_encoded_storage_url.raw_parts[-1]
237-
== non_encoded_web_request.url.raw_parts[-1]
230+
231+
def test_from_storage_url_with_fastapi_storage(
232+
faker: Faker, app_environment: EnvVarsDict
233+
):
234+
app = web.Application()
235+
setup_settings(app)
236+
# NOTE: aiohttp does not handle file_id containing / characters, but fastAPI does
237+
# frontend --> webserver --> storage --> webserver --> frontend and back
238+
# fully encoded --> / not encoded --> re-encode /
239+
file_id = f"{faker.uuid4()}/{faker.uuid4()}/file with space and öäè.py"
240+
fully_encoded_file_id = urllib.parse.quote(file_id, safe="")
241+
storage_fastapi_encoded_file_id = urllib.parse.quote(
242+
file_id, safe="/"
243+
) # NOTE: / is safe for fastapi
244+
assert file_id != fully_encoded_file_id
245+
assert file_id != storage_fastapi_encoded_file_id
246+
assert fully_encoded_file_id != storage_fastapi_encoded_file_id
247+
248+
webserver_url_path = URL(
249+
f"/v0/storage/locations/0/files/{fully_encoded_file_id}:complete"
238250
)
239-
assert non_encoded_storage_url.host == app_environment["STORAGE_HOST"]
240-
assert non_encoded_storage_url.port == int(app_environment["STORAGE_PORT"])
241-
assert non_encoded_storage_url.query["user_id"] == str(
242-
non_encoded_web_request[RQT_USERID_KEY]
251+
assert (
252+
f"{webserver_url_path}"
253+
== f"/v0/storage/locations/0/files/{fully_encoded_file_id}:complete"
243254
)
255+
assert webserver_url_path.raw_parts[-1] == f"{fully_encoded_file_id}:complete"
244256

257+
storage_url_path = URL(
258+
f"/v0/locations/0/files/{storage_fastapi_encoded_file_id}:complete",
259+
)
245260
assert (
246-
_from_storage_url(
247-
non_encoded_web_request,
248-
TypeAdapter(AnyUrl).validate_python(f"{non_encoded_storage_url}"),
249-
url_encode=file_id,
250-
).path
251-
== f"{encoded_url}"
261+
f"{storage_url_path}"
262+
== f"/v0/locations/0/files/{storage_fastapi_encoded_file_id}:complete"
252263
)
264+
265+
webserver_request = make_mocked_request("POST", f"{webserver_url_path}", app=app)
266+
webserver_request[RQT_USERID_KEY] = faker.pyint()
267+
# assert webserver_request.url.path == webserver_url_path
268+
generated_storage_url = _to_storage_url(webserver_request)
269+
assert f"{generated_storage_url.path}" == storage_url_path
270+
271+
# since storage is FastAPI-base it now returns non encoded URLs
272+
# non_encoded_url = URL(f"/v0/storage/locations/0/files/{file_id}:complete")
273+
# non_encoded_web_request = make_mocked_request("GET", str(non_encoded_url), app=app)
274+
# non_encoded_web_request[RQT_USERID_KEY] = faker.pyint()
275+
# non_encoded_storage_url = _to_storage_url(non_encoded_web_request)
276+
# assert (
277+
# non_encoded_storage_url.raw_parts[-1]
278+
# == non_encoded_web_request.url.raw_parts[-1]
279+
# )
280+
# assert non_encoded_storage_url.host == app_environment["STORAGE_HOST"]
281+
# assert non_encoded_storage_url.port == int(app_environment["STORAGE_PORT"])
282+
# assert non_encoded_storage_url.query["user_id"] == str(
283+
# non_encoded_web_request[RQT_USERID_KEY]
284+
# )
285+
286+
# assert (
287+
# _from_storage_url(
288+
# non_encoded_web_request,
289+
# TypeAdapter(AnyUrl).validate_python(f"{non_encoded_storage_url}"),
290+
# url_encode=file_id,
291+
# ).path
292+
# == f"{encoded_url}"
293+
# )

0 commit comments

Comments
 (0)