Kaydet (Commit) 8cf7c1cf authored tarafından Serhiy Storchaka's avatar Serhiy Storchaka

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

and above.  Patch by Tim Graham.
üst a5c9c37d
...@@ -486,8 +486,12 @@ class BaseCookie(dict): ...@@ -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."""
......
...@@ -1284,7 +1284,7 @@ class AbstractPickleTests(unittest.TestCase): ...@@ -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)
......
...@@ -3,7 +3,7 @@ ...@@ -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): ...@@ -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."""
......
...@@ -492,6 +492,7 @@ Chris Gonnerman ...@@ -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
......
...@@ -36,6 +36,9 @@ Core and Builtins ...@@ -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.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment