summaryrefslogtreecommitdiffstats
path: root/Lib/urllib
diff options
context:
space:
mode:
authorAndrew Svetlov <andrew.svetlov@gmail.com>2012-11-27 21:06:19 (GMT)
committerAndrew Svetlov <andrew.svetlov@gmail.com>2012-11-27 21:06:19 (GMT)
commitbff98fe5364452775d8273137c9087ed004deb96 (patch)
tree239c649e4b032a060a1d3d36c66097ca896cf4d6 /Lib/urllib
parent9a270d9741f755d2114bc363a2be48135ec67870 (diff)
downloadcpython-bff98fe5364452775d8273137c9087ed004deb96.zip
cpython-bff98fe5364452775d8273137c9087ed004deb96.tar.gz
cpython-bff98fe5364452775d8273137c9087ed004deb96.tar.bz2
Issue #16464: reset Request's Content-Length header on .data change.
It will be recalculated on sending request to HTTP server. Patch by Alexey Kachayev
Diffstat (limited to 'Lib/urllib')
-rw-r--r--Lib/urllib/request.py27
1 files changed, 25 insertions, 2 deletions
diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py
index 74725f9..ef4bf7f 100644
--- a/Lib/urllib/request.py
+++ b/Lib/urllib/request.py
@@ -266,12 +266,13 @@ class Request:
# unwrap('<URL:type://host/path>') --> 'type://host/path'
self.full_url = unwrap(url)
self.full_url, self.fragment = splittag(self.full_url)
- self.data = data
self.headers = {}
+ self.unredirected_hdrs = {}
+ self._data = None
+ self.data = data
self._tunnel_host = None
for key, value in headers.items():
self.add_header(key, value)
- self.unredirected_hdrs = {}
if origin_req_host is None:
origin_req_host = request_host(self)
self.origin_req_host = origin_req_host
@@ -279,6 +280,24 @@ class Request:
self.method = method
self._parse()
+ @property
+ def data(self):
+ return self._data
+
+ @data.setter
+ def data(self, data):
+ if data != self._data:
+ self._data = data
+ # issue 16464
+ # if we change data we need to remove content-length header
+ # (cause it's most probably calculated for previous value)
+ if self.has_header("Content-length"):
+ self.remove_header("Content-length")
+
+ @data.deleter
+ def data(self):
+ self._data = None
+
def _parse(self):
self.type, rest = splittype(self.full_url)
if self.type is None:
@@ -374,6 +393,10 @@ class Request:
header_name,
self.unredirected_hdrs.get(header_name, default))
+ def remove_header(self, header_name):
+ self.headers.pop(header_name, None)
+ self.unredirected_hdrs.pop(header_name, None)
+
def header_items(self):
hdrs = self.unredirected_hdrs.copy()
hdrs.update(self.headers)