From 121d34af198b2d051eec158fd1be7aa19a224c28 Mon Sep 17 00:00:00 2001 From: Jeremy Hylton Date: Tue, 8 Jul 2003 12:36:58 +0000 Subject: [PATCH] Fix SF bug 764095: Don't use network in test_httplib. --- Lib/test/output/test_httplib | 2 ++ Lib/test/test_httplib.py | 47 +++++++++++++++++++++++++----------- 2 files changed, 35 insertions(+), 14 deletions(-) diff --git a/Lib/test/output/test_httplib b/Lib/test/output/test_httplib index 811e68000df..302b876d7d2 100644 --- a/Lib/test/output/test_httplib +++ b/Lib/test/output/test_httplib @@ -8,4 +8,6 @@ InvalidURL raised as expected reply: 'HTTP/1.1 200 OK\r\n' header: Set-Cookie: Customer="WILE_E_COYOTE"; Version="1"; Path="/acme" header: Set-Cookie: Part_Number="Rocket_Launcher_0001"; Version="1"; Path="/acme" +reply: 'HTTP/1.1 200 OK\r\n' +header: Content-Length: 14432 diff --git a/Lib/test/test_httplib.py b/Lib/test/test_httplib.py index 29f4503d47c..c57793ded2f 100644 --- a/Lib/test/test_httplib.py +++ b/Lib/test/test_httplib.py @@ -1,22 +1,41 @@ -from test.test_support import verify,verbose import httplib import StringIO +import sys + +from test.test_support import verify,verbose class FakeSocket: - def __init__(self, text): + def __init__(self, text, fileclass=StringIO.StringIO): self.text = text + self.fileclass = fileclass def makefile(self, mode, bufsize=None): if mode != 'r' and mode != 'rb': raise httplib.UnimplementedFileMode() - return StringIO.StringIO(self.text) + return self.fileclass(self.text) + +class NoEOFStringIO(StringIO.StringIO): + """Like StringIO, but raises AssertionError on EOF. + + This is used below to test that httplib doesn't try to read + more from the underlying file than it should. + """ + def read(self, n=-1): + data = StringIO.StringIO.read(self, n) + if data == '': + raise AssertionError('caller tried to read past EOF') + return data + + def readline(self, length=None): + data = StringIO.StringIO.readline(self, length) + if data == '': + raise AssertionError('caller tried to read past EOF') + return data # Collect output to a buffer so that we don't have to cope with line-ending # issues across platforms. Specifically, the headers will have \r\n pairs # and some platforms will strip them from the output file. -import sys - def test(): buf = StringIO.StringIO() _stdout = sys.stdout @@ -78,17 +97,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 + # Test that the library doesn't attempt to read any data + # from a HEAD request. (Tickles SF bug #622042.) + sock = FakeSocket( + 'HTTP/1.1 200 OK\r\n' + 'Content-Length: 14432\r\n' + '\r\n', + NoEOFStringIO) + resp = httplib.HTTPResponse(sock, 1, method="HEAD") + resp.begin() if resp.read() != "": raise AssertionError, "Did not expect response from HEAD request" resp.close() - conn.close() test()