[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