diff --git a/requests/cookies.py b/requests/cookies.py index a4140adf..c465f552 100644 --- a/requests/cookies.py +++ b/requests/cookies.py @@ -421,3 +421,25 @@ def cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True): cookiejar.set_cookie(create_cookie(name, cookie_dict[name])) return cookiejar + + +def merge_cookies(cookiejar, cookies): + """Add cookies to cookiejar and returns a merged CookieJar. + + :param cookiejar: CookieJar object to add the cookies to. + :param cookies: Dictionary or CookieJar object to be added. + """ + if not isinstance(cookiejar, cookielib.CookieJar): + raise ValueError('You can only merge into CookieJar') + + if isinstance(cookies, dict): + cookiejar = cookiejar_from_dict( + cookies, cookiejar=cookiejar, overwrite=False) + elif isinstance(cookies, cookielib.CookieJar): + try: + cookiejar.update(cookies) + except AttributeError: + for cookie_in_jar in cookies: + cookiejar.set_cookie(cookie_in_jar) + + return cookiejar diff --git a/requests/sessions.py b/requests/sessions.py index 9c95b58d..ab60aa8e 100644 --- a/requests/sessions.py +++ b/requests/sessions.py @@ -13,7 +13,8 @@ from collections import Mapping from datetime import datetime from .compat import cookielib, OrderedDict, urljoin, urlparse, builtin_str -from .cookies import cookiejar_from_dict, extract_cookies_to_jar, RequestsCookieJar +from .cookies import ( + cookiejar_from_dict, extract_cookies_to_jar, RequestsCookieJar, merge_cookies) from .models import Request, PreparedRequest from .hooks import default_hooks, dispatch_hook from .utils import to_key_val_list, default_headers @@ -245,9 +246,8 @@ class Session(SessionRedirectMixin): cookies = cookiejar_from_dict(cookies) # Merge with session cookies - merged_cookies = RequestsCookieJar() - merged_cookies.update(self.cookies) - merged_cookies.update(cookies) + merged_cookies = merge_cookies( + merge_cookies(RequestsCookieJar(), self.cookies), cookies) # Set environment's basic authentication if not explicitly set. @@ -330,7 +330,7 @@ class Session(SessionRedirectMixin): prep = self.prepare_request(req) # Add param cookies to session cookies - self.cookies = cookiejar_from_dict(cookies, cookiejar=self.cookies, overwrite=False) + self.cookies = merge_cookies(self.cookies, cookies) proxies = proxies or {} diff --git a/test_requests.py b/test_requests.py index 3b673956..539de764 100755 --- a/test_requests.py +++ b/test_requests.py @@ -187,6 +187,14 @@ class RequestsTestCase(unittest.TestCase): assert r.json()['cookies']['foo'] == 'bar' # Make sure the session cj is still the custom one assert s.cookies is cj + + def test_param_cookiejar_works(self): + cj = cookielib.CookieJar() + cookiejar_from_dict({'foo' : 'bar'}, cj) + s = requests.session() + r = s.get(httpbin('cookies'), cookies=cj) + # Make sure the cookie was sent + assert r.json()['cookies']['foo'] == 'bar' def test_requests_in_history_are_not_overridden(self): resp = requests.get(httpbin('redirect/3'))