diff --git a/jupyter_server/base/handlers.py b/jupyter_server/base/handlers.py index 6f2edc4876..f5f480e5db 100644 --- a/jupyter_server/base/handlers.py +++ b/jupyter_server/base/handlers.py @@ -773,7 +773,9 @@ def update_api_activity(self): def finish(self, *args, **kwargs): """Finish an API response.""" self.update_api_activity() - self.set_header("Content-Type", "application/json") + # Allow caller to indicate content-type... + set_content_type = kwargs.pop("set_content_type", "application/json") + self.set_header("Content-Type", set_content_type) return super().finish(*args, **kwargs) def options(self, *args, **kwargs): diff --git a/jupyter_server/gateway/handlers.py b/jupyter_server/gateway/handlers.py index 5841a3c823..e28d325d82 100644 --- a/jupyter_server/gateway/handlers.py +++ b/jupyter_server/gateway/handlers.py @@ -6,7 +6,7 @@ import mimetypes import os import random -from typing import cast +from typing import Optional, cast from jupyter_client.session import Session from tornado import web @@ -281,6 +281,7 @@ class GatewayResourceHandler(APIHandler): @web.authenticated async def get(self, kernel_name, path, include_body=True): """Get a gateway resource by name and path.""" + mimetype: Optional[str] = None ksm = self.kernel_spec_manager kernel_spec_res = await ksm.get_kernel_spec_resource(kernel_name, path) if kernel_spec_res is None: @@ -290,8 +291,7 @@ async def get(self, kernel_name, path, include_body=True): ) else: mimetype = mimetypes.guess_type(path)[0] or "text/plain" - self.set_header("Content-Type", mimetype) - self.finish(kernel_spec_res) + self.finish(kernel_spec_res, set_content_type=mimetype) from ..services.kernels.handlers import _kernel_id_regex diff --git a/tests/test_gateway.py b/tests/test_gateway.py index dcd4f675f3..699a48b6ee 100644 --- a/tests/test_gateway.py +++ b/tests/test_gateway.py @@ -422,9 +422,10 @@ async def test_gateway_get_named_kernelspec(init_gateway, jp_fetch): kspec_foo = json.loads(r.body.decode("utf-8")) assert kspec_foo.get("name") == "kspec_foo" - r = await jp_fetch("kernelspecs", "kspec_foo", "hi", method="GET") + r = await jp_fetch("kernelspecs", "kspec_foo", "logo-64x64.png", method="GET") assert r.code == 200 assert r.body == b"foo" + assert r.headers["content-type"] == "image/png" with pytest.raises(tornado.httpclient.HTTPClientError) as e: await jp_fetch("api", "kernelspecs", "no_such_spec", method="GET")