FileResponse sends empty chunked body when returning 304 #2143
Closed
Description
Long story short
FileResponse (and by extension, add_static) may return Transfer-Encoding: chunked and the empty chunked body when returning a 304 Not Modified, in violation of RFC 2616 §10.3.5, which states: "The 304 response MUST NOT contain a message-body, and thus is always terminated by the first empty line after the header fields."
Expected behaviour
A 304 response with no body.
Actual behaviour
A 304 response with Transfer-Encoding: chunked and a 1-byte body (0).
Steps to reproduce
- Run this with an empty
index.htmlin the same directory:
from aiohttp import web
from pathlib import Path
app = web.Application()
app.router.add_static('/', Path(__file__).parent)
web.run_app(app, port=8080)
- Send an HTTP/1.1 request with an
If-Modified-Sincethat triggers a 304 Not Modified, e.g.
# nc localhost 8080
GET /index.html HTTP/1.1
If-Modified-Since: Fri, 28 Jul 2017 18:42:00 GMT
The response will be something like:
HTTP/1.1 304 Not Modified
Transfer-Encoding: chunked
Content-Type: application/octet-stream
Date: Fri, 28 Jul 2017 18:42:34 GMT
Server: Python/3.6 aiohttp/2.2.3
0
Your environment
This is using aiohttp 2.2.3, the newest version at this time.