From e38254d47d74dabbd6a16bf45577fb584ea4e1fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Fri, 14 Aug 2020 12:00:54 +0200 Subject: [PATCH] misc: use full URLs for href/src attributes in 404 skeleton pages (#45895) --- combo/data/models.py | 8 ++++---- combo/public/views.py | 6 +++++- tests/test_public.py | 4 ++++ 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/combo/data/models.py b/combo/data/models.py index d910536e..4bb77341 100644 --- a/combo/data/models.py +++ b/combo/data/models.py @@ -1056,7 +1056,7 @@ class TextCell(CellBase): def get_cell_extra_context(self, context): extra_context = super(TextCell, self).get_cell_extra_context(context) text = self.text or '' - render_skeleton = context.get('render_skeleton') + force_absolute_url = context.get('force_absolute_url') or context.get('render_skeleton') def sub_variadic_url(match): attribute = match.group(1) @@ -1069,7 +1069,7 @@ class TextCell(CellBase): return '%s="%s"' % (attribute, url) text = re.sub(r'(href|src)="(.*?)"', sub_variadic_url, text) - if render_skeleton: + if force_absolute_url: request = context.get('request') def sub_src(match): url = request.build_absolute_uri(match.group(1)) @@ -1214,7 +1214,7 @@ class LinkCell(CellBase): return url def get_cell_extra_context(self, context): - render_skeleton = context.get('render_skeleton') + force_absolute_url = context.get('force_absolute_url') or context.get('render_skeleton') request = context.get('request') extra_context = super(LinkCell, self).get_cell_extra_context(context) if self.link_page: @@ -1222,7 +1222,7 @@ class LinkCell(CellBase): else: extra_context['title'] = self.title or self.url url = self.get_url(context) - if render_skeleton and not urlparse.urlparse(url).netloc: + if force_absolute_url and not urlparse.urlparse(url).netloc: # create full URL when used in a skeleton url = request.build_absolute_uri(url) extra_context['url'] = url diff --git a/combo/public/views.py b/combo/public/views.py index 19c97112..7264443a 100644 --- a/combo/public/views.py +++ b/combo/public/views.py @@ -240,7 +240,10 @@ def skeleton(request): source = request.GET['source'] if source == '404': - request.extra_context_data = {'site_base': request.build_absolute_uri('/')[:-1]} + request.extra_context_data = { + 'site_base': request.build_absolute_uri('/')[:-1], + 'force_absolute_url': True, + } response = error404(request, exception=Http404()) response.status_code = 200 return response @@ -324,6 +327,7 @@ def skeleton(request): 'pages': pages, 'request': request, 'render_skeleton': True, + 'force_absolute_url': True, 'check_badges': should_check_badges(), 'site_base': request.build_absolute_uri('/')[:-1], } diff --git a/tests/test_public.py b/tests/test_public.py index 48ae78ca..46684f45 100644 --- a/tests/test_public.py +++ b/tests/test_public.py @@ -366,6 +366,10 @@ def test_page_skeleton(app): resp = app.get('/__skeleton__/?source=404') assert "This page doesn't exist" in resp.text assert resp.status_code == 200 + assert 'href="http://testserver/test/foobar"' in resp.text + assert 'href="http://www.example.com/test"' in resp.text + assert 'href="#top"' in resp.text + assert 'href="http://testserver/plop/"' in resp.text # do not consider empty redirection Page.objects.all().delete()