Skip to content

FileResponse sends empty chunked body when returning 304 #2143

Closed
@es1024

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

  1. Run this with an empty index.html in 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)
  1. Send an HTTP/1.1 request with an If-Modified-Since that 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.

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions