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 2aacfbf..7ebea01 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):