| 
									
										
										
										
											2004-08-07 17:40:50 +00:00
										 |  |  | #!/usr/bin/env python | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import unittest | 
					
						
							|  |  |  | from test import test_support | 
					
						
							| 
									
										
										
										
											2006-05-03 05:15:10 +00:00
										 |  |  | from test.test_urllib2 import sanepathname2url | 
					
						
							| 
									
										
										
										
											2004-08-07 17:40:50 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | import socket | 
					
						
							|  |  |  | import urllib2 | 
					
						
							|  |  |  | import sys | 
					
						
							|  |  |  | import os | 
					
						
							|  |  |  | import mimetools | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-25 06:37:23 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def _urlopen_with_retry(host, *args, **kwargs): | 
					
						
							|  |  |  |     # Connecting to remote hosts is flaky.  Make it more robust | 
					
						
							|  |  |  |     # by retrying the connection several times. | 
					
						
							|  |  |  |     for i in range(3): | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             return urllib2.urlopen(host, *args, **kwargs) | 
					
						
							|  |  |  |         except urllib2.URLError, last_exc: | 
					
						
							|  |  |  |             continue | 
					
						
							|  |  |  |         except: | 
					
						
							|  |  |  |             raise | 
					
						
							|  |  |  |     raise last_exc | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-30 07:06:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | class AuthTests(unittest.TestCase): | 
					
						
							|  |  |  |     """Tests urllib2 authentication features.""" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ## Disabled at the moment since there is no page under python.org which | 
					
						
							|  |  |  | ## could be used to HTTP authentication. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | #    def test_basic_auth(self): | 
					
						
							|  |  |  | #        import httplib | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | #        test_url = "http://www.python.org/test/test_urllib2/basic_auth" | 
					
						
							|  |  |  | #        test_hostport = "www.python.org" | 
					
						
							|  |  |  | #        test_realm = 'Test Realm' | 
					
						
							|  |  |  | #        test_user = 'test.test_urllib2net' | 
					
						
							|  |  |  | #        test_password = 'blah' | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | #        # failure | 
					
						
							|  |  |  | #        try: | 
					
						
							| 
									
										
										
										
											2008-01-25 06:37:23 +00:00
										 |  |  | #            _urlopen_with_retry(test_url) | 
					
						
							| 
									
										
										
										
											2006-04-30 07:06:11 +00:00
										 |  |  | #        except urllib2.HTTPError, exc: | 
					
						
							|  |  |  | #            self.assertEqual(exc.code, 401) | 
					
						
							|  |  |  | #        else: | 
					
						
							|  |  |  | #            self.fail("urlopen() should have failed with 401") | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | #        # success | 
					
						
							|  |  |  | #        auth_handler = urllib2.HTTPBasicAuthHandler() | 
					
						
							|  |  |  | #        auth_handler.add_password(test_realm, test_hostport, | 
					
						
							|  |  |  | #                                  test_user, test_password) | 
					
						
							|  |  |  | #        opener = urllib2.build_opener(auth_handler) | 
					
						
							|  |  |  | #        f = opener.open('http://localhost/') | 
					
						
							| 
									
										
										
										
											2008-01-25 06:37:23 +00:00
										 |  |  | #        response = _urlopen_with_retry("http://www.python.org/") | 
					
						
							| 
									
										
										
										
											2006-04-30 07:06:11 +00:00
										 |  |  | # | 
					
						
							|  |  |  | #        # The 'userinfo' URL component is deprecated by RFC 3986 for security | 
					
						
							|  |  |  | #        # reasons, let's not implement it!  (it's already implemented for proxy | 
					
						
							|  |  |  | #        # specification strings (that is, URLs or authorities specifying a | 
					
						
							|  |  |  | #        # proxy), so we must keep that) | 
					
						
							|  |  |  | #        self.assertRaises(httplib.InvalidURL, | 
					
						
							|  |  |  | #                          urllib2.urlopen, "http://evil:thing@example.com") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-01-21 10:35:10 +00:00
										 |  |  | class CloseSocketTest(unittest.TestCase): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_close(self): | 
					
						
							|  |  |  |         import socket, httplib, gc | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # calling .close() on urllib2's response objects should close the | 
					
						
							|  |  |  |         # underlying socket | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # delve deep into response to fetch socket._socketobject | 
					
						
							| 
									
										
										
										
											2008-01-25 06:37:23 +00:00
										 |  |  |         response = _urlopen_with_retry("http://www.python.org/") | 
					
						
							| 
									
										
										
										
											2007-01-21 10:35:10 +00:00
										 |  |  |         abused_fileobject = response.fp | 
					
						
							|  |  |  |         self.assert_(abused_fileobject.__class__ is socket._fileobject) | 
					
						
							|  |  |  |         httpresponse = abused_fileobject._sock | 
					
						
							|  |  |  |         self.assert_(httpresponse.__class__ is httplib.HTTPResponse) | 
					
						
							|  |  |  |         fileobject = httpresponse.fp | 
					
						
							|  |  |  |         self.assert_(fileobject.__class__ is socket._fileobject) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.assert_(not fileobject.closed) | 
					
						
							|  |  |  |         response.close() | 
					
						
							|  |  |  |         self.assert_(fileobject.closed) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-05-03 05:15:10 +00:00
										 |  |  | class OtherNetworkTests(unittest.TestCase): | 
					
						
							|  |  |  |     def setUp(self): | 
					
						
							|  |  |  |         if 0:  # for debugging | 
					
						
							|  |  |  |             import logging | 
					
						
							|  |  |  |             logger = logging.getLogger("test_urllib2net") | 
					
						
							|  |  |  |             logger.addHandler(logging.StreamHandler()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # XXX The rest of these tests aren't very good -- they don't check much. | 
					
						
							|  |  |  |     # They do sometimes catch some major disasters, though. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_ftp(self): | 
					
						
							|  |  |  |         urls = [ | 
					
						
							| 
									
										
										
										
											2007-09-09 23:36:46 +00:00
										 |  |  |             'ftp://ftp.kernel.org/pub/linux/kernel/README', | 
					
						
							|  |  |  |             'ftp://ftp.kernel.org/pub/linux/kernel/non-existant-file', | 
					
						
							|  |  |  |             #'ftp://ftp.kernel.org/pub/leenox/kernel/test', | 
					
						
							| 
									
										
										
										
											2006-05-03 05:15:10 +00:00
										 |  |  |             'ftp://gatekeeper.research.compaq.com/pub/DEC/SRC' | 
					
						
							|  |  |  |                 '/research-reports/00README-Legal-Rules-Regs', | 
					
						
							|  |  |  |             ] | 
					
						
							|  |  |  |         self._test_urls(urls, self._extra_handlers()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_file(self): | 
					
						
							|  |  |  |         TESTFN = test_support.TESTFN | 
					
						
							|  |  |  |         f = open(TESTFN, 'w') | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             f.write('hi there\n') | 
					
						
							|  |  |  |             f.close() | 
					
						
							|  |  |  |             urls = [ | 
					
						
							|  |  |  |                 'file:'+sanepathname2url(os.path.abspath(TESTFN)), | 
					
						
							| 
									
										
										
										
											2007-09-09 23:36:46 +00:00
										 |  |  |                 ('file:///nonsensename/etc/passwd', None, urllib2.URLError), | 
					
						
							| 
									
										
										
										
											2006-05-03 05:15:10 +00:00
										 |  |  |                 ] | 
					
						
							| 
									
										
										
										
											2008-01-25 06:37:23 +00:00
										 |  |  |             self._test_urls(urls, self._extra_handlers(), urllib2.urlopen) | 
					
						
							| 
									
										
										
										
											2006-05-03 05:15:10 +00:00
										 |  |  |         finally: | 
					
						
							|  |  |  |             os.remove(TESTFN) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # XXX Following test depends on machine configurations that are internal | 
					
						
							|  |  |  |     # to CNRI.  Need to set up a public server with the right authentication | 
					
						
							|  |  |  |     # configuration for test purposes. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ##     def test_cnri(self): | 
					
						
							|  |  |  | ##         if socket.gethostname() == 'bitdiddle': | 
					
						
							|  |  |  | ##             localhost = 'bitdiddle.cnri.reston.va.us' | 
					
						
							|  |  |  | ##         elif socket.gethostname() == 'bitdiddle.concentric.net': | 
					
						
							|  |  |  | ##             localhost = 'localhost' | 
					
						
							|  |  |  | ##         else: | 
					
						
							|  |  |  | ##             localhost = None | 
					
						
							|  |  |  | ##         if localhost is not None: | 
					
						
							|  |  |  | ##             urls = [ | 
					
						
							|  |  |  | ##                 'file://%s/etc/passwd' % localhost, | 
					
						
							|  |  |  | ##                 'http://%s/simple/' % localhost, | 
					
						
							|  |  |  | ##                 'http://%s/digest/' % localhost, | 
					
						
							|  |  |  | ##                 'http://%s/not/found.h' % localhost, | 
					
						
							|  |  |  | ##                 ] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ##             bauth = HTTPBasicAuthHandler() | 
					
						
							|  |  |  | ##             bauth.add_password('basic_test_realm', localhost, 'jhylton', | 
					
						
							|  |  |  | ##                                'password') | 
					
						
							|  |  |  | ##             dauth = HTTPDigestAuthHandler() | 
					
						
							|  |  |  | ##             dauth.add_password('digest_test_realm', localhost, 'jhylton', | 
					
						
							|  |  |  | ##                                'password') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ##             self._test_urls(urls, self._extra_handlers()+[bauth, dauth]) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-25 06:37:23 +00:00
										 |  |  |     def _test_urls(self, urls, handlers, urlopen=_urlopen_with_retry): | 
					
						
							| 
									
										
										
										
											2006-05-03 05:15:10 +00:00
										 |  |  |         import socket | 
					
						
							|  |  |  |         import time | 
					
						
							|  |  |  |         import logging | 
					
						
							|  |  |  |         debug = logging.getLogger("test_urllib2").debug | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         urllib2.install_opener(urllib2.build_opener(*handlers)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         for url in urls: | 
					
						
							|  |  |  |             if isinstance(url, tuple): | 
					
						
							|  |  |  |                 url, req, expected_err = url | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 req = expected_err = None | 
					
						
							|  |  |  |             debug(url) | 
					
						
							|  |  |  |             try: | 
					
						
							| 
									
										
										
										
											2008-01-25 06:37:23 +00:00
										 |  |  |                 f = urlopen(url, req) | 
					
						
							| 
									
										
										
										
											2007-09-09 23:36:46 +00:00
										 |  |  |             except EnvironmentError, err: | 
					
						
							| 
									
										
										
										
											2006-05-03 05:15:10 +00:00
										 |  |  |                 debug(err) | 
					
						
							|  |  |  |                 if expected_err: | 
					
						
							| 
									
										
										
										
											2007-09-09 23:36:46 +00:00
										 |  |  |                     msg = ("Didn't get expected error(s) %s for %s %s, got %s: %s" % | 
					
						
							|  |  |  |                            (expected_err, url, req, type(err), err)) | 
					
						
							| 
									
										
										
										
											2006-06-11 20:42:02 +00:00
										 |  |  |                     self.assert_(isinstance(err, expected_err), msg) | 
					
						
							| 
									
										
										
										
											2006-05-03 05:15:10 +00:00
										 |  |  |             else: | 
					
						
							| 
									
										
										
										
											2007-03-14 21:44:15 +00:00
										 |  |  |                 with test_support.transient_internet(): | 
					
						
							|  |  |  |                     buf = f.read() | 
					
						
							| 
									
										
										
										
											2006-05-03 05:15:10 +00:00
										 |  |  |                 f.close() | 
					
						
							|  |  |  |                 debug("read %d bytes" % len(buf)) | 
					
						
							|  |  |  |             debug("******** next url coming up...") | 
					
						
							|  |  |  |             time.sleep(0.1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def _extra_handlers(self): | 
					
						
							|  |  |  |         handlers = [] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         cfh = urllib2.CacheFTPHandler() | 
					
						
							|  |  |  |         cfh.setTimeout(1) | 
					
						
							|  |  |  |         handlers.append(cfh) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return handlers | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-03-28 08:00:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-06-06 17:15:23 +00:00
										 |  |  | class TimeoutTest(unittest.TestCase): | 
					
						
							|  |  |  |     def test_http_basic(self): | 
					
						
							| 
									
										
										
										
											2008-01-25 06:37:23 +00:00
										 |  |  |         u = _urlopen_with_retry("http://www.python.org") | 
					
						
							| 
									
										
										
										
											2007-06-06 17:15:23 +00:00
										 |  |  |         self.assertTrue(u.fp._sock.fp._sock.gettimeout() is None) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_http_NoneWithdefault(self): | 
					
						
							|  |  |  |         prev = socket.getdefaulttimeout() | 
					
						
							|  |  |  |         socket.setdefaulttimeout(60) | 
					
						
							|  |  |  |         try: | 
					
						
							| 
									
										
										
										
											2008-01-25 06:37:23 +00:00
										 |  |  |             u = _urlopen_with_retry("http://www.python.org", timeout=None) | 
					
						
							| 
									
										
										
										
											2007-06-06 17:15:23 +00:00
										 |  |  |             self.assertEqual(u.fp._sock.fp._sock.gettimeout(), 60) | 
					
						
							|  |  |  |         finally: | 
					
						
							|  |  |  |             socket.setdefaulttimeout(prev) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_http_Value(self): | 
					
						
							| 
									
										
										
										
											2008-01-25 06:37:23 +00:00
										 |  |  |         u = _urlopen_with_retry("http://www.python.org", timeout=120) | 
					
						
							| 
									
										
										
										
											2007-06-06 17:15:23 +00:00
										 |  |  |         self.assertEqual(u.fp._sock.fp._sock.gettimeout(), 120) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_http_NoneNodefault(self): | 
					
						
							| 
									
										
										
										
											2008-01-25 06:37:23 +00:00
										 |  |  |         u = _urlopen_with_retry("http://www.python.org", timeout=None) | 
					
						
							| 
									
										
										
										
											2007-06-06 17:15:23 +00:00
										 |  |  |         self.assertTrue(u.fp._sock.fp._sock.gettimeout() is None) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-25 06:37:23 +00:00
										 |  |  |     FTP_HOST = "ftp://ftp.mirror.nl/pub/mirror/gnu/" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-06-06 17:15:23 +00:00
										 |  |  |     def test_ftp_basic(self): | 
					
						
							| 
									
										
										
										
											2008-01-25 06:37:23 +00:00
										 |  |  |         u = _urlopen_with_retry(self.FTP_HOST) | 
					
						
							| 
									
										
										
										
											2007-06-06 17:15:23 +00:00
										 |  |  |         self.assertTrue(u.fp.fp._sock.gettimeout() is None) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_ftp_NoneWithdefault(self): | 
					
						
							|  |  |  |         prev = socket.getdefaulttimeout() | 
					
						
							|  |  |  |         socket.setdefaulttimeout(60) | 
					
						
							|  |  |  |         try: | 
					
						
							| 
									
										
										
										
											2008-01-25 06:37:23 +00:00
										 |  |  |             u = _urlopen_with_retry(self.FTP_HOST, timeout=None) | 
					
						
							| 
									
										
										
										
											2007-06-06 17:15:23 +00:00
										 |  |  |             self.assertEqual(u.fp.fp._sock.gettimeout(), 60) | 
					
						
							|  |  |  |         finally: | 
					
						
							|  |  |  |             socket.setdefaulttimeout(prev) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_ftp_NoneNodefault(self): | 
					
						
							| 
									
										
										
										
											2008-01-25 06:37:23 +00:00
										 |  |  |         u = _urlopen_with_retry(self.FTP_HOST, timeout=None) | 
					
						
							| 
									
										
										
										
											2007-06-06 17:15:23 +00:00
										 |  |  |         self.assertTrue(u.fp.fp._sock.gettimeout() is None) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_ftp_Value(self): | 
					
						
							| 
									
										
										
										
											2008-01-25 06:37:23 +00:00
										 |  |  |         u = _urlopen_with_retry(self.FTP_HOST, timeout=60) | 
					
						
							| 
									
										
										
										
											2007-06-06 17:15:23 +00:00
										 |  |  |         self.assertEqual(u.fp.fp._sock.gettimeout(), 60) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-05-03 05:15:10 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-08-07 17:40:50 +00:00
										 |  |  | def test_main(): | 
					
						
							|  |  |  |     test_support.requires("network") | 
					
						
							| 
									
										
										
										
											2008-03-28 08:00:44 +00:00
										 |  |  |     test_support.run_unittest(AuthTests, | 
					
						
							| 
									
										
										
										
											2007-01-21 10:35:10 +00:00
										 |  |  |                               OtherNetworkTests, | 
					
						
							|  |  |  |                               CloseSocketTest, | 
					
						
							| 
									
										
										
										
											2007-06-06 17:15:23 +00:00
										 |  |  |                               TimeoutTest, | 
					
						
							| 
									
										
										
										
											2007-01-21 10:35:10 +00:00
										 |  |  |                               ) | 
					
						
							| 
									
										
										
										
											2004-08-07 17:40:50 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | if __name__ == "__main__": | 
					
						
							|  |  |  |     test_main() |