mirror of https://github.com/python/cpython.git
SF bug 622042: Don't expect response body from HEAD request.
Bug fix candidate.
This commit is contained in:
parent
581c36773a
commit
c1b2cb9d8f
|
@ -208,10 +208,11 @@ class HTTPResponse:
|
||||||
|
|
||||||
# See RFC 2616 sec 19.6 and RFC 1945 sec 6 for details.
|
# See RFC 2616 sec 19.6 and RFC 1945 sec 6 for details.
|
||||||
|
|
||||||
def __init__(self, sock, debuglevel=0, strict=0):
|
def __init__(self, sock, debuglevel=0, strict=0, method=None):
|
||||||
self.fp = sock.makefile('rb', 0)
|
self.fp = sock.makefile('rb', 0)
|
||||||
self.debuglevel = debuglevel
|
self.debuglevel = debuglevel
|
||||||
self.strict = strict
|
self.strict = strict
|
||||||
|
self._method = method
|
||||||
|
|
||||||
self.msg = None
|
self.msg = None
|
||||||
|
|
||||||
|
@ -326,7 +327,8 @@ def begin(self):
|
||||||
# does the body have a fixed length? (of zero)
|
# does the body have a fixed length? (of zero)
|
||||||
if (status == 204 or # No Content
|
if (status == 204 or # No Content
|
||||||
status == 304 or # Not Modified
|
status == 304 or # Not Modified
|
||||||
100 <= status < 200): # 1xx codes
|
100 <= status < 200 or # 1xx codes
|
||||||
|
self._method == 'HEAD'):
|
||||||
self.length = 0
|
self.length = 0
|
||||||
|
|
||||||
# if the connection remains open, and we aren't using chunked, and
|
# if the connection remains open, and we aren't using chunked, and
|
||||||
|
@ -497,6 +499,7 @@ def __init__(self, host, port=None, strict=None):
|
||||||
self._buffer = []
|
self._buffer = []
|
||||||
self.__response = None
|
self.__response = None
|
||||||
self.__state = _CS_IDLE
|
self.__state = _CS_IDLE
|
||||||
|
self._method = None
|
||||||
|
|
||||||
self._set_hostport(host, port)
|
self._set_hostport(host, port)
|
||||||
if strict is not None:
|
if strict is not None:
|
||||||
|
@ -626,6 +629,8 @@ def putrequest(self, method, url, skip_host=0):
|
||||||
else:
|
else:
|
||||||
raise CannotSendRequest()
|
raise CannotSendRequest()
|
||||||
|
|
||||||
|
# Save the method we use, we need it later in the response phase
|
||||||
|
self._method = method
|
||||||
if not url:
|
if not url:
|
||||||
url = '/'
|
url = '/'
|
||||||
str = '%s %s %s' % (method, url, self._http_vsn_str)
|
str = '%s %s %s' % (method, url, self._http_vsn_str)
|
||||||
|
@ -763,9 +768,11 @@ def getresponse(self):
|
||||||
|
|
||||||
if self.debuglevel > 0:
|
if self.debuglevel > 0:
|
||||||
response = self.response_class(self.sock, self.debuglevel,
|
response = self.response_class(self.sock, self.debuglevel,
|
||||||
strict=self.strict)
|
strict=self.strict,
|
||||||
|
method=self._method)
|
||||||
else:
|
else:
|
||||||
response = self.response_class(self.sock, strict=self.strict)
|
response = self.response_class(self.sock, strict=self.strict,
|
||||||
|
method=self._method)
|
||||||
|
|
||||||
response.begin()
|
response.begin()
|
||||||
assert response.will_close != _UNKNOWN
|
assert response.will_close != _UNKNOWN
|
||||||
|
|
|
@ -78,4 +78,17 @@ def _test():
|
||||||
if cookies != hdr:
|
if cookies != hdr:
|
||||||
raise AssertionError, "multiple headers not combined properly"
|
raise AssertionError, "multiple headers not combined properly"
|
||||||
|
|
||||||
|
# test that the library doesn't attempt to read any data
|
||||||
|
# from a head request
|
||||||
|
conn = httplib.HTTPConnection("www.python.org")
|
||||||
|
conn.connect()
|
||||||
|
conn.request("HEAD", "/", headers={"Connection" : "keep-alive"})
|
||||||
|
resp = conn.getresponse()
|
||||||
|
if resp.status != 200:
|
||||||
|
raise AssertionError, "Expected status 200, got %d" % resp.status
|
||||||
|
if resp.read() != "":
|
||||||
|
raise AssertionError, "Did not expect response from HEAD request"
|
||||||
|
resp.close()
|
||||||
|
conn.close()
|
||||||
|
|
||||||
test()
|
test()
|
||||||
|
|
Loading…
Reference in New Issue