From c2efde053c1faef2f83f648b48fe7542bce7fde7 Mon Sep 17 00:00:00 2001 From: Emmanuel Cazenave Date: Wed, 11 May 2022 11:55:59 +0200 Subject: [PATCH] middleware: add HTTP pass through header in maintenance middleware (#65096) --- hobo/middleware/maintenance.py | 19 +++++++++++-------- tests/test_maintenance.py | 4 ++++ 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/hobo/middleware/maintenance.py b/hobo/middleware/maintenance.py index f8c3d04..7c412f9 100644 --- a/hobo/middleware/maintenance.py +++ b/hobo/middleware/maintenance.py @@ -19,9 +19,14 @@ from django.http import HttpResponse from django.utils.translation import ugettext as _ -def pass_through(remote_addr): - pass_through_ips = getattr(settings, 'MAINTENANCE_PASS_THROUGH_IPS', []) - if remote_addr in pass_through_ips: +def pass_through(request): + remote_addr = request.META.get('REMOTE_ADDR') + if remote_addr: + pass_through_ips = getattr(settings, 'MAINTENANCE_PASS_THROUGH_IPS', []) + if remote_addr in pass_through_ips: + return True + pass_through_header = getattr(settings, 'MAINTENANCE_PASS_THROUGH_HEADER', '') + if pass_through_header and pass_through_header in request.headers: return True return False @@ -32,9 +37,7 @@ class MaintenanceMiddleware: def __call__(self, request): maintenance_mode = getattr(settings, 'MAINTENANCE_MODE', None) - if maintenance_mode: - remote_addr = request.META.get('REMOTE_ADDR') - if not (remote_addr and pass_through(remote_addr)): - maintenance_msg = _('The site is under maintenance') - return HttpResponse('

%s

' % maintenance_msg, status=503) + if maintenance_mode and not pass_through(request): + maintenance_msg = _('The site is under maintenance') + return HttpResponse('

%s

' % maintenance_msg, status=503) return self.get_response(request) diff --git a/tests/test_maintenance.py b/tests/test_maintenance.py index 3638dd7..96aef81 100644 --- a/tests/test_maintenance.py +++ b/tests/test_maintenance.py @@ -17,3 +17,7 @@ def test_maintenance_middleware(app, admin_user, db, monkeypatch, settings): settings.MAINTENANCE_PASS_THROUGH_IPS = [] resp = app.get('/', status=503) + + settings.MAINTENANCE_PASS_THROUGH_HEADER = 'X-Entrouvert' + resp = app.get('/', headers={'X-Entrouvert': 'yes'}) + assert resp.status_code == 200