From 204d1b596f285c037a811a3ed48158965e7ec4a6 Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Mon, 11 Feb 2019 10:26:18 +0000 Subject: [PATCH] Don't drop explict port on HTTPS redirects (#382) --- starlette/middleware/httpsredirect.py | 5 +++-- tests/middleware/test_https_redirect.py | 10 ++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/starlette/middleware/httpsredirect.py b/starlette/middleware/httpsredirect.py index 6420804b..654defa7 100644 --- a/starlette/middleware/httpsredirect.py +++ b/starlette/middleware/httpsredirect.py @@ -9,9 +9,10 @@ class HTTPSRedirectMiddleware: def __call__(self, scope: Scope) -> ASGIInstance: if scope["type"] in ("http", "websocket") and scope["scheme"] in ("http", "ws"): - redirect_scheme = {"http": "https", "ws": "wss"}[scope["scheme"]] url = URL(scope=scope) - url = url.replace(scheme=redirect_scheme, netloc=url.hostname) + redirect_scheme = {"http": "https", "ws": "wss"}[url.scheme] + netloc = url.hostname if url.port in (80, 443) else url.netloc + url = url.replace(scheme=redirect_scheme, netloc=netloc) return RedirectResponse(url, status_code=301) return self.app(scope) diff --git a/tests/middleware/test_https_redirect.py b/tests/middleware/test_https_redirect.py index c36f24e4..5e96f787 100644 --- a/tests/middleware/test_https_redirect.py +++ b/tests/middleware/test_https_redirect.py @@ -21,3 +21,13 @@ def test_https_redirect_middleware(): response = client.get("/", allow_redirects=False) assert response.status_code == 301 assert response.headers["location"] == "https://testserver/" + + client = TestClient(app, base_url="http://testserver:80") + response = client.get("/", allow_redirects=False) + assert response.status_code == 301 + assert response.headers["location"] == "https://testserver/" + + client = TestClient(app, base_url="http://testserver:123") + response = client.get("/", allow_redirects=False) + assert response.status_code == 301 + assert response.headers["location"] == "https://testserver:123/"