diff --git a/CHANGES/3576.bugfix b/CHANGES/3576.bugfix new file mode 100644 index 00000000000..63215831e41 --- /dev/null +++ b/CHANGES/3576.bugfix @@ -0,0 +1 @@ +Fix an issue where cookies would sometimes not be set during a redirect. diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt index 5b7d89b81d5..94fac448b87 100644 --- a/CONTRIBUTORS.txt +++ b/CONTRIBUTORS.txt @@ -26,6 +26,7 @@ Alexey Popravka Alexey Stepanov Amin Etesamian Amy Boyle +Anders Melchiorsen Andrei Ursulenko Andrej Antonov Andrew Leech diff --git a/aiohttp/client.py b/aiohttp/client.py index d1fc7d3743d..2c21df55456 100644 --- a/aiohttp/client.py +++ b/aiohttp/client.py @@ -423,16 +423,14 @@ async def _request( "with AUTH argument or credentials " "encoded in URL") - session_cookies = self._cookie_jar.filter_cookies(url) + all_cookies = self._cookie_jar.filter_cookies(url) if cookies is not None: tmp_cookie_jar = CookieJar() tmp_cookie_jar.update_cookies(cookies) req_cookies = tmp_cookie_jar.filter_cookies(url) if req_cookies: - session_cookies.load(req_cookies) - - cookies = session_cookies + all_cookies.load(req_cookies) if proxy is not None: proxy = URL(proxy) @@ -446,7 +444,7 @@ async def _request( req = self._request_class( method, url, params=params, headers=headers, skip_auto_headers=skip_headers, data=data, - cookies=cookies, auth=auth, version=version, + cookies=all_cookies, auth=auth, version=version, compress=compress, chunked=chunked, expect100=expect100, loop=self._loop, response_class=self._response_class, diff --git a/tests/test_client_functional.py b/tests/test_client_functional.py index 1e1ba20ae63..bfdb39a4f21 100644 --- a/tests/test_client_functional.py +++ b/tests/test_client_functional.py @@ -1884,6 +1884,34 @@ async def handler(request): resp.close() +async def test_cookies_redirect(aiohttp_client) -> None: + + async def redirect1(request): + ret = web.Response(status=301, headers={'Location': '/redirect2'}) + ret.set_cookie('c', '1') + return ret + + async def redirect2(request): + ret = web.Response(status=301, headers={'Location': '/'}) + ret.set_cookie('c', '2') + return ret + + async def handler(request): + assert request.cookies.keys() == {'c'} + assert request.cookies['c'] == '2' + return web.Response() + + app = web.Application() + app.router.add_get('/redirect1', redirect1) + app.router.add_get('/redirect2', redirect2) + app.router.add_get('/', handler) + + client = await aiohttp_client(app) + resp = await client.get('/redirect1') + assert 200 == resp.status + resp.close() + + async def test_cookies_on_empty_session_jar(aiohttp_client) -> None: async def handler(request): assert 'custom-cookie' in request.cookies