You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@chemistry.apache.org by jp...@apache.org on 2010/11/02 15:06:12 UTC

svn commit: r1030049 - /incubator/chemistry/cmislib/trunk/src/cmislib/net.py

Author: jpotts
Date: Tue Nov  2 14:06:12 2010
New Revision: 1030049

URL: http://svn.apache.org/viewvc?rev=1030049&view=rev
Log:
Applied patch CMIS-236

Modified:
    incubator/chemistry/cmislib/trunk/src/cmislib/net.py

Modified: incubator/chemistry/cmislib/trunk/src/cmislib/net.py
URL: http://svn.apache.org/viewvc/incubator/chemistry/cmislib/trunk/src/cmislib/net.py?rev=1030049&r1=1030048&r2=1030049&view=diff
==============================================================================
--- incubator/chemistry/cmislib/trunk/src/cmislib/net.py (original)
+++ incubator/chemistry/cmislib/trunk/src/cmislib/net.py Tue Nov  2 14:06:12 2010
@@ -25,7 +25,8 @@ from urllib2 import HTTPBasicAuthHandler
                     HTTPDefaultErrorHandler, \
                     HTTPError, \
                     Request, \
-                    build_opener
+                    build_opener, \
+                    AbstractBasicAuthHandler
 
 
 class SmartRedirectHandler(HTTPRedirectHandler):
@@ -58,6 +59,34 @@ class DefaultErrorHandler(HTTPDefaultErr
         result.status = code
         return result
 
+class ContextualBasicAuthHandler(HTTPBasicAuthHandler):
+    
+    """
+    Handles 401 errors without recursing indefinitely. The recursing
+    behaviour has been introduced in Python 2.6.5 to handle 401 redirects
+    used by some architectures of authentication.
+    """
+    
+    def __init__(self, password_mgr):
+        HTTPBasicAuthHandler.__init__(self, password_mgr)
+        self.authContext = set([])
+    
+    def http_error_401(self, req, fp, code, msg, headers):
+        """Override the default autoretry behaviour"""
+        url = req.get_full_url()
+        hdrs = req.header_items()
+        hdrs = ', '.join(['%s: %s' % (key, value) 
+                          for key, value in sorted(hdrs)])
+        context = (url, hdrs)
+        if context in self.authContext:
+            self.authContext.clear()
+            result = HTTPError(
+                req.get_full_url(), code, msg, headers, fp)
+            result.status = code
+            return result
+        self.authContext.add(context)
+        return self.http_error_auth_reqed('www-authenticate',
+                                          url, req, headers)
 
 class RESTService(object):
 
@@ -93,8 +122,8 @@ class RESTService(object):
         passwordManager.add_password(None, url, username, password)
 
         opener = build_opener(SmartRedirectHandler(),
-                                      DefaultErrorHandler(),
-                                      HTTPBasicAuthHandler(passwordManager))
+                              DefaultErrorHandler(),
+                              ContextualBasicAuthHandler(passwordManager))
 
         return opener.open(request)
 
@@ -118,8 +147,8 @@ class RESTService(object):
         passwordManager.add_password(None, url, username, password)
 
         opener = build_opener(SmartRedirectHandler(),
-                                      DefaultErrorHandler(),
-                                      HTTPBasicAuthHandler(passwordManager))
+                              DefaultErrorHandler(),
+                              ContextualBasicAuthHandler(passwordManager))
 
         #try:
         #    opener.open(request)
@@ -161,8 +190,8 @@ class RESTService(object):
         passwordManager.add_password(None, url, username, password)
 
         opener = build_opener(SmartRedirectHandler(),
-                                      DefaultErrorHandler(),
-                                      HTTPBasicAuthHandler(passwordManager))
+                              DefaultErrorHandler(),
+                              ContextualBasicAuthHandler(passwordManager))
 
         return opener.open(request)
 
@@ -199,8 +228,8 @@ class RESTService(object):
         passwordManager.add_password(None, url, username, password)
 
         opener = build_opener(SmartRedirectHandler(),
-                                      DefaultErrorHandler(),
-                                      HTTPBasicAuthHandler(passwordManager))
+                              DefaultErrorHandler(),
+                              ContextualBasicAuthHandler(passwordManager))
 
         try:
             return opener.open(request)