From e958511df085ace98cfcc45c69129553ba07ee9e Mon Sep 17 00:00:00 2001 From: Miikka Koskinen Date: Sat, 9 Mar 2013 09:16:33 +0200 Subject: [PATCH 1/3] Add failing test case for #1228 --- test_requests.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test_requests.py b/test_requests.py index 31d9fbf9..64003cfc 100644 --- a/test_requests.py +++ b/test_requests.py @@ -118,6 +118,12 @@ class RequestsTestCase(unittest.TestCase): r = s.get(url) self.assertTrue(s.cookies['foo'] == 'bar') + def test_cookie_sent_on_redirect(self): + s = requests.session() + s.get(httpbin('cookies/set?foo=bar')) + r = s.get(httpbin('redirect/1')) # redirects to httpbin('get') + self.assertTrue("Cookie" in r.json()["headers"]) + def test_user_agent_transfers(self): heads = { From 5bb2be9a2300ccc3c1901d2f85afb79cfb9e02f1 Mon Sep 17 00:00:00 2001 From: Miikka Koskinen Date: Sat, 9 Mar 2013 12:53:38 +0200 Subject: [PATCH 2/3] Use session cookies when following redirects When a redirect was followed, only the cookies set by the initial response were used in the follow-up request. Fixes #1228. --- requests/sessions.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/requests/sessions.py b/requests/sessions.py index 979c0034..c9126c12 100644 --- a/requests/sessions.py +++ b/requests/sessions.py @@ -80,7 +80,7 @@ def merge_kwargs(local_kwarg, default_kwarg): class SessionRedirectMixin(object): def resolve_redirects(self, resp, req, stream=False, timeout=None, - verify=True, cert=None, proxies=None): + verify=True, cert=None, proxies=None, cookies=None): """Receives a Response. Returns a generator of Responses.""" i = 0 @@ -90,7 +90,10 @@ class SessionRedirectMixin(object): prepared_request.hooks = req.hooks prepared_request.method = req.method prepared_request.url = req.url - cookiejar = resp.cookies + + cookiejar = cookiejar_from_dict({}) + cookiejar.update(cookies) + cookiejar.update(resp.cookies) # ((resp.status_code is codes.see_other)) while (('location' in resp.headers and resp.status_code in REDIRECT_STATI)): @@ -408,6 +411,7 @@ class Session(SessionRedirectMixin): cert = kwargs.get('cert') proxies = kwargs.get('proxies') hooks = request.hooks + cookies = self.cookies # Get the appropriate adapter to use adapter = self.get_adapter(url=request.url) @@ -425,7 +429,7 @@ class Session(SessionRedirectMixin): # Redirect resolving generator. gen = self.resolve_redirects(r, request, stream=stream, timeout=timeout, verify=verify, cert=cert, - proxies=proxies) + proxies=proxies, cookies=cookies) # Resolve redirects if allowed. history = [resp for resp in gen] if allow_redirects else [] From 120a2f385a4d1b652451e6a6d8dc618437f72529 Mon Sep 17 00:00:00 2001 From: Miikka Koskinen Date: Tue, 12 Mar 2013 18:25:19 +0200 Subject: [PATCH 3/3] Do not pass cookies to resolve_redirects SessionRedirectMixin is extending Session, so we can just use self.cookies. --- requests/sessions.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/requests/sessions.py b/requests/sessions.py index c9126c12..fe0a84e1 100644 --- a/requests/sessions.py +++ b/requests/sessions.py @@ -80,7 +80,7 @@ def merge_kwargs(local_kwarg, default_kwarg): class SessionRedirectMixin(object): def resolve_redirects(self, resp, req, stream=False, timeout=None, - verify=True, cert=None, proxies=None, cookies=None): + verify=True, cert=None, proxies=None): """Receives a Response. Returns a generator of Responses.""" i = 0 @@ -92,7 +92,7 @@ class SessionRedirectMixin(object): prepared_request.url = req.url cookiejar = cookiejar_from_dict({}) - cookiejar.update(cookies) + cookiejar.update(self.cookies) cookiejar.update(resp.cookies) # ((resp.status_code is codes.see_other)) @@ -411,7 +411,6 @@ class Session(SessionRedirectMixin): cert = kwargs.get('cert') proxies = kwargs.get('proxies') hooks = request.hooks - cookies = self.cookies # Get the appropriate adapter to use adapter = self.get_adapter(url=request.url) @@ -429,7 +428,7 @@ class Session(SessionRedirectMixin): # Redirect resolving generator. gen = self.resolve_redirects(r, request, stream=stream, timeout=timeout, verify=verify, cert=cert, - proxies=proxies, cookies=cookies) + proxies=proxies) # Resolve redirects if allowed. history = [resp for resp in gen] if allow_redirects else []