Long story short
Handling of payloads in the server response is not consistent and can lead to AttributeErrors 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
Long story short
Handling of payloads in the server response is not consistent and can lead to
AttributeErrors 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
textis called after setting a string payload using thebodyproperty setter.Actual behaviour
The setter for
Response.bodyhas support for automatic type detection via thePayloadRegistry. This means that in the above example, the body will be encoded as aStringPayload. When trying to access this via thetextproperty we fail becauseStringPayloaddoes not have adecodemethod.When you set
textdirectly any string is decoded tobytesand set to_bodydirectly without passing through thePayloadRegistry.Steps to reproduce
Your environment
Reproduced on aiohttp 2.3.10 and 3.1.2