From 2bbd7ba1c2c5a56c0957be64b5f94f6a4b0243ca Mon Sep 17 00:00:00 2001 From: daftshady Date: Tue, 29 Oct 2013 23:18:03 +0900 Subject: [PATCH 1/9] Fixed #1711 --- requests/sessions.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/requests/sessions.py b/requests/sessions.py index 9c95b58d..a5cb8970 100644 --- a/requests/sessions.py +++ b/requests/sessions.py @@ -330,7 +330,11 @@ 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) + if isinstance(cookies, dict): + self.cookies = cookiejar_from_dict( + cookies, cookiejar=self.cookies, overwrite=False) + elif isinstance(cookies, cookielib.CookieJar): + self.cookies.update(cookies) proxies = proxies or {} From e3c771f36bbec5d116181229b58182435a2da461 Mon Sep 17 00:00:00 2001 From: daftshady Date: Wed, 30 Oct 2013 01:58:01 +0900 Subject: [PATCH 2/9] added test case related to #1711 --- test_requests.py | 8 ++++++++ 1 file changed, 8 insertions(+) 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')) From e40c1637c915e112fabaffb39fcd73beed56ff4b Mon Sep 17 00:00:00 2001 From: daftshady Date: Tue, 5 Nov 2013 16:09:49 +0900 Subject: [PATCH 3/9] added new method 'merge_cookies' and use it when merging session cookies with param cookies. --- requests/cookies.py | 19 +++++++++++++++++++ requests/sessions.py | 11 ++++------- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/requests/cookies.py b/requests/cookies.py index a4140adf..45c46857 100644 --- a/requests/cookies.py +++ b/requests/cookies.py @@ -421,3 +421,22 @@ 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.update( + cookiejar_from_dict( + cookies, cookiejar=cookiejar, overwrite=False)) + elif isinstance(cookies, cookielib.CookieJar): + cookiejar.update(cookies) + + return cookiejar diff --git a/requests/sessions.py b/requests/sessions.py index a5cb8970..c8d8c715 100644 --- a/requests/sessions.py +++ b/requests/sessions.py @@ -12,8 +12,9 @@ import os 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 .compat import cookielib, OrderedDict, urljoin, urlparse, urlunparse, builtin_str +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 @@ -330,11 +331,7 @@ class Session(SessionRedirectMixin): prep = self.prepare_request(req) # Add param cookies to session cookies - if isinstance(cookies, dict): - self.cookies = cookiejar_from_dict( - cookies, cookiejar=self.cookies, overwrite=False) - elif isinstance(cookies, cookielib.CookieJar): - self.cookies.update(cookies) + self.cookies = merge_cookies(self.cookies, cookies) proxies = proxies or {} From 30018e604c0f89a0dad7d8b7e6f2a227916ee8c9 Mon Sep 17 00:00:00 2001 From: daftshady Date: Tue, 5 Nov 2013 16:15:35 +0900 Subject: [PATCH 4/9] update 'merge_cookies' --- requests/cookies.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/requests/cookies.py b/requests/cookies.py index 45c46857..df614a2d 100644 --- a/requests/cookies.py +++ b/requests/cookies.py @@ -433,9 +433,8 @@ def merge_cookies(cookiejar, cookies): raise ValueError('You can only merge into CookieJar') if isinstance(cookies, dict): - cookiejar.update( - cookiejar_from_dict( - cookies, cookiejar=cookiejar, overwrite=False)) + cookiejar = cookiejar_from_dict( + cookies, cookiejar=cookiejar, overwrite=False) elif isinstance(cookies, cookielib.CookieJar): cookiejar.update(cookies) From 1adba3c9e94a7408584d0d819da6aa47b34ed0bd Mon Sep 17 00:00:00 2001 From: daftshady Date: Tue, 5 Nov 2013 17:00:01 +0900 Subject: [PATCH 5/9] modified 'merge_cookies' and update tests. made sessions.py to use that method when merging cookies. --- requests/cookies.py | 15 +++++++++------ requests/sessions.py | 5 ++--- test_requests.py | 3 ++- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/requests/cookies.py b/requests/cookies.py index df614a2d..20d24a33 100644 --- a/requests/cookies.py +++ b/requests/cookies.py @@ -432,10 +432,13 @@ def merge_cookies(cookiejar, cookies): 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): - cookiejar.update(cookies) + merged_cookie = RequestsCookieJar() + merged_cookie.update(cookiejar) - return cookiejar + if isinstance(cookies, dict): + merged_cookie = cookiejar_from_dict( + cookies, cookiejar=merged_cookie, overwrite=False) + elif isinstance(cookies, cookielib.CookieJar): + merged_cookie.update(cookies) + + return merged_cookie diff --git a/requests/sessions.py b/requests/sessions.py index c8d8c715..16bc1bb1 100644 --- a/requests/sessions.py +++ b/requests/sessions.py @@ -246,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. diff --git a/test_requests.py b/test_requests.py index 539de764..0f076fff 100755 --- a/test_requests.py +++ b/test_requests.py @@ -186,7 +186,8 @@ class RequestsTestCase(unittest.TestCase): # Make sure the cookie was sent assert r.json()['cookies']['foo'] == 'bar' # Make sure the session cj is still the custom one - assert s.cookies is cj + assert isinstance(s.cookies, cookielib.CookieJar) + assert s.cookies['foo'] == 'bar' def test_param_cookiejar_works(self): cj = cookielib.CookieJar() From 5fcaf45c33c35aa36794bddf97da82545ada5fff Mon Sep 17 00:00:00 2001 From: daftshady Date: Tue, 5 Nov 2013 18:00:23 +0900 Subject: [PATCH 6/9] update 'merge_cookies' not to create new instance. --- requests/cookies.py | 18 +++++++++++------- test_requests.py | 3 +-- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/requests/cookies.py b/requests/cookies.py index 20d24a33..8ff8b027 100644 --- a/requests/cookies.py +++ b/requests/cookies.py @@ -432,13 +432,17 @@ def merge_cookies(cookiejar, cookies): if not isinstance(cookiejar, cookielib.CookieJar): raise ValueError('You can only merge into CookieJar') - merged_cookie = RequestsCookieJar() - merged_cookie.update(cookiejar) - if isinstance(cookies, dict): - merged_cookie = cookiejar_from_dict( - cookies, cookiejar=merged_cookie, overwrite=False) + cookiejar = cookiejar_from_dict( + cookies, cookiejar=cookiejar, overwrite=False) elif isinstance(cookies, cookielib.CookieJar): - merged_cookie.update(cookies) + try: + if hasattr(cookiejar, 'update'): + cookiejar.update(cookies) + else: + raise CookieJarError + except CookieJarError: + for cookie_in_jar in cookies: + cookiejar.set_cookie(cookie_in_jar) - return merged_cookie + return cookiejar diff --git a/test_requests.py b/test_requests.py index 0f076fff..539de764 100755 --- a/test_requests.py +++ b/test_requests.py @@ -186,8 +186,7 @@ class RequestsTestCase(unittest.TestCase): # Make sure the cookie was sent assert r.json()['cookies']['foo'] == 'bar' # Make sure the session cj is still the custom one - assert isinstance(s.cookies, cookielib.CookieJar) - assert s.cookies['foo'] == 'bar' + assert s.cookies is cj def test_param_cookiejar_works(self): cj = cookielib.CookieJar() From 8b2255d0f8b0bb472ec2193e4ac5c4d28336a5eb Mon Sep 17 00:00:00 2001 From: daftshady Date: Wed, 6 Nov 2013 01:10:27 +0900 Subject: [PATCH 7/9] double try statement --- requests/cookies.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/requests/cookies.py b/requests/cookies.py index 8ff8b027..0fc343d2 100644 --- a/requests/cookies.py +++ b/requests/cookies.py @@ -437,9 +437,9 @@ def merge_cookies(cookiejar, cookies): cookies, cookiejar=cookiejar, overwrite=False) elif isinstance(cookies, cookielib.CookieJar): try: - if hasattr(cookiejar, 'update'): + try: cookiejar.update(cookies) - else: + except AttributeError: raise CookieJarError except CookieJarError: for cookie_in_jar in cookies: From 8eb40c777e4a5d0967205404a170615eb96ca237 Mon Sep 17 00:00:00 2001 From: daftshady Date: Wed, 6 Nov 2013 18:52:48 +0900 Subject: [PATCH 8/9] remove unnecessary try --- requests/cookies.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/requests/cookies.py b/requests/cookies.py index 0fc343d2..c465f552 100644 --- a/requests/cookies.py +++ b/requests/cookies.py @@ -437,11 +437,8 @@ def merge_cookies(cookiejar, cookies): cookies, cookiejar=cookiejar, overwrite=False) elif isinstance(cookies, cookielib.CookieJar): try: - try: - cookiejar.update(cookies) - except AttributeError: - raise CookieJarError - except CookieJarError: + cookiejar.update(cookies) + except AttributeError: for cookie_in_jar in cookies: cookiejar.set_cookie(cookie_in_jar) From c26a6c310cf8489bb55be5b4b9899d06a2bddda9 Mon Sep 17 00:00:00 2001 From: daftshady Date: Tue, 26 Nov 2013 15:38:48 +0900 Subject: [PATCH 9/9] remove unused import --- requests/sessions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requests/sessions.py b/requests/sessions.py index 16bc1bb1..ab60aa8e 100644 --- a/requests/sessions.py +++ b/requests/sessions.py @@ -12,7 +12,7 @@ import os from collections import Mapping from datetime import datetime -from .compat import cookielib, OrderedDict, urljoin, urlparse, urlunparse, builtin_str +from .compat import cookielib, OrderedDict, urljoin, urlparse, builtin_str from .cookies import ( cookiejar_from_dict, extract_cookies_to_jar, RequestsCookieJar, merge_cookies) from .models import Request, PreparedRequest