Skip to content

Commit 5b71843

Browse files
Dreamsorcererpatchback[bot]
authored andcommitted
Fix changing scheme/host in Response.clone() for absolute URLs (#8990)
(cherry picked from commit 731ba4d)
1 parent 7c3ff64 commit 5b71843

File tree

3 files changed

+30
-4
lines changed

3 files changed

+30
-4
lines changed

CHANGES/8990.bugfix.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fixed changing scheme/host in ``Response.clone()`` for absolute URLs -- by :user:`Dreamsorcerer`.

aiohttp/web_request.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,10 @@ def __init__(
175175
self._cache: Dict[str, Any] = {}
176176
url = message.url
177177
if url.is_absolute():
178+
if scheme is not None:
179+
url = url.with_scheme(scheme)
180+
if host is not None:
181+
url = url.with_host(host)
178182
# absolute URL is given,
179183
# override auto-calculating url, host, and scheme
180184
# all other properties should be good
@@ -184,6 +188,10 @@ def __init__(
184188
self._rel_url = url.relative()
185189
else:
186190
self._rel_url = message.url
191+
if scheme is not None:
192+
self._cache["scheme"] = scheme
193+
if host is not None:
194+
self._cache["host"] = host
187195
self._post: Optional[MultiDictProxy[Union[str, bytes, FileField]]] = None
188196
self._read_bytes: Optional[bytes] = None
189197

@@ -197,10 +205,6 @@ def __init__(
197205
self._transport_sslcontext = transport.get_extra_info("sslcontext")
198206
self._transport_peername = transport.get_extra_info("peername")
199207

200-
if scheme is not None:
201-
self._cache["scheme"] = scheme
202-
if host is not None:
203-
self._cache["host"] = host
204208
if remote is not None:
205209
self._cache["remote"] = remote
206210

tests/test_web_request.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,22 @@ def test_absolute_url() -> None:
169169
assert req.rel_url == URL.build(path="/path/to", query={"a": "1"})
170170

171171

172+
def test_clone_absolute_scheme() -> None:
173+
req = make_mocked_request("GET", "https://example.com/path/to?a=1")
174+
assert req.scheme == "https"
175+
req2 = req.clone(scheme="http")
176+
assert req2.scheme == "http"
177+
assert req2.url.scheme == "http"
178+
179+
180+
def test_clone_absolute_host() -> None:
181+
req = make_mocked_request("GET", "https://example.com/path/to?a=1")
182+
assert req.host == "example.com"
183+
req2 = req.clone(host="foo.test")
184+
assert req2.host == "foo.test"
185+
assert req2.url.host == "foo.test"
186+
187+
172188
def test_content_length() -> None:
173189
req = make_mocked_request("Get", "/", CIMultiDict([("CONTENT-LENGTH", "123")]))
174190

@@ -684,18 +700,23 @@ def test_save_state_on_clone() -> None:
684700

685701
def test_clone_scheme() -> None:
686702
req = make_mocked_request("GET", "/")
703+
assert req.scheme == "http"
687704
req2 = req.clone(scheme="https")
688705
assert req2.scheme == "https"
706+
assert req2.url.scheme == "https"
689707

690708

691709
def test_clone_host() -> None:
692710
req = make_mocked_request("GET", "/")
711+
assert req.host != "example.com"
693712
req2 = req.clone(host="example.com")
694713
assert req2.host == "example.com"
714+
assert req2.url.host == "example.com"
695715

696716

697717
def test_clone_remote() -> None:
698718
req = make_mocked_request("GET", "/")
719+
assert req.remote != "11.11.11.11"
699720
req2 = req.clone(remote="11.11.11.11")
700721
assert req2.remote == "11.11.11.11"
701722

0 commit comments

Comments
 (0)