summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2015-03-18 16:03:40 (GMT)
committerSerhiy Storchaka <storchaka@gmail.com>2015-03-18 16:03:40 (GMT)
commit6c32585f677b71eb1206852d24f077f602780c85 (patch)
tree3204be9816cea9229172587a5c81dc4041a82d92
parentcb7e5f6f087057570682c961666fb60dae688bc5 (diff)
downloadcpython-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.py12
-rw-r--r--Lib/test/test_http_cookies.py20
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>')