Shallow copy of Request fields in Request.copy()
authorRobert Estelle <robert@btbapp.com>
Wed, 31 Jul 2013 05:59:51 +0000 (22:59 -0700)
committerRobert Estelle <robert@btbapp.com>
Wed, 31 Jul 2013 05:59:53 +0000 (22:59 -0700)
This prevents e.g. modifying the headers of a copied request from
affecting the headers of its source and vice versa. Copying is used with
the intent to mutuate, so allowing this kind of mutation of fields makes
sense.

Is a deep copy better?

requests/models.py

index 2aacfbfaed837cd963224cd8a6fb5728a592acc8..7ebea013d12b9fe48d42ba86e65a0f8fdb1b1896 100644 (file)
@@ -28,6 +28,8 @@ from .compat import (
     cookielib, urlunparse, urlsplit, urlencode, str, bytes, StringIO,
     is_py2, chardet, json, builtin_str, basestring)
 
+from copy import copy as shallowcopy
+
 CONTENT_CHUNK_SIZE = 10 * 1024
 ITER_CHUNK_SIZE = 512
 
@@ -218,13 +220,17 @@ class Request(RequestHooksMixin):
         return Request(
             method = self.method,
             url = self.url,
-            headers = self.headers,
-            files = self.files,
-            data = self.data,
-            params = self.params,
             auth = self.auth,
-            cookies = self.cookies,
-            hooks = self.hooks,
+
+            # Copy mutable dict/list parameters so that altering one request
+            # does not alter the copy.
+            headers = shallowcopy(self.headers),
+            params = shallowcopy(self.params),
+            cookies = shallowcopy(self.cookies),
+            hooks = shallowcopy(self.hooks),
+
+            files = shallowcopy(self.files),
+            data = shallowcopy(self.data),
         )
 
     def prepare(self):