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."""
from typing import Any, Dict
from aiohttp import web
from aiohttp import web, payload
def aiohttp_serialize_response(response: web.Response) -> Dict[str, Any]:
"""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 {
'status': response.status,
'body': response.text,
'body': body,
'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():
"""Test serializing a JSON response."""
response = web.json_response({"how": "what"})