diff --git a/CHANGELOG.txt b/CHANGELOG.txt index a20289d865..98e63ccfac 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -4,6 +4,8 @@ Changelog 2.5 (xx.xx.xxxx) - IN DEVELOPMENT ~~~~~~~~~~~~~~~~ +* Fix: Set `SERVER_PORT` to 443 in `Page.dummy_request()` for HTTPS sites (Sergey Fedoseev) + 2.4 (xx.xx.xxxx) - IN DEVELOPMENT ~~~~~~~~~~~~~~~~ diff --git a/docs/releases/2.5.rst b/docs/releases/2.5.rst index 0e0e640231..3e12b8f043 100644 --- a/docs/releases/2.5.rst +++ b/docs/releases/2.5.rst @@ -18,6 +18,8 @@ Other features Bug fixes ~~~~~~~~~ + * Set ``SERVER_PORT`` to 443 in ``Page.dummy_request()`` for HTTPS sites (Sergey Fedoseev) + Upgrade considerations ====================== diff --git a/wagtail/core/models.py b/wagtail/core/models.py index 088202dd10..ad42af0989 100644 --- a/wagtail/core/models.py +++ b/wagtail/core/models.py @@ -1215,7 +1215,7 @@ class Page(AbstractPage, index.Indexed, ClusterableModel, metaclass=PageBase): url_info = urlparse(url) hostname = url_info.hostname path = url_info.path - port = url_info.port or 80 + port = url_info.port or (443 if url_info.scheme == 'https' else 80) scheme = url_info.scheme else: # Cannot determine a URL to this page - cobble one together based on diff --git a/wagtail/core/tests/test_page_model.py b/wagtail/core/tests/test_page_model.py index 71add730e2..935f3a3c27 100644 --- a/wagtail/core/tests/test_page_model.py +++ b/wagtail/core/tests/test_page_model.py @@ -1364,6 +1364,31 @@ class TestDummyRequest(TestCase): self.assertIn('wsgi.multiprocess', request.META) self.assertIn('wsgi.run_once', request.META) + def test_dummy_request_for_accessible_page_https(self): + Site.objects.update(port=443) + + event_index = Page.objects.get(url_path='/home/events/') + request = event_index.dummy_request() + + # request should have the correct path and hostname for this page + self.assertEqual(request.path, '/events/') + self.assertEqual(request.META['HTTP_HOST'], 'localhost') + + # check other env vars required by the WSGI spec + self.assertEqual(request.META['REQUEST_METHOD'], 'GET') + self.assertEqual(request.META['SCRIPT_NAME'], '') + self.assertEqual(request.META['PATH_INFO'], '/events/') + self.assertEqual(request.META['SERVER_NAME'], 'localhost') + self.assertEqual(request.META['SERVER_PORT'], 443) + self.assertEqual(request.META['SERVER_PROTOCOL'], 'HTTP/1.1') + self.assertEqual(request.META['wsgi.version'], (1, 0)) + self.assertEqual(request.META['wsgi.url_scheme'], 'https') + self.assertIn('wsgi.input', request.META) + self.assertIn('wsgi.errors', request.META) + self.assertIn('wsgi.multithread', request.META) + self.assertIn('wsgi.multiprocess', request.META) + self.assertIn('wsgi.run_once', request.META) + def test_dummy_request_for_accessible_page_with_original_request(self): event_index = Page.objects.get(url_path='/home/events/') original_headers = {