mirror of
https://github.com/python/cpython.git
synced 2025-08-01 23:53:15 +00:00
Added an optional timeout parameter to function urllib2.urlopen,
with tests in test_urllib2net.py (must have network resource enabled to execute them). Also modified test_urllib2.py because testing mock classes must take it into acount. Docs are also updated.
This commit is contained in:
parent
9249312020
commit
10951d51e2
5 changed files with 78 additions and 16 deletions
|
@ -117,11 +117,11 @@ from urllib import localhost, url2pathname, getproxies
|
|||
__version__ = sys.version[:3]
|
||||
|
||||
_opener = None
|
||||
def urlopen(url, data=None):
|
||||
def urlopen(url, data=None, timeout=None):
|
||||
global _opener
|
||||
if _opener is None:
|
||||
_opener = build_opener()
|
||||
return _opener.open(url, data)
|
||||
return _opener.open(url, data, timeout)
|
||||
|
||||
def install_opener(opener):
|
||||
global _opener
|
||||
|
@ -355,7 +355,7 @@ class OpenerDirector:
|
|||
if result is not None:
|
||||
return result
|
||||
|
||||
def open(self, fullurl, data=None):
|
||||
def open(self, fullurl, data=None, timeout=None):
|
||||
# accept a URL or a Request object
|
||||
if isinstance(fullurl, basestring):
|
||||
req = Request(fullurl, data)
|
||||
|
@ -364,6 +364,7 @@ class OpenerDirector:
|
|||
if data is not None:
|
||||
req.add_data(data)
|
||||
|
||||
req.timeout = timeout
|
||||
protocol = req.get_type()
|
||||
|
||||
# pre-process request
|
||||
|
@ -1057,7 +1058,7 @@ class AbstractHTTPHandler(BaseHandler):
|
|||
if not host:
|
||||
raise URLError('no host given')
|
||||
|
||||
h = http_class(host) # will parse host:port
|
||||
h = http_class(host, timeout=req.timeout) # will parse host:port
|
||||
h.set_debuglevel(self._debuglevel)
|
||||
|
||||
headers = dict(req.headers)
|
||||
|
@ -1269,7 +1270,7 @@ class FTPHandler(BaseHandler):
|
|||
if dirs and not dirs[0]:
|
||||
dirs = dirs[1:]
|
||||
try:
|
||||
fw = self.connect_ftp(user, passwd, host, port, dirs)
|
||||
fw = self.connect_ftp(user, passwd, host, port, dirs, req.timeout)
|
||||
type = file and 'I' or 'D'
|
||||
for attr in attrs:
|
||||
attr, value = splitvalue(attr)
|
||||
|
@ -1289,8 +1290,8 @@ class FTPHandler(BaseHandler):
|
|||
except ftplib.all_errors, msg:
|
||||
raise IOError, ('ftp error', msg), sys.exc_info()[2]
|
||||
|
||||
def connect_ftp(self, user, passwd, host, port, dirs):
|
||||
fw = ftpwrapper(user, passwd, host, port, dirs)
|
||||
def connect_ftp(self, user, passwd, host, port, dirs, timeout):
|
||||
fw = ftpwrapper(user, passwd, host, port, dirs, timeout)
|
||||
## fw.ftp.set_debuglevel(1)
|
||||
return fw
|
||||
|
||||
|
@ -1310,12 +1311,12 @@ class CacheFTPHandler(FTPHandler):
|
|||
def setMaxConns(self, m):
|
||||
self.max_conns = m
|
||||
|
||||
def connect_ftp(self, user, passwd, host, port, dirs):
|
||||
key = user, host, port, '/'.join(dirs)
|
||||
def connect_ftp(self, user, passwd, host, port, dirs, timeout):
|
||||
key = user, host, port, '/'.join(dirs), timeout
|
||||
if key in self.cache:
|
||||
self.timeout[key] = time.time() + self.delay
|
||||
else:
|
||||
self.cache[key] = ftpwrapper(user, passwd, host, port, dirs)
|
||||
self.cache[key] = ftpwrapper(user, passwd, host, port, dirs, timeout)
|
||||
self.timeout[key] = time.time() + self.delay
|
||||
self.check_cache()
|
||||
return self.cache[key]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue