mirror of
https://github.com/django/django.git
synced 2025-11-07 07:15:35 +00:00
Fixed #27225 -- Added "Age" header when fetching cached responses.
Co-Authored-By: Author: Alexander Lazarević <laza@e11bits.com>
This commit is contained in:
committed by
Mariusz Felisiak
parent
4b1cd8edc1
commit
3580b47ed3
@@ -43,6 +43,8 @@ More details about how the caching works:
|
||||
|
||||
"""
|
||||
|
||||
import time
|
||||
|
||||
from django.conf import settings
|
||||
from django.core.cache import DEFAULT_CACHE_ALIAS, caches
|
||||
from django.utils.cache import (
|
||||
@@ -53,6 +55,7 @@ from django.utils.cache import (
|
||||
patch_response_headers,
|
||||
)
|
||||
from django.utils.deprecation import MiddlewareMixin
|
||||
from django.utils.http import parse_http_date_safe
|
||||
|
||||
|
||||
class UpdateCacheMiddleware(MiddlewareMixin):
|
||||
@@ -171,6 +174,15 @@ class FetchFromCacheMiddleware(MiddlewareMixin):
|
||||
request._cache_update_cache = True
|
||||
return None # No cache information available, need to rebuild.
|
||||
|
||||
# Derive the age estimation of the cached response.
|
||||
if (max_age_seconds := get_max_age(response)) is not None and (
|
||||
expires_timestamp := parse_http_date_safe(response["Expires"])
|
||||
) is not None:
|
||||
now_timestamp = int(time.time())
|
||||
remaining_seconds = expires_timestamp - now_timestamp
|
||||
# Use Age: 0 if local clock got turned back.
|
||||
response["Age"] = max(0, max_age_seconds - remaining_seconds)
|
||||
|
||||
# hit, return cached response
|
||||
request._cache_update_cache = False
|
||||
return response
|
||||
|
||||
Reference in New Issue
Block a user