[Checkins] SVN: grokui.admin/branches/ulif-securitynotifications/src/grokui/admin/utilities.py Add urllib2 compatible HTTP handlers with timeout.
Uli Fouquet
uli at gnufix.de
Tue Dec 23 04:17:52 EST 2008
Log message for revision 94260:
Add urllib2 compatible HTTP handlers with timeout.
Changed:
U grokui.admin/branches/ulif-securitynotifications/src/grokui/admin/utilities.py
-=-
Modified: grokui.admin/branches/ulif-securitynotifications/src/grokui/admin/utilities.py
===================================================================
--- grokui.admin/branches/ulif-securitynotifications/src/grokui/admin/utilities.py 2008-12-23 08:50:06 UTC (rev 94259)
+++ grokui.admin/branches/ulif-securitynotifications/src/grokui/admin/utilities.py 2008-12-23 09:17:52 UTC (rev 94260)
@@ -13,9 +13,12 @@
##############################################################################
"""Helper functions for grok admin.
"""
+import httplib
import pkg_resources
import re
+import socket
import urllib
+import urllib2
from zope.tal.taldefs import attrEscape
from urlparse import urlparse, urlunparse
@@ -276,3 +279,54 @@
if info.has_version and info.version:
return info.version
return None
+
+class TimeoutableHTTPConnection(httplib.HTTPConnection):
+ """A customised HTTPConnection allowing a per-connection
+ timeout, specified at construction.
+ """
+
+ def __init__(self, host, port=None, strict=None, timeout=None):
+ httplib.HTTPConnection.__init__(self, host, port,
+ strict)
+ self.timeout = timeout
+
+ def connect(self):
+ """Override HTTPConnection.connect to connect to
+ host/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 self.timeout: # this is the new bit
+ self.sock.settimeout(self.timeout)
+ self.sock.connect(sa)
+ except socket.error, msg:
+ if self.sock:
+ self.sock.close()
+ self.sock = None
+ continue
+ break
+ if not self.sock:
+ raise socket.error, msg
+
+class TimeoutableHTTPHandler(urllib2.HTTPHandler):
+ """A customised HTTPHandler which times out connection
+ after the duration specified at construction.
+ """
+
+ def __init__(self, timeout=None):
+ urllib2.HTTPHandler.__init__(self)
+ self.timeout = timeout
+
+ def http_open(self, req):
+ """Override http_open."""
+
+ def makeConnection(host, port=None, strict=None):
+ return TimeoutableHTTPConnection(host, port, strict,
+ timeout = self.timeout)
+
+ return self.do_open(makeConnection, req)
+
More information about the Checkins
mailing list