diff -r 88e1151e8e02 Lib/http/cookies.py --- a/Lib/http/cookies.py Wed Mar 18 10:59:57 2015 +0200 +++ b/Lib/http/cookies.py Wed Mar 18 12:35:38 2015 +0200 @@ -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 -r 88e1151e8e02 Lib/test/test_http_cookies.py --- a/Lib/test/test_http_cookies.py Wed Mar 18 10:59:57 2015 +0200 +++ b/Lib/test/test_http_cookies.py Wed Mar 18 12:35:38 2015 +0200 @@ -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), '')