From ee90f0af608a58761e5f1e08ea5ea6a6365651a2 Mon Sep 17 00:00:00 2001 From: Robert Estelle Date: Tue, 30 Jul 2013 22:59:51 -0700 Subject: [PATCH] Shallow copy of Request fields in Request.copy() 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 | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/requests/models.py b/requests/models.py index 2aacfbf..7ebea01 100644 --- a/requests/models.py +++ b/requests/models.py @@ -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): -- 2.7.4