]> git.ipfire.org Git - thirdparty/tornado.git/commitdiff
Support pickling of HTTPHeaders.
authorBen Darnell <ben@bendarnell.com>
Sat, 4 Jul 2015 22:24:24 +0000 (18:24 -0400)
committerBen Darnell <ben@bendarnell.com>
Sat, 4 Jul 2015 22:24:24 +0000 (18:24 -0400)
Closes #1445

tornado/httputil.py
tornado/test/httputil_test.py

index fa5e697c17f306b2c388e6d179e8834f91c2cfe5..747dfc400c98298df98c25e3e6b02860b0de2828 100644 (file)
@@ -242,6 +242,15 @@ class HTTPHeaders(dict):
         # effectively a deep copy.
         return self.copy()
 
+    def __reduce_ex__(self, v):
+        # We must override dict.__reduce_ex__ to pickle ourselves
+        # correctly.
+        return HTTPHeaders, (), list(self.get_all())
+
+    def __setstate__(self, state):
+        for k, v in state:
+            self.add(k, v)
+
 
 class HTTPServerRequest(object):
     """A single HTTP request.
index 6e95360174de84b1e2f5f45f27000fcfe80f2dbc..ca60b45ef7f560b868a5c2fa81193630fc77656b 100644 (file)
@@ -12,11 +12,11 @@ from tornado.util import u
 import copy
 import datetime
 import logging
+import pickle
 import time
 
 
 class TestUrlConcat(unittest.TestCase):
-
     def test_url_concat_no_query_params(self):
         url = url_concat(
             "https://localhost/path",
@@ -298,6 +298,15 @@ Foo: even
             self.assertIsNot(headers, h1)
             self.assertIsNot(headers.get_list('A'), h1.get_list('A'))
 
+    def test_pickle_roundtrip(self):
+        headers = HTTPHeaders()
+        headers.add('Set-Cookie', 'a=b')
+        headers.add('Set-Cookie', 'c=d')
+        headers.add('Content-Type', 'text/html')
+        pickled = pickle.dumps(headers)
+        unpickled = pickle.loads(pickled)
+        self.assertEqual(sorted(headers.get_all()), sorted(unpickled.get_all()))
+        self.assertEqual(sorted(headers.items()), sorted(unpickled.items()))
 
 
 class FormatTimestampTest(unittest.TestCase):