Opened 2 months ago

Last modified 2 months ago

#37252 assigned Bug

If-Unmodified-Since yields 412 when the resource has no modification date, instead of being ignored (RFC 9110 13.1.4)

Reported by: Eugene Lazutkin Owned by: Eugene Lazutkin
Component: HTTP handling Version: 4.1
Severity: Normal Keywords:
Cc: Eugene Lazutkin Triage Stage: Accepted
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: yes UI/UX: no

Description

RFC 9110 §13.1.4: "A recipient MUST ignore the If-Unmodified-Since header field if the resource does not have a modification date available."

_if_unmodified_since_passes in django/utils/cache.py fails when last_modified is not available:

def _if_unmodified_since_passes(last_modified, if_unmodified_since):
    return last_modified and last_modified <= if_unmodified_since

so get_conditional_response answers 412 (Precondition Failed) where the RFC says the header must be ignored. Reproducible on any path with no Last-Modified available — e.g. @condition with only an etag_func, or ConditionalGetMiddleware on a response without the header — when the request carries If-Unmodified-Since.

The _if_modified_since_passes twin is already ignore-shaped (not last_modified or ...), so the fix is one line mirroring it: return not last_modified or last_modified <= if_unmodified_since.

Would you accept a PR (patch + tests) for this?

Change History (5)

comment:1 by James Beard, 2 months ago

Triage Stage: Unreviewed → Accepted
Version: dev → 4.1

Believe this to be a valid issue. The current behaviour was implemented against the now superseded RFC 7232, which wasn't as clear on what to do when there was no modification date available.

Reckon a PR would be a great contribution.

Guessing most people would already understand a resource not having a modification date means the If-Whatever-Since headers aren't going to factor in to the response. Maybe worth casting an eye over related documentation though to make sure nothing contradictory.

Current implementation was added according to ​RFC 7232 §3.3 in ​22e303887b7f807b39239880e33b9018566e0137.

Setting version to 4.1 when the implementation no longer adhered to the latest RFC.

comment:2 by Eugene Lazutkin, 2 months ago

Owner: set to Eugene Lazutkin
Status: new → assigned

comment:3 by Eugene Lazutkin, 2 months ago

Has patch: set

comment:5 by Eugene Lazutkin, 2 months ago

BTW, I checked docs and the only relevant one is this: ​https://github.com/django/django/blob/main/docs/topics/conditional-view-processing.txt --- it has very careful wording and doesn't do any contradictory claims. Docstrings look fine too.

Note: See TracTickets for help on using tickets.
Back to Top