diff options
author | Andrew Svetlov <andrew.svetlov@gmail.com> | 2012-11-27 21:06:19 (GMT) |
---|---|---|
committer | Andrew Svetlov <andrew.svetlov@gmail.com> | 2012-11-27 21:06:19 (GMT) |
commit | bff98fe5364452775d8273137c9087ed004deb96 (patch) | |
tree | 239c649e4b032a060a1d3d36c66097ca896cf4d6 /Lib/urllib | |
parent | 9a270d9741f755d2114bc363a2be48135ec67870 (diff) | |
download | cpython-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.py | 27 |
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) |