[CalendarServer-changes] [6141] CalendarServer/trunk/contrib/performance/httpauth.py

source_changes at macosforge.org source_changes at macosforge.org
Thu Aug 19 17:59:01 PDT 2010


Revision: 6141
          http://trac.macosforge.org/projects/calendarserver/changeset/6141
Author:   exarkun at twistedmatrix.com
Date:     2010-08-19 17:59:00 -0700 (Thu, 19 Aug 2010)
Log Message:
-----------
do a better job with authentication

Modified Paths:
--------------
    CalendarServer/trunk/contrib/performance/httpauth.py

Modified: CalendarServer/trunk/contrib/performance/httpauth.py
===================================================================
--- CalendarServer/trunk/contrib/performance/httpauth.py	2010-08-20 00:58:45 UTC (rev 6140)
+++ CalendarServer/trunk/contrib/performance/httpauth.py	2010-08-20 00:59:00 UTC (rev 6141)
@@ -1,4 +1,4 @@
-import shlex
+import shlex, urlparse
 
 from twisted.web.http_headers import Headers
 
@@ -19,9 +19,17 @@
     def __init__(self, agent, authinfo):
         self._agent = agent
         self._authinfo = authinfo
+        self._challenged = {}
 
 
+    def _authKey(self, method, uri):
+        return urlparse.urlparse(uri)[:2]
+
+
     def request(self, method, uri, headers=None, bodyProducer=None):
+        key = self._authKey(method, uri)
+        if key in self._challenged:
+            return self._respondToChallenge(self._challenged[key], method, uri, headers, bodyProducer)
         d = self._agent.request(method, uri, headers, bodyProducer)
         d.addCallback(self._authenticate, method, uri, headers, bodyProducer)
         return d
@@ -35,7 +43,18 @@
             return BasicChallenge(**args)
         return None
 
+    
+    def _respondToChallenge(self, challenge, method, uri, headers, bodyProducer):
+        if headers is None:
+            headers = Headers()
+        else:
+            headers = Headers(dict(headers.getAllRawHeaders()))
+        for k, vs in challenge.response(uri, self._authinfo).iteritems():
+            for v in vs:
+                headers.addRawHeader(k, v)
+        return self._agent.request(method, uri, headers, bodyProducer)
 
+
     def _authenticate(self, response, method, uri, headers, bodyProducer):
         if response.code == 401:
             # Look for a challenge
@@ -47,17 +66,8 @@
                 challenge = self._parse(auth)
                 if challenge is None:
                     continue
-
-                if headers is None:
-                    headers = Headers()
-                else:
-                    headers = Headers(dict(headers.getAllRawHeaders()))
-                for k, vs in challenge.response(uri, self._authinfo).iteritems():
-                    for v in vs:
-                        headers.addRawHeader(k, v)
-
-                return self._agent.request(method, uri, headers, bodyProducer)
-
+                self._challenged[self._authKey(method, uri)] = challenge
+                return self._respondToChallenge(challenge, method, uri, headers, bodyProducer)
         return response
 
 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20100819/3c2d0f92/attachment.html>


More information about the calendarserver-changes mailing list