diff --git a/AUTHORS.rst b/AUTHORS.rst index 43a4e4df..072321bb 100644 --- a/AUTHORS.rst +++ b/AUTHORS.rst @@ -135,4 +135,5 @@ Patches and Suggestions - David Pursehouse @dpursehouse - Jon Parise - Alexander Karpinsky @homm86 -- Marc Schlaich @schlamar \ No newline at end of file +- Marc Schlaich @schlamar +- Park Ilsu @daftshady diff --git a/requests/cookies.py b/requests/cookies.py index f3ac64f0..ea56c065 100644 --- a/requests/cookies.py +++ b/requests/cookies.py @@ -392,15 +392,21 @@ def morsel_to_cookie(morsel): return c -def cookiejar_from_dict(cookie_dict, cookiejar=None): +def cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True): """Returns a CookieJar from a key/value dictionary. :param cookie_dict: Dict of key/values to insert into CookieJar. + :param cookiejar: (optional) A cookiejar to add the cookies to. + :param overwrite: (optional) If False, will not replace cookies + already in the jar with new ones. """ if cookiejar is None: cookiejar = RequestsCookieJar() if cookie_dict is not None: + names_from_jar = [cookie.name for cookie in cookiejar] for name in cookie_dict: - cookiejar.set_cookie(create_cookie(name, cookie_dict[name])) + if overwrite or (name not in names_from_jar): + cookiejar.set_cookie(create_cookie(name, cookie_dict[name])) + return cookiejar diff --git a/requests/models.py b/requests/models.py index 48d5927d..0579b28d 100644 --- a/requests/models.py +++ b/requests/models.py @@ -298,7 +298,7 @@ class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): p = PreparedRequest() p.method = self.method p.url = self.url - p.headers = self.headers + p.headers = self.headers.copy() p.body = self.body p.hooks = self.hooks return p diff --git a/requests/sessions.py b/requests/sessions.py index c136a6c8..d8e040c8 100644 --- a/requests/sessions.py +++ b/requests/sessions.py @@ -323,6 +323,9 @@ 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) + proxies = proxies or {} # Gather clues from the surrounding environment. diff --git a/test_requests.py b/test_requests.py index d1e6ed0a..3d6665ba 100755 --- a/test_requests.py +++ b/test_requests.py @@ -164,6 +164,12 @@ class RequestsTestCase(unittest.TestCase): s.get(httpbin('cookies/set?foo="bar:baz"')) self.assertTrue(s.cookies['foo'] == '"bar:baz"') + def test_cookie_persists_via_api(self): + s = requests.session() + r = s.get(httpbin('redirect/1'), cookies={'foo':'bar'}) + self.assertTrue('foo' in r.request.headers['Cookie']) + self.assertTrue('foo' in r.history[0].request.headers['Cookie']) + def test_request_cookie_overrides_session_cookie(self): s = requests.session() s.cookies['foo'] = 'bar'