[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