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:18:25 +02:00
parent a5c9c37dd5
commit 8cf7c1cff0
5 changed files with 25 additions and 4 deletions

View file

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

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

@ -492,6 +492,7 @@ Chris Gonnerman
Shelley Gooch Shelley Gooch
David Goodger David Goodger
Hans de Graaff Hans de Graaff
Tim Graham
Nathaniel Gray Nathaniel Gray
Eddy De Greef Eddy De Greef
Grant Griffin Grant Griffin

View file

@ -36,6 +36,9 @@ Core and Builtins
Library Library
------- -------
- Issue #22775: Fixed unpickling of http.cookies.SimpleCookie with protocol 2
and above. Patch by Tim Graham.
- Issue #22366: urllib.request.urlopen will accept a context object - Issue #22366: urllib.request.urlopen will accept a context object
(SSLContext) as an argument which will then used be for HTTPS connection. (SSLContext) as an argument which will then used be for HTTPS connection.
Patch by Alex Gaynor. Patch by Alex Gaynor.