diff --git a/CHANGES/10074.feature.rst b/CHANGES/10074.feature.rst new file mode 100644 index 00000000000..d956c38af57 --- /dev/null +++ b/CHANGES/10074.feature.rst @@ -0,0 +1,2 @@ +Added support for overriding the base URL with an absolute one in client sessions +-- by :user:`vivodi`. diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt index 6adb3b97fb1..c3abc66bebf 100644 --- a/CONTRIBUTORS.txt +++ b/CONTRIBUTORS.txt @@ -52,6 +52,7 @@ Arseny Timoniq Artem Yushkovskiy Arthur Darcet Austin Scola +Bai Haoran Ben Bader Ben Greiner Ben Kallus diff --git a/aiohttp/client.py b/aiohttp/client.py index e04a6ff989a..7539310aa8a 100644 --- a/aiohttp/client.py +++ b/aiohttp/client.py @@ -461,11 +461,9 @@ def request( def _build_url(self, str_or_url: StrOrURL) -> URL: url = URL(str_or_url) - if self._base_url is None: - return url - else: - assert not url.absolute + if self._base_url and not url.absolute: return self._base_url.join(url) + return url async def _request( self, diff --git a/docs/client_reference.rst b/docs/client_reference.rst index c9031de5383..7e7cdf12184 100644 --- a/docs/client_reference.rst +++ b/docs/client_reference.rst @@ -79,6 +79,10 @@ The client session supports the context manager protocol for self closing. .. versionadded:: 3.8 + .. versionchanged:: 3.12 + + Added support for overriding the base URL with an absolute one in client sessions. + :param aiohttp.BaseConnector connector: BaseConnector sub-class instance to support connection pooling. diff --git a/tests/test_client_session.py b/tests/test_client_session.py index 65f80b6abe9..a2c4833b83e 100644 --- a/tests/test_client_session.py +++ b/tests/test_client_session.py @@ -1086,6 +1086,24 @@ async def test_requote_redirect_setter() -> None: URL("http://example.com/test1/test2?q=foo#bar"), id="base_url=URL('http://example.com/test1/') url='test2?q=foo#bar'", ), + pytest.param( + URL("http://example.com/test1/"), + "http://foo.com/bar", + URL("http://foo.com/bar"), + id="base_url=URL('http://example.com/test1/') url='http://foo.com/bar'", + ), + pytest.param( + URL("http://example.com"), + "http://foo.com/bar", + URL("http://foo.com/bar"), + id="base_url=URL('http://example.com') url='http://foo.com/bar'", + ), + pytest.param( + URL("http://example.com/test1/"), + "http://foo.com", + URL("http://foo.com"), + id="base_url=URL('http://example.com/test1/') url='http://foo.com'", + ), ], ) async def test_build_url_returns_expected_url(