Make sure session cookies do not overwrite explicit request cookies
authorChase Sterling <chase.sterling@gmail.com>
Sat, 16 Feb 2013 05:56:59 +0000 (00:56 -0500)
committerChase Sterling <chase.sterling@gmail.com>
Sat, 16 Feb 2013 05:56:59 +0000 (00:56 -0500)
Implement RequestsCookieJar.copy
Use RequestsCookieJar.update when merging cookiejars

requests/cookies.py
requests/sessions.py
requests/utils.py

index 856258c706cc61c849521ff10bfda5c945e5769b..1235711f4414a3a9ba36e57d73d2e38ca184967c 100644 (file)
@@ -307,8 +307,10 @@ class RequestsCookieJar(cookielib.CookieJar, collections.MutableMapping):
             self._cookies_lock = threading.RLock()
 
     def copy(self):
-        """This is not implemented. Calling this will throw an exception."""
-        raise NotImplementedError
+        """Return a copy of this RequestsCookieJar."""
+        new_cj = RequestsCookieJar()
+        new_cj.update(self)
+        return new_cj
 
 
 def create_cookie(name, value, **kwargs):
index c53ccfc43727e9542ac3ca84508f0a1ce7c56e94..615075a3657a2537c5052a6846f3e4857ca72b4f 100644 (file)
@@ -251,9 +251,10 @@ class Session(SessionRedirectMixin):
         if not isinstance(cookies, cookielib.CookieJar):
             cookies = cookiejar_from_dict(cookies)
 
-        # Bubble down session cookies.
-        for cookie in self.cookies:
-            cookies.set_cookie(cookie)
+        # Merge with session cookies
+        merged_cookies = self.cookies.copy()
+        merged_cookies.update(cookies)
+        cookies = merged_cookies
 
         # Gather clues from the surrounding environment.
         if self.trust_env:
@@ -312,8 +313,7 @@ class Session(SessionRedirectMixin):
         resp = self.send(prep, **send_kwargs)
 
         # Persist cookies.
-        for cookie in resp.cookies:
-            self.cookies.set_cookie(cookie)
+        self.cookies.update(resp.cookies)
 
         return resp
 
index bb07f83ff1c5a250b59dd53b2f8971298cbc1b23..a2d434effdb6d8fa291abeef27b3d7a43b91db0a 100644 (file)
@@ -252,8 +252,7 @@ def add_dict_to_cookiejar(cj, cookie_dict):
     """
 
     cj2 = cookiejar_from_dict(cookie_dict)
-    for cookie in cj2:
-        cj.set_cookie(cookie)
+    cj.update(cj2)
     return cj