diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2015-03-18 16:03:40 (GMT) |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2015-03-18 16:03:40 (GMT) |
commit | 6c32585f677b71eb1206852d24f077f602780c85 (patch) | |
tree | 3204be9816cea9229172587a5c81dc4041a82d92 | |
parent | cb7e5f6f087057570682c961666fb60dae688bc5 (diff) | |
download | cpython-6c32585f677b71eb1206852d24f077f602780c85.zip cpython-6c32585f677b71eb1206852d24f077f602780c85.tar.gz cpython-6c32585f677b71eb1206852d24f077f602780c85.tar.bz2 |
Restored backward compatibility of pickling http.cookies.Morsel. It was
broken after converting instance attributes to properies in issue #2211.
-rw-r--r-- | Lib/http/cookies.py | 12 | ||||
-rw-r--r-- | Lib/test/test_http_cookies.py | 20 |
2 files changed, 32 insertions, 0 deletions
diff --git a/Lib/http/cookies.py b/Lib/http/cookies.py index f4e9035..98489fb 100644 --- a/Lib/http/cookies.py +++ b/Lib/http/cookies.py @@ -377,6 +377,18 @@ class Morsel(dict): self._value = val self._coded_value = coded_val + def __getstate__(self): + return { + 'key': self._key, + 'value': self._value, + 'coded_value': self._coded_value, + } + + def __setstate__(self, state): + self._key = state['key'] + self._value = state['value'] + self._coded_value = state['coded_value'] + def output(self, attrs=None, header="Set-Cookie:"): return "%s %s" % (header, self.OutputString(attrs)) diff --git a/Lib/test/test_http_cookies.py b/Lib/test/test_http_cookies.py index 7665b15..5f1e74b 100644 --- a/Lib/test/test_http_cookies.py +++ b/Lib/test/test_http_cookies.py @@ -1,5 +1,6 @@ # Simple test suite for http/cookies.py +import copy from test.support import run_unittest, run_doctest, check_warnings import unittest from http import cookies @@ -325,6 +326,11 @@ class MorselTests(unittest.TestCase): self.assertIsNot(morsel_a, morsel_b) self.assertEqual(morsel_a, morsel_b) + morsel_b = copy.copy(morsel_a) + self.assertIsInstance(morsel_b, cookies.Morsel) + self.assertIsNot(morsel_a, morsel_b) + self.assertEqual(morsel_a, morsel_b) + def test_setitem(self): morsel = cookies.Morsel() morsel['expires'] = 0 @@ -383,6 +389,20 @@ class MorselTests(unittest.TestCase): self.assertRaises(TypeError, morsel.update) self.assertRaises(TypeError, morsel.update, 0) + def test_pickle(self): + morsel_a = cookies.Morsel() + morsel_a.set('foo', 'bar', 'baz') + morsel_a.update({ + 'version': 2, + 'comment': 'foo', + }) + for proto in range(pickle.HIGHEST_PROTOCOL + 1): + with self.subTest(proto=proto): + morsel_b = pickle.loads(pickle.dumps(morsel_a, proto)) + self.assertIsInstance(morsel_b, cookies.Morsel) + self.assertEqual(morsel_b, morsel_a) + self.assertEqual(str(morsel_b), str(morsel_a)) + def test_repr(self): morsel = cookies.Morsel() self.assertEqual(repr(morsel), '<Morsel: None=None>') |