From 5b30e960eb6ebb62f22c52653f4b134e917594a2 Mon Sep 17 00:00:00 2001 From: Chase Sterling Date: Wed, 6 Nov 2013 19:39:56 -0500 Subject: [PATCH 1/3] Add a test case for request cookies persisting to session. refs #1728 --- test_requests.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/test_requests.py b/test_requests.py index 1d68c81f..617e6a7f 100755 --- a/test_requests.py +++ b/test_requests.py @@ -165,7 +165,7 @@ class RequestsTestCase(unittest.TestCase): def test_cookie_persists_via_api(self): s = requests.session() - r = s.get(httpbin('redirect/1'), cookies={'foo':'bar'}) + r = s.get(httpbin('redirect/1'), cookies={'foo': 'bar'}) assert 'foo' in r.request.headers['Cookie'] assert 'foo' in r.history[0].request.headers['Cookie'] @@ -177,6 +177,12 @@ class RequestsTestCase(unittest.TestCase): # Session cookie should not be modified assert s.cookies['foo'] == 'bar' + def test_request_cookies_not_persisted(self): + s = requests.session() + s.get(httpbin('cookies'), cookies={'foo': 'baz'}) + # Sending a request with cookies should not add cookies to the session + assert not s.cookies + def test_generic_cookiejar_works(self): cj = cookielib.CookieJar() cookiejar_from_dict({'foo': 'bar'}, cj) From 8bfe0d873f382ec92e4000084bb7e00505bc29b2 Mon Sep 17 00:00:00 2001 From: Chase Sterling Date: Wed, 6 Nov 2013 21:52:21 -0500 Subject: [PATCH 2/3] Store the request cookiejar in PreparedRequest.cookies fix #1728 Conflicts: requests/sessions.py --- requests/auth.py | 4 +++- requests/models.py | 15 +++++++++------ requests/sessions.py | 6 ++---- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/requests/auth.py b/requests/auth.py index f87087df..ba979b59 100644 --- a/requests/auth.py +++ b/requests/auth.py @@ -16,6 +16,7 @@ import logging from base64 import b64encode from .compat import urlparse, str +from .cookies import extract_cookies_to_jar from .utils import parse_dict_header log = logging.getLogger(__name__) @@ -169,7 +170,8 @@ class HTTPDigestAuth(AuthBase): r.content r.raw.release_conn() prep = r.request.copy() - prep.prepare_cookies(r.cookies) + extract_cookies_to_jar(prep.cookies, r.request, r.raw) + prep.prepare_cookies(prep.cookies) prep.headers['Authorization'] = self.build_digest_header( prep.method, prep.url) diff --git a/requests/models.py b/requests/models.py index c68f9118..31d120e8 100644 --- a/requests/models.py +++ b/requests/models.py @@ -270,6 +270,9 @@ class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): self.url = None #: dictionary of HTTP headers. self.headers = None + #: The `CookieJar` used to create the Cookie header will be stored here + #: after prepare_cookies is called + self.cookies = None #: request body to send to the server. self.body = None #: dictionary of callback hooks, for internal usage. @@ -299,6 +302,7 @@ class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): p.method = self.method p.url = self.url p.headers = self.headers.copy() + p.cookies = self.cookies.copy() p.body = self.body p.hooks = self.hooks return p @@ -474,14 +478,13 @@ class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): """Prepares the given HTTP cookie data.""" if isinstance(cookies, cookielib.CookieJar): - cookies = cookies + self.cookies = cookies else: - cookies = cookiejar_from_dict(cookies) + self.cookies = cookiejar_from_dict(cookies) - if 'cookie' not in self.headers: - cookie_header = get_cookie_header(cookies, self) - if cookie_header is not None: - self.headers['Cookie'] = cookie_header + cookie_header = get_cookie_header(self.cookies, self) + if cookie_header is not None: + self.headers['Cookie'] = cookie_header def prepare_hooks(self, hooks): """Prepares the given hooks.""" diff --git a/requests/sessions.py b/requests/sessions.py index cdce6484..52adb7a0 100644 --- a/requests/sessions.py +++ b/requests/sessions.py @@ -153,7 +153,8 @@ class SessionRedirectMixin(object): except KeyError: pass - prepared_request.prepare_cookies(self.cookies) + extract_cookies_to_jar(prepared_request.cookies, prepared_request, resp.raw) + prepared_request.prepare_cookies(prepared_request.cookies) resp = self.send( prepared_request, @@ -345,9 +346,6 @@ class Session(SessionRedirectMixin): ) prep = self.prepare_request(req) - # Add param cookies to session cookies - self.cookies = merge_cookies(self.cookies, cookies) - proxies = proxies or {} # Gather clues from the surrounding environment. From e8bdcdb0a754ce3ec46fe167dfbd0e23f22e5ff7 Mon Sep 17 00:00:00 2001 From: Ian Cordasco Date: Wed, 4 Dec 2013 06:45:18 -0600 Subject: [PATCH 3/3] Address feedback from #1729 - Make the PreparedRequest's cookie jar an implementation detail --- requests/auth.py | 4 ++-- requests/models.py | 14 +++++++------- requests/sessions.py | 5 +++-- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/requests/auth.py b/requests/auth.py index ba979b59..6664cd80 100644 --- a/requests/auth.py +++ b/requests/auth.py @@ -170,8 +170,8 @@ class HTTPDigestAuth(AuthBase): r.content r.raw.release_conn() prep = r.request.copy() - extract_cookies_to_jar(prep.cookies, r.request, r.raw) - prep.prepare_cookies(prep.cookies) + extract_cookies_to_jar(prep._cookies, r.request, r.raw) + prep.prepare_cookies(prep._cookies) prep.headers['Authorization'] = self.build_digest_header( prep.method, prep.url) diff --git a/requests/models.py b/requests/models.py index 31d120e8..34dce181 100644 --- a/requests/models.py +++ b/requests/models.py @@ -270,9 +270,9 @@ class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): self.url = None #: dictionary of HTTP headers. self.headers = None - #: The `CookieJar` used to create the Cookie header will be stored here - #: after prepare_cookies is called - self.cookies = None + # The `CookieJar` used to create the Cookie header will be stored here + # after prepare_cookies is called + self._cookies = None #: request body to send to the server. self.body = None #: dictionary of callback hooks, for internal usage. @@ -302,7 +302,7 @@ class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): p.method = self.method p.url = self.url p.headers = self.headers.copy() - p.cookies = self.cookies.copy() + p._cookies = self._cookies.copy() p.body = self.body p.hooks = self.hooks return p @@ -478,11 +478,11 @@ class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): """Prepares the given HTTP cookie data.""" if isinstance(cookies, cookielib.CookieJar): - self.cookies = cookies + self._cookies = cookies else: - self.cookies = cookiejar_from_dict(cookies) + self._cookies = cookiejar_from_dict(cookies) - cookie_header = get_cookie_header(self.cookies, self) + cookie_header = get_cookie_header(self._cookies, self) if cookie_header is not None: self.headers['Cookie'] = cookie_header diff --git a/requests/sessions.py b/requests/sessions.py index 52adb7a0..06e17d4b 100644 --- a/requests/sessions.py +++ b/requests/sessions.py @@ -153,8 +153,9 @@ class SessionRedirectMixin(object): except KeyError: pass - extract_cookies_to_jar(prepared_request.cookies, prepared_request, resp.raw) - prepared_request.prepare_cookies(prepared_request.cookies) + extract_cookies_to_jar(prepared_request._cookies, + prepared_request, resp.raw) + prepared_request.prepare_cookies(prepared_request._cookies) resp = self.send( prepared_request,