Description
Long story short
Handling of payloads in the server response is not consistent and can lead to AttributeError
s since code depends on methods that may not exist. I am willing to try and create a PR that fixes this issue but I'm unsure of what the intended behavior should be.
Expected behaviour
We handle payload setting consistently and don't fail when text
is called after setting a string payload using the body
property setter.
Actual behaviour
The setter for Response.body
has support for automatic type detection via the PayloadRegistry
. This means that in the above example, the body will be encoded as a StringPayload
. When trying to access this via the text
property we fail because StringPayload
does not have a decode
method.
When you set text
directly any string is decoded to bytes
and set to _body
directly without passing through the PayloadRegistry
.
Steps to reproduce
>>> from aiohttp.web_response import Response
>>> r = Response()
>>> r.body = 'asdf'
>>> r.text
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/private/tmp/.ve/lib/python3.6/site-packages/aiohttp/web_response.py", line 539, in text
return self._body.decode(self.charset or 'utf-8')
AttributeError: 'StringPayload' object has no attribute 'decode'
Your environment
Reproduced on aiohttp 2.3.10 and 3.1.2