diff --git a/aiohttp/client_reqrep.py b/aiohttp/client_reqrep.py index 34d2016185c..8c70592f4c5 100644 --- a/aiohttp/client_reqrep.py +++ b/aiohttp/client_reqrep.py @@ -583,6 +583,10 @@ def _setup_connection(self, connection): self.content = self.flow_control_class( connection.reader, loop=connection.loop) + def _need_parse_response_body(self): + return (self.method.lower() != 'head' and + self.status not in [204, 304]) + @asyncio.coroutine def start(self, connection, read_until_eof=False): """Start response processing.""" @@ -610,7 +614,7 @@ def start(self, connection, read_until_eof=False): self.headers = CIMultiDictProxy(message.headers) # payload - response_with_body = self.method.lower() != 'head' + response_with_body = self._need_parse_response_body() self._reader.set_parser( aiohttp.HttpPayloadParser(message, readall=read_until_eof, diff --git a/tests/test_client_functional_newstyle.py b/tests/test_client_functional_newstyle.py index 125136ef6c1..7e41e6739ef 100644 --- a/tests/test_client_functional_newstyle.py +++ b/tests/test_client_functional_newstyle.py @@ -119,3 +119,45 @@ def go(): connector.close() self.loop.run_until_complete(go()) + + def test_HTTP_304(self): + @asyncio.coroutine + def handler(request): + body = yield from request.read() + self.assertEqual(b'', body) + return web.Response(status=304) + + @asyncio.coroutine + def go(): + _, srv, url = yield from self.create_server('GET', '/', handler) + connector = aiohttp.TCPConnector(loop=self.loop) + r = yield from client.request('GET', url, + connector=connector, loop=self.loop) + content = yield from r.read() + self.assertEqual(r.status, 304) + self.assertEqual(content, b'') + r.release() + connector.close() + + self.loop.run_until_complete(go()) + + def test_HTTP_304_WITH_BODY(self): + @asyncio.coroutine + def handler(request): + body = yield from request.read() + self.assertEqual(b'', body) + return web.Response(body=b'test', status=304) + + @asyncio.coroutine + def go(): + _, srv, url = yield from self.create_server('GET', '/', handler) + connector = aiohttp.TCPConnector(loop=self.loop) + r = yield from client.request('GET', url, + connector=connector, loop=self.loop) + content = yield from r.read() + self.assertEqual(r.status, 304) + self.assertEqual(content, b'') + r.release() + connector.close() + + self.loop.run_until_complete(go())