diff --git a/jupyter_server/gateway/managers.py b/jupyter_server/gateway/managers.py index 968d5f2d00..3d9b4e64dd 100644 --- a/jupyter_server/gateway/managers.py +++ b/jupyter_server/gateway/managers.py @@ -200,9 +200,28 @@ def _get_endpoint_for_user_filter(default_endpoint): return "?user=".join([default_endpoint, kernel_user]) return default_endpoint + def _replace_path_kernelspec_resources(self, kernel_specs): + """Helper method that replaces any gateway base_url with the server's base_url + This enables clients to properly route through jupyter_server to a gateway + for kernel resources such as logo files + """ + kernelspecs = kernel_specs["kernelspecs"] + for kernel_name in kernelspecs: + resources = kernelspecs[kernel_name]["resources"] + for resource_name in resources: + original_path = resources[resource_name] + split_eg_base_url = str.rsplit(original_path, sep="/kernelspecs/", maxsplit=1) + new_path = url_path_join(self.parent.base_url, "kernelspecs", split_eg_base_url[1]) + kernel_specs["kernelspecs"][kernel_name]["resources"][resource_name] = new_path + if original_path != new_path: + self.log.debug( + f"Replaced original kernel resource path {original_path} with new " + f"path {kernel_specs['kernelspecs'][kernel_name]['resources'][resource_name]}" + ) + return kernel_specs + def _get_kernelspecs_endpoint_url(self, kernel_name=None): """Builds a url for the kernels endpoint - Parameters ---------- kernel_name : kernel name (optional) @@ -237,6 +256,7 @@ async def list_kernel_specs(self): self.log.debug(f"Request list kernel specs at: {kernel_spec_url}") response = await gateway_request(kernel_spec_url, method="GET") kernel_specs = json_decode(response.body) + kernel_specs = self._replace_path_kernelspec_resources(kernel_specs) return kernel_specs async def get_kernel_spec(self, kernel_name, **kwargs): diff --git a/tests/test_gateway.py b/tests/test_gateway.py index 7515e2a947..2c4817f786 100644 --- a/tests/test_gateway.py +++ b/tests/test_gateway.py @@ -38,7 +38,11 @@ def generate_kernelspec(name): "metadata": {}, } } - kernelspec_stanza = {"name": name, "spec": spec_stanza, "resources": {}} + kernelspec_stanza = { + "name": name, + "spec": spec_stanza, + "resources": {"logo-64x64": f"f/kernelspecs/{name}/logo-64x64.png"}, + } return kernelspec_stanza @@ -403,6 +407,9 @@ async def test_gateway_get_kernelspecs(init_gateway, jp_fetch, jp_serverapp): kspecs = content.get("kernelspecs") assert len(kspecs) == 2 assert kspecs.get("kspec_bar").get("name") == "kspec_bar" + assert ( + kspecs.get("kspec_bar").get("resources")["logo-64x64"].startswith(jp_serverapp.base_url) + ) async def test_gateway_get_named_kernelspec(init_gateway, jp_fetch):