Fix aiohttp response serialize (#23858)

* Fix aiohttp response serialize

* Suport bytes

* Handle None
This commit is contained in:
Paulus Schoutsen 2019-05-14 11:59:27 +02:00 committed by GitHub
parent 6fa8556033
commit 94a2fd542e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 48 additions and 2 deletions

View File

@ -1,13 +1,25 @@
"""Helper functions for cloud components.""" """Helper functions for cloud components."""
from typing import Any, Dict from typing import Any, Dict
from aiohttp import web from aiohttp import web, payload
def aiohttp_serialize_response(response: web.Response) -> Dict[str, Any]: def aiohttp_serialize_response(response: web.Response) -> Dict[str, Any]:
"""Serialize an aiohttp response to a dictionary.""" """Serialize an aiohttp response to a dictionary."""
body = response.body
if body is None:
pass
elif isinstance(body, payload.StringPayload):
# pylint: disable=protected-access
body = body._value.decode(body.encoding)
elif isinstance(body, bytes):
body = body.decode(response.charset or 'utf-8')
else:
raise ValueError("Unknown payload encoding")
return { return {
'status': response.status, 'status': response.status,
'body': response.text, 'body': body,
'headers': dict(response.headers), 'headers': dict(response.headers),
} }

View File

@ -14,6 +14,40 @@ def test_serialize_text():
} }
def test_serialize_body_str():
"""Test serializing a response with a str as body."""
response = web.Response(status=201, body='Hello')
assert utils.aiohttp_serialize_response(response) == {
'status': 201,
'body': 'Hello',
'headers': {
'Content-Length': '5',
'Content-Type': 'text/plain; charset=utf-8'
},
}
def test_serialize_body_None():
"""Test serializing a response with a str as body."""
response = web.Response(status=201, body=None)
assert utils.aiohttp_serialize_response(response) == {
'status': 201,
'body': None,
'headers': {
},
}
def test_serialize_body_bytes():
"""Test serializing a response with a str as body."""
response = web.Response(status=201, body=b'Hello')
assert utils.aiohttp_serialize_response(response) == {
'status': 201,
'body': 'Hello',
'headers': {},
}
def test_serialize_json(): def test_serialize_json():
"""Test serializing a JSON response.""" """Test serializing a JSON response."""
response = web.json_response({"how": "what"}) response = web.json_response({"how": "what"})