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
This commit is contained in:
Andrew Svetlov 2012-11-27 23:06:19 +02:00
parent 9a270d9741
commit bff98fe536
3 changed files with 72 additions and 2 deletions

View file

@ -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)