From d22ac00098475367ea0c0725d7db94d7967b09b1 Mon Sep 17 00:00:00 2001 From: Chase Sterling Date: Thu, 4 Apr 2013 22:11:38 -0400 Subject: [PATCH 1/3] fix #1287: Make sure expired cookies get removed from session.cookies --- requests/sessions.py | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/requests/sessions.py b/requests/sessions.py index ff40a6cb..f37d009d 100644 --- a/requests/sessions.py +++ b/requests/sessions.py @@ -12,7 +12,7 @@ import os from datetime import datetime from .compat import cookielib -from .cookies import cookiejar_from_dict +from .cookies import cookiejar_from_dict, extract_cookies_to_jar from .models import Request, PreparedRequest from .hooks import default_hooks, dispatch_hook from .utils import from_key_val_list, default_headers @@ -91,10 +91,6 @@ class SessionRedirectMixin(object): prepared_request.method = req.method prepared_request.url = req.url - cookiejar = cookiejar_from_dict({}) - cookiejar.update(self.cookies) - cookiejar.update(resp.cookies) - # ((resp.status_code is codes.see_other)) while (('location' in resp.headers and resp.status_code in REDIRECT_STATI)): @@ -147,7 +143,7 @@ class SessionRedirectMixin(object): except KeyError: pass - prepared_request.prepare_cookies(cookiejar) + prepared_request.prepare_cookies(self.cookies) resp = self.send( prepared_request, @@ -159,12 +155,12 @@ class SessionRedirectMixin(object): allow_redirects=False, ) - cookiejar.update(resp.cookies) + extract_cookies_to_jar(self.cookies, prepared_request, resp.raw) i += 1 yield resp - resp.cookies.update(cookiejar) + resp.cookies = self.cookies.copy() class Session(SessionRedirectMixin): @@ -349,9 +345,6 @@ class Session(SessionRedirectMixin): } resp = self.send(prep, **send_kwargs) - # Persist cookies. - self.cookies.update(resp.cookies) - return resp def get(self, url, **kwargs): @@ -460,6 +453,9 @@ class Session(SessionRedirectMixin): # Response manipulation hooks r = dispatch_hook('response', hooks, r, **kwargs) + # Persist cookies + extract_cookies_to_jar(self.cookies, request, r.raw) + # Redirect resolving generator. gen = self.resolve_redirects(r, request, stream=stream, timeout=timeout, verify=verify, cert=cert, From 88f13598f32bd2da4099f4bb61a082d63fcf42c7 Mon Sep 17 00:00:00 2001 From: Chase Sterling Date: Thu, 4 Apr 2013 22:40:27 -0400 Subject: [PATCH 2/3] Add a unit test for server expiring cookies from session --- test_requests.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/test_requests.py b/test_requests.py index 93b81236..c0cb0549 100644 --- a/test_requests.py +++ b/test_requests.py @@ -124,6 +124,19 @@ class RequestsTestCase(unittest.TestCase): r = s.get(httpbin('redirect/1')) # redirects to httpbin('get') self.assertTrue("Cookie" in r.json()["headers"]) + def test_cookie_removed_on_expire(self): + s = requests.session() + s.get(httpbin('cookies/set?foo=bar')) + self.assertTrue(s.cookies['foo'] == 'bar') + s.get( + httpbin('response-headers'), + params={ + 'Set-Cookie': + 'foo=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT' + } + ) + self.assertNotIn('foo', s.cookies) + def test_user_agent_transfers(self): heads = { From 5c47ce1136ed12e992fe3404b8e6634060bcd411 Mon Sep 17 00:00:00 2001 From: Chase Sterling Date: Thu, 4 Apr 2013 22:48:14 -0400 Subject: [PATCH 3/3] Make sure unit test works on python 2.6 --- test_requests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test_requests.py b/test_requests.py index c0cb0549..5a0ed980 100644 --- a/test_requests.py +++ b/test_requests.py @@ -135,7 +135,7 @@ class RequestsTestCase(unittest.TestCase): 'foo=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT' } ) - self.assertNotIn('foo', s.cookies) + assert 'foo' not in s.cookies def test_user_agent_transfers(self):