39 lines
1.4 KiB
Python
39 lines
1.4 KiB
Python
|
# Copyright (C) 2018-2020 by BDE ENS Paris-Saclay
|
||
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||
|
|
||
|
from django.http import HttpResponseRedirect
|
||
|
|
||
|
from urllib.parse import urlencode, parse_qs, urlsplit, urlunsplit
|
||
|
|
||
|
|
||
|
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
|
||
|
|