Opened 3 weeks ago
Last modified 3 weeks 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 , 3 weeks ago
| Triage Stage: | Unreviewed → Accepted |
|---|---|
| Version: | dev → 4.1 |
comment:2 by , 3 weeks ago
| Owner: | set to |
|---|---|
| Status: | new → assigned |
comment:3 by , 3 weeks ago
| Has patch: | set |
|---|
comment:5 by , 3 weeks 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.
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.