From c1b2cb9d8f70ed3a1209f53eae38f69be8248fcb Mon Sep 17 00:00:00 2001 From: Jeremy Hylton Date: Mon, 5 May 2003 16:13:58 +0000 Subject: [PATCH] SF bug 622042: Don't expect response body from HEAD request. Bug fix candidate. --- Lib/httplib.py | 15 +++++++++++---- Lib/test/test_httplib.py | 13 +++++++++++++ Misc/ACKS | 1 + 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/Lib/httplib.py b/Lib/httplib.py index caf6ccd3e77..9527e29288e 100644 --- a/Lib/httplib.py +++ b/Lib/httplib.py @@ -208,10 +208,11 @@ class HTTPResponse: # 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.debuglevel = debuglevel self.strict = strict + self._method = method self.msg = None @@ -326,7 +327,8 @@ def begin(self): # does the body have a fixed length? (of zero) if (status == 204 or # No Content status == 304 or # Not Modified - 100 <= status < 200): # 1xx codes + 100 <= status < 200 or # 1xx codes + self._method == 'HEAD'): self.length = 0 # 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.__response = None self.__state = _CS_IDLE + self._method = None self._set_hostport(host, port) if strict is not None: @@ -626,6 +629,8 @@ def putrequest(self, method, url, skip_host=0): else: raise CannotSendRequest() + # Save the method we use, we need it later in the response phase + self._method = method if not url: url = '/' str = '%s %s %s' % (method, url, self._http_vsn_str) @@ -763,9 +768,11 @@ def getresponse(self): if self.debuglevel > 0: response = self.response_class(self.sock, self.debuglevel, - strict=self.strict) + strict=self.strict, + method=self._method) else: - response = self.response_class(self.sock, strict=self.strict) + response = self.response_class(self.sock, strict=self.strict, + method=self._method) response.begin() assert response.will_close != _UNKNOWN diff --git a/Lib/test/test_httplib.py b/Lib/test/test_httplib.py index 8764455ccfd..29f4503d47c 100644 --- a/Lib/test/test_httplib.py +++ b/Lib/test/test_httplib.py @@ -78,4 +78,17 @@ def _test(): if cookies != hdr: 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() diff --git a/Misc/ACKS b/Misc/ACKS index 2fbe9af5c0b..a8dbb76ac76 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -261,6 +261,7 @@ Michael Hudson Jim Hugunin Greg Humphreys Jeremy Hylton +Mihai Ibanescu Juan David Ibáñez Palomar Tony Ingraldi John Interrante