diff --git a/requests/auth.py b/requests/auth.py index f87087df..6664cd80 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..34dce181 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..06e17d4b 100644 --- a/requests/sessions.py +++ b/requests/sessions.py @@ -153,7 +153,9 @@ 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 +347,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. 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)