bedrock/mozorg/middleware.py (61 lines of code) (raw):
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
import time
from email.utils import formatdate
from django.conf import settings
from django.core.exceptions import MiddlewareNotUsed
from django.utils.cache import add_never_cache_headers
class CacheMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
response = self.get_response(request)
return self.process_response(request, response)
def process_response(self, request, response):
if request.method not in ("GET", "HEAD"):
return response
if response.streaming or "cache-control" in response:
return response
# Expiration time in seconds, now + 10 minutes.
stamp = int(time.time() + 600)
response["Cache-Control"] = "max-age=600"
response["Expires"] = formatdate(timeval=stamp, localtime=False, usegmt=True)
return response
class ClacksOverheadMiddleware:
# bug 1144901
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
response = self.get_response(request)
return self.process_response(request, response)
@staticmethod
def process_response(request, response):
if response.status_code == 200:
response["X-Clacks-Overhead"] = "GNU Terry Pratchett"
return response
class HostnameMiddleware:
def __init__(self, get_response):
if not settings.ENABLE_HOSTNAME_MIDDLEWARE:
raise MiddlewareNotUsed
values = [getattr(settings, x) for x in ["HOSTNAME", "CLUSTER_NAME"]]
self.backend_server = ".".join(x for x in values if x)
self.get_response = get_response
def __call__(self, request):
response = self.get_response(request)
return self.process_response(request, response)
def process_response(self, request, response):
response["X-Backend-Server"] = self.backend_server
return response
class VaryNoCacheMiddleware:
def __init__(self, get_response):
if not settings.ENABLE_VARY_NOCACHE_MIDDLEWARE:
raise MiddlewareNotUsed
self.get_response = get_response
def __call__(self, request):
response = self.get_response(request)
return self.process_response(request, response)
@staticmethod
def process_response(request, response):
if "vary" in response:
path = request.path
if path != "/" and not any(path.startswith(x) for x in settings.VARY_NOCACHE_EXEMPT_URL_PREFIXES):
del response["vary"]
del response["expires"]
add_never_cache_headers(response)
return response