Index: Lib/http/client.py =================================================================== --- Lib/http/client.py (revision 67780) +++ Lib/http/client.py (working copy) @@ -249,7 +249,7 @@ return email.parser.Parser(_class=HTTPMessage).parsestr(hstring) -class HTTPResponse: +class HTTPResponse(io.RawIOBase): # strict: If true, raise BadStatusLine if the status line can't be # parsed as a valid HTTP/1.0 or 1.1 status line. By default it is @@ -585,6 +585,9 @@ amt -= len(chunk) return b"".join(s) + def fileno(self): + return self.fp.fileno() + def getheader(self, name, default=None): if self.msg is None: raise ResponseNotReady() @@ -596,7 +599,12 @@ raise ResponseNotReady() return list(self.msg.items()) + def _checkClosed(self): + # We don't want internal checks for closed files to raise an + # exception. They should just silently return. + pass + class HTTPConnection: _http_vsn = 11 Index: Lib/urllib/request.py =================================================================== --- Lib/urllib/request.py (revision 67768) +++ Lib/urllib/request.py (working copy) @@ -333,7 +333,6 @@ handlers = chain.get(kind, ()) for handler in handlers: func = getattr(handler, meth_name) - result = func(*args) if result is not None: return result @@ -1070,7 +1069,8 @@ except socket.error as err: # XXX what error? raise URLError(err) - resp = addinfourl(r.fp, r.msg, req.get_full_url()) +## resp = addinfourl(r.fp, r.msg, req.get_full_url()) + resp = addinfourl(r, r.msg, req.get_full_url()) resp.code = r.status resp.msg = r.reason return resp @@ -1606,7 +1606,7 @@ # According to RFC 2616, "2xx" code indicates that the client's # request was successfully received, understood, and accepted. if 200 <= response.status < 300: - return addinfourl(response.fp, response.msg, "http:" + url, + return addinfourl(response, response.msg, "http:" + url, response.status) else: return self.http_error( Index: Lib/urllib/response.py =================================================================== --- Lib/urllib/response.py (revision 67768) +++ Lib/urllib/response.py (working copy) @@ -17,7 +17,8 @@ self.read = self.fp.read self.readline = self.fp.readline # TODO(jhylton): Make sure an object with readlines() is also iterable - if hasattr(self.fp, "readlines"): self.readlines = self.fp.readlines + if hasattr(self.fp, "readlines"): + self.readlines = self.fp.readlines if hasattr(self.fp, "fileno"): self.fileno = self.fp.fileno else: Index: Lib/test/test_httplib.py =================================================================== --- Lib/test/test_httplib.py (revision 67781) +++ Lib/test/test_httplib.py (working copy) @@ -42,7 +42,6 @@ raise AssertionError('caller tried to read past EOF') return data - class HeaderTests(TestCase): def test_auto_headers(self): # Some headers are added automatically, but should not be added by @@ -245,7 +244,6 @@ self.assertEqual(httpConn.sock.gettimeout(), 30) httpConn.close() - class HTTPSTimeoutTest(TestCase): # XXX Here should be tests for HTTPS, there isn't any right now! @@ -257,7 +255,7 @@ def test_main(verbose=None): support.run_unittest(HeaderTests, OfflineTest, BasicTest, TimeoutTest, - HTTPSTimeoutTest) + HTTPSTimeoutTest) if __name__ == '__main__': test_main() Index: Lib/test/test_urllib2net.py =================================================================== --- Lib/test/test_urllib2net.py (revision 67768) +++ Lib/test/test_urllib2net.py (working copy) @@ -195,7 +195,7 @@ def test_http_basic(self): self.assertTrue(socket.getdefaulttimeout() is None) u = _urlopen_with_retry("http://www.python.org") - self.assertTrue(u.fp._sock.gettimeout() is None) + self.assertTrue(u.fp.fp._sock.gettimeout() is None) def test_http_default_timeout(self): self.assertTrue(socket.getdefaulttimeout() is None) @@ -204,7 +204,7 @@ u = _urlopen_with_retry("http://www.python.org") finally: socket.setdefaulttimeout(None) - self.assertEqual(u.fp._sock.gettimeout(), 60) + self.assertEqual(u.fp.fp._sock.gettimeout(), 60) def test_http_no_timeout(self): self.assertTrue(socket.getdefaulttimeout() is None) @@ -213,11 +213,11 @@ u = _urlopen_with_retry("http://www.python.org", timeout=None) finally: socket.setdefaulttimeout(None) - self.assertTrue(u.fp._sock.gettimeout() is None) + self.assertTrue(u.fp.fp._sock.gettimeout() is None) def test_http_timeout(self): u = _urlopen_with_retry("http://www.python.org", timeout=120) - self.assertEqual(u.fp._sock.gettimeout(), 120) + self.assertEqual(u.fp.fp._sock.gettimeout(), 120) FTP_HOST = "ftp://ftp.mirror.nl/pub/mirror/gnu/"