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,8 +486,12 @@ class BaseCookie(dict):
def __setitem__(self, key, value): def __setitem__(self, key, value):
"""Dictionary style assignment.""" """Dictionary style assignment."""
rval, cval = self.value_encode(value) if isinstance(value, Morsel):
self.__set(key, rval, cval) # 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"): def output(self, attrs=None, header="Set-Cookie:", sep="\015\012"):
"""Return a string suitable for HTTP.""" """Return a string suitable for HTTP."""

View file

@ -1284,7 +1284,7 @@ class AbstractPickleTests(unittest.TestCase):
loaded = self.loads(DATA5) loaded = self.loads(DATA5)
self.assertEqual(type(loaded), SimpleCookie) self.assertEqual(type(loaded), SimpleCookie)
self.assertEqual(list(loaded.keys()), ["key"]) 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(): for (exc, data) in DATA7.items():
loaded = self.loads(data) loaded = self.loads(data)

View file

@ -3,7 +3,7 @@
from test.support import run_unittest, run_doctest, check_warnings from test.support import run_unittest, run_doctest, check_warnings
import unittest import unittest
from http import cookies from http import cookies
import pickle
import warnings import warnings
class CookieTests(unittest.TestCase): class CookieTests(unittest.TestCase):
@ -187,6 +187,19 @@ class CookieTests(unittest.TestCase):
self.assertEqual(dict(C), {}) self.assertEqual(dict(C), {})
self.assertEqual(C.output(), '') 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): class MorselTests(unittest.TestCase):
"""Tests for the Morsel object.""" """Tests for the Morsel object."""

View file

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

View file

@ -183,6 +183,9 @@ Core and Builtins
Library 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 - Issue #22776: Brought excluded code into the scope of a try block in
SysLogHandler.emit(). SysLogHandler.emit().