# Copyright (C) 2020 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later class TurbolinksMiddleware(object): """ Send the `Turbolinks-Location` header in response to a visit that was redirected, and Turbolinks will replace the browser's topmost history entry. """ def __init__(self, get_response): self.get_response = get_response def __call__(self, request): response = self.get_response(request) is_turbolinks = request.META.get('HTTP_TURBOLINKS_REFERRER') is_response_redirect = response.has_header('Location') if is_turbolinks: if is_response_redirect: location = response['Location'] prev_location = request.session.pop('_turbolinks_redirect_to', None) if prev_location is not None: # relative subsequent redirect if location.startswith('.'): location = prev_location.split('?')[0] + location request.session['_turbolinks_redirect_to'] = location else: if request.session.get('_turbolinks_redirect_to'): location = request.session.pop('_turbolinks_redirect_to') response['Turbolinks-Location'] = location return response