aiohttp failed response.json() with status 500
<p>Server proxies requests. </p>

<pre><code>@asyncio.coroutine
def send_async_request(method, url, data, timeout):
    with ClientSession() as session:
        response = yield from asyncio.wait_for(
            session.request(method, url, data=data), timeout=timeout
        )
        return response
</code></pre>

<p>Everything works on the response codes 200.
When it comes to 500 response code can not read the json from the response.
Exception ServerDisconnectedError:</p>

<pre><code>response = yield from send_async_request(request.method, url)
response_json = yield from response.json()

Traceback (most recent call last):  

File "C:\Python34\lib\site-packages\aiohttp\server.py", line 285, in start
    yield from self.handle_request(message, payload)
  File "C:\Python34\lib\site-packages\aiohttp\web.py", line 90, in handle_request
    resp = yield from handler(request)
  File "D:/projects/SeleniumGridDispatcher/trunk/application.py", line 122, in proxy_wd
    response_json = yield from response.json()
  File "C:\Python34\lib\site-packages\aiohttp\client_reqrep.py", line 764, in json
    yield from self.read()
  File "C:\Python34\lib\site-packages\aiohttp\client_reqrep.py", line 720, in read
    self._content = yield from self.content.read()
  File "C:\Python34\lib\site-packages\aiohttp\streams.py", line 486, in wrapper
    result = yield from func(self, *args, **kw)
  File "C:\Python34\lib\site-packages\aiohttp\streams.py", line 541, in read
    return (yield from super().read(n))
  File "C:\Python34\lib\site-packages\aiohttp\streams.py", line 261, in read
    block = yield from self.readany()
  File "C:\Python34\lib\site-packages\aiohttp\streams.py", line 486, in wrapper
    result = yield from func(self, *args, **kw)
  File "C:\Python34\lib\site-packages\aiohttp\streams.py", line 549, in readany
    return (yield from super().readany())
  File "C:\Python34\lib\site-packages\aiohttp\streams.py", line 284, in readany
    yield from self._waiter
  File "C:\Python34\lib\asyncio\futures.py", line 358, in __iter__
    yield self  # This tells Task to wait for completion.
  File "C:\Python34\lib\asyncio\tasks.py", line 290, in _wakeup
    future.result()
  File "C:\Python34\lib\asyncio\futures.py", line 274, in result
    raise self._exception
aiohttp.errors.ServerDisconnectedError
</code></pre>

<p>Help to understand what was going on.
Python: 3.4.4
aiohttp: 0.22.5</p>

<p>500 errors may occur at any time especially if the server is under high load or unstable. Make your code more resilient by catching the exception. Then you might retry or just return the response. </p>

<pre><code>@asyncio.coroutine
def send_async_request(method, url, data, timeout):
    with ClientSession() as session:
        try:             
            response = yield from asyncio.wait_for(
                session.request(method, url, data=data), timeout=timeout
            )
        except  Exception as e:
            print("%s has error '%s: %s'" % (url, response.status, response.reason))
            # now you can decide what you want to do
            # either return the response anyways or do some handling right here
        return response
</code></pre>

python json python-asyncio aiohttp