Issue #22775: Fixed unpickling of http.cookies.SimpleCookie with protocol 2

and above.  Patch by Tim Graham.
This commit is contained in:
Serhiy Storchaka 2014-11-02 22:19:56 +02:00
commit 2cb0e73a89
5 changed files with 25 additions and 4 deletions

View file

@ -486,6 +486,10 @@ class BaseCookie(dict):
def __setitem__(self, key, value):
"""Dictionary style assignment."""
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)

View file

@ -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)

View file

@ -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."""

View file

@ -496,6 +496,7 @@ Chris Gonnerman
Shelley Gooch
David Goodger
Hans de Graaff
Tim Graham
Kim Gräsman
Nathaniel Gray
Eddy De Greef

View file

@ -183,6 +183,9 @@ Core and Builtins
Library
-------
- Issue #22775: Fixed unpickling of http.cookies.SimpleCookie with protocol 2
and above. Patch by Tim Graham.
- Issue #22776: Brought excluded code into the scope of a try block in
SysLogHandler.emit().