From 8cf7c1cff0f1176387118826fffdf1c517405f3a Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 2 Nov 2014 22:18:25 +0200 Subject: Issue #22775: Fixed unpickling of http.cookies.SimpleCookie with protocol 2 and above. Patch by Tim Graham. --- Lib/http/cookies.py | 8 ++++++-- Lib/test/pickletester.py | 2 +- Lib/test/test_http_cookies.py | 15 ++++++++++++++- Misc/ACKS | 1 + Misc/NEWS | 3 +++ 5 files changed, 25 insertions(+), 4 deletions(-) diff --git a/Lib/http/cookies.py b/Lib/http/cookies.py index 556d101..a6de6d5 100644 --- a/Lib/http/cookies.py +++ b/Lib/http/cookies.py @@ -486,8 +486,12 @@ class BaseCookie(dict): def __setitem__(self, key, value): """Dictionary style assignment.""" - rval, cval = self.value_encode(value) - self.__set(key, rval, cval) + if isinstance(value, Morsel): + # allow assignment of constructed Morsels (e.g. for pickling) + dict.__setitem__(self, key, value) + else: + rval, cval = self.value_encode(value) + self.__set(key, rval, cval) def output(self, attrs=None, header="Set-Cookie:", sep="\015\012"): """Return a string suitable for HTTP.""" diff --git a/Lib/test/pickletester.py b/Lib/test/pickletester.py index a2bea60..5963175 100644 --- a/Lib/test/pickletester.py +++ b/Lib/test/pickletester.py @@ -1284,7 +1284,7 @@ class AbstractPickleTests(unittest.TestCase): loaded = self.loads(DATA5) self.assertEqual(type(loaded), SimpleCookie) self.assertEqual(list(loaded.keys()), ["key"]) - self.assertEqual(loaded["key"].value, "Set-Cookie: key=value") + self.assertEqual(loaded["key"].value, "value") for (exc, data) in DATA7.items(): loaded = self.loads(data) diff --git a/Lib/test/test_http_cookies.py b/Lib/test/test_http_cookies.py index 76e5e9c..2b0281e 100644 --- a/Lib/test/test_http_cookies.py +++ b/Lib/test/test_http_cookies.py @@ -3,7 +3,7 @@ from test.support import run_unittest, run_doctest, check_warnings import unittest from http import cookies - +import pickle import warnings class CookieTests(unittest.TestCase): @@ -187,6 +187,19 @@ class CookieTests(unittest.TestCase): self.assertEqual(dict(C), {}) self.assertEqual(C.output(), '') + def test_pickle(self): + rawdata = 'Customer="WILE_E_COYOTE"; Path=/acme; Version=1' + expected_output = 'Set-Cookie: %s' % rawdata + + C = cookies.SimpleCookie() + C.load(rawdata) + self.assertEqual(C.output(), expected_output) + + for proto in range(pickle.HIGHEST_PROTOCOL + 1): + with self.subTest(proto=proto): + C1 = pickle.loads(pickle.dumps(C, protocol=proto)) + self.assertEqual(C1.output(), expected_output) + class MorselTests(unittest.TestCase): """Tests for the Morsel object.""" diff --git a/Misc/ACKS b/Misc/ACKS index f0950eb..30b6a0e 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -492,6 +492,7 @@ Chris Gonnerman Shelley Gooch David Goodger Hans de Graaff +Tim Graham Nathaniel Gray Eddy De Greef Grant Griffin diff --git a/Misc/NEWS b/Misc/NEWS index 55f95b5..ee1c53f 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -36,6 +36,9 @@ Core and Builtins Library ------- +- Issue #22775: Fixed unpickling of http.cookies.SimpleCookie with protocol 2 + and above. Patch by Tim Graham. + - Issue #22366: urllib.request.urlopen will accept a context object (SSLContext) as an argument which will then used be for HTTPS connection. Patch by Alex Gaynor. -- cgit v0.12