timeout for urllib2.urlopen() in pre Python 2.6 versions timeout for urllib2.urlopen() in pre Python 2.6 versions python python

timeout for urllib2.urlopen() in pre Python 2.6 versions


you can set a global timeout for all socket operations (including HTTP requests) by using:

socket.setdefaulttimeout()

like this:

import urllib2import socketsocket.setdefaulttimeout(30)f = urllib2.urlopen('http://www.python.org/')

in this case, your urllib2 request would timeout after 30 secs and throw a socket exception. (this was added in Python 2.3)


With considerable irritation, you can override the httplib.HTTPConnection class that the urllib2.HTTPHandler uses.

def urlopen_with_timeout(url, data=None, timeout=None):  # Create these two helper classes fresh each time, since  # timeout needs to be in the closure.  class TimeoutHTTPConnection(httplib.HTTPConnection):    def connect(self):      """Connect to the host and port specified in __init__."""      msg = "getaddrinfo returns an empty list"      for res in socket.getaddrinfo(self.host, self.port, 0,                      socket.SOCK_STREAM):         af, socktype, proto, canonname, sa = res        try:          self.sock = socket.socket(af, socktype, proto)          if timeout is not None:            self.sock.settimeout(timeout)          if self.debuglevel > 0:            print "connect: (%s, %s)" % (self.host, self.port)          self.sock.connect(sa)        except socket.error, msg:          if self.debuglevel > 0:            print 'connect fail:', (self.host, self.port)          if self.sock:            self.sock.close()          self.sock = None          continue        break      if not self.sock:        raise socket.error, msg  class TimeoutHTTPHandler(urllib2.HTTPHandler):    http_request = urllib2.AbstractHTTPHandler.do_request_    def http_open(self, req):      return self.do_open(TimeoutHTTPConnection, req)  opener = urllib2.build_opener(TimeoutHTTPHandler)  opener.open(url, data)


I think your best choice is to patch (or deploy an local version of) your urllib2 with the change from the 2.6 maintenance branch

The file should be in /usr/lib/python2.4/urllib2.py (on linux and 2.4)