diff --git a/src/_bentoml_impl/tasks/serde.py b/src/_bentoml_impl/tasks/serde.py index 02360af4a54..8ec5147bb37 100644 --- a/src/_bentoml_impl/tasks/serde.py +++ b/src/_bentoml_impl/tasks/serde.py @@ -121,6 +121,7 @@ async def deserialize_response(self, data: bytes) -> Response: status_code=response_dict["status"], ) response.raw_headers = [ - tuple(map(str.encode, h)) for h in response_dict["headers"] + (key.encode(self.HEADERS_ENCODING), value.encode(self.HEADERS_ENCODING)) + for key, value in response_dict["headers"] ] return response diff --git a/tests/unit/bentoml_io/test_tasks_serde.py b/tests/unit/bentoml_io/test_tasks_serde.py new file mode 100644 index 00000000000..d6269b3af2a --- /dev/null +++ b/tests/unit/bentoml_io/test_tasks_serde.py @@ -0,0 +1,19 @@ +from __future__ import annotations + +import pytest +from starlette.responses import Response + +from _bentoml_impl.tasks.serde import JSONSerde + + +@pytest.mark.asyncio +async def test_response_headers_roundtrip_preserves_latin1_bytes(): + serde = JSONSerde() + response = Response(content=b"ok", status_code=200) + response.raw_headers.append((b"x-raw-name", b"caf\xe9")) + + data = await serde.serialize_response(response) + restored = await serde.deserialize_response(data) + + restored_headers = dict(restored.raw_headers) + assert restored_headers[b"x-raw-name"] == b"caf\xe9"