diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 7dbbc9a1e..696cfd0a5 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -7,6 +7,7 @@ Changelog * Added support for customising EditHandler-based forms on a per-request basis (Bertrand Bordage) * Added more informative error message when `|richtext` filter is applied to a non-string value (mukesh5) * Fix: Set `SERVER_PORT` to 443 in `Page.dummy_request()` for HTTPS sites (Sergey Fedoseev) + * Fix: Include port number in `Host` header of `Page.dummy_request()` (Sergey Fedoseev) * Fix: Validation error messages in `InlinePanel` no longer count towards `max_num` when disabling the 'add' button (Todd Dembrey, Thibaud Colas) diff --git a/docs/releases/2.5.rst b/docs/releases/2.5.rst index bca756cb9..b858a371a 100644 --- a/docs/releases/2.5.rst +++ b/docs/releases/2.5.rst @@ -22,6 +22,7 @@ Bug fixes ~~~~~~~~~ * Set ``SERVER_PORT`` to 443 in ``Page.dummy_request()`` for HTTPS sites (Sergey Fedoseev) + * Include port number in ``Host`` header of ``Page.dummy_request()`` (Sergey Fedoseev) * Validation error messages in ``InlinePanel`` no longer count towards ``max_num`` when disabling the 'add' button (Todd Dembrey, Thibaud Colas) diff --git a/wagtail/core/models.py b/wagtail/core/models.py index 7c154a370..ea9452927 100644 --- a/wagtail/core/models.py +++ b/wagtail/core/models.py @@ -1224,13 +1224,16 @@ class Page(AbstractPage, index.Indexed, ClusterableModel, metaclass=PageBase): port = 80 scheme = 'http' + http_host = hostname + if port != (443 if scheme == 'https' else 80): + http_host = '%s:%s' % (http_host, port) dummy_values = { 'REQUEST_METHOD': 'GET', 'PATH_INFO': path, 'SERVER_NAME': hostname, 'SERVER_PORT': port, 'SERVER_PROTOCOL': 'HTTP/1.1', - 'HTTP_HOST': hostname, + 'HTTP_HOST': http_host, 'wsgi.version': (1, 0), 'wsgi.input': StringIO(), 'wsgi.errors': StringIO(), diff --git a/wagtail/core/tests/test_page_model.py b/wagtail/core/tests/test_page_model.py index 18fdb69d0..a268b1467 100644 --- a/wagtail/core/tests/test_page_model.py +++ b/wagtail/core/tests/test_page_model.py @@ -1382,6 +1382,31 @@ class TestDummyRequest(TestCase): self.assertIn('wsgi.multiprocess', request.META) self.assertIn('wsgi.run_once', request.META) + def test_dummy_request_for_accessible_page_non_standard_port(self): + Site.objects.update(port=8888) + + 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:8888') + + # 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'], 8888) + self.assertEqual(request.META['SERVER_PROTOCOL'], 'HTTP/1.1') + self.assertEqual(request.META['wsgi.version'], (1, 0)) + self.assertEqual(request.META['wsgi.url_scheme'], 'http') + 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 = {