[CalendarServer-changes] [2390]
CalendarServer/branches/propfind-cache-2/twistedcaldav
source_changes at macosforge.org
source_changes at macosforge.org
Wed May 7 15:39:15 PDT 2008
Revision: 2390
http://trac.macosforge.org/projects/calendarserver/changeset/2390
Author: dreid at apple.com
Date: 2008-05-07 15:39:15 -0700 (Wed, 07 May 2008)
Log Message:
-----------
Key on depth header and request body as well as method, uri, and principal uri
Modified Paths:
--------------
CalendarServer/branches/propfind-cache-2/twistedcaldav/cache.py
CalendarServer/branches/propfind-cache-2/twistedcaldav/root.py
CalendarServer/branches/propfind-cache-2/twistedcaldav/test/test_cache.py
Modified: CalendarServer/branches/propfind-cache-2/twistedcaldav/cache.py
===================================================================
--- CalendarServer/branches/propfind-cache-2/twistedcaldav/cache.py 2008-05-07 22:25:07 UTC (rev 2389)
+++ CalendarServer/branches/propfind-cache-2/twistedcaldav/cache.py 2008-05-07 22:39:15 UTC (rev 2390)
@@ -125,31 +125,49 @@
@return: An L{IResponse} or C{None} if the response has not been cached.
"""
- principalURI = self._principalURI(request.authnUser)
+ def _returnRequest(requestBody):
- key = (request.method,
- request.uri,
- principalURI)
+ if requestBody is not None:
+ request.stream = MemoryStream(requestBody)
+ request.stream.doStartReading = None
- if key not in self._responses:
- return None
+ principalURI = self._principalURI(request.authnUser)
- principalToken, uriToken, cacheTime, response = self._responses[key]
+ key = (request.method,
+ request.uri,
+ principalURI,
+ request.headers.getHeader('depth'),
+ hash(requestBody))
- if self._tokenForURI(principalURI) != principalToken:
- return None
+ print "Looking in cache for:"
+ import pprint; pprint.pprint(key)
- elif self._tokenForURI(request.uri) != uriToken:
- return None
+ request.cacheKey = key
- elif self._time() >= cacheTime + self.CACHE_TIMEOUT:
- return None
+ if key not in self._responses:
+ pprint.pprint(self._responses.keys())
+ return None
- return Response(response[0],
- headers=response[1],
- stream=MemoryStream(response[2]))
+ principalToken, uriToken, cacheTime, response = self._responses[key]
+ if self._tokenForURI(principalURI) != principalToken:
+ return None
+ elif self._tokenForURI(request.uri) != uriToken:
+ return None
+
+ elif self._time() >= cacheTime + self.CACHE_TIMEOUT:
+ return None
+
+ return Response(response[0],
+ headers=response[1],
+ stream=MemoryStream(response[2]))
+
+ d = allDataFromStream(request.stream)
+ d.addCallback(_returnRequest)
+ return d
+
+
def cacheResponseForRequest(self, request, response):
"""
Cache the given C{response} for the given C{request}.
@@ -163,20 +181,41 @@
@return: A deferred that fires when the response has been added
to the cache.
"""
- def _cacheResponse(body):
+ def _getRequestBody(responseBody):
+ d1 = allDataFromStream(request.stream)
+ d1.addCallback(lambda requestBody: (requestBody, responseBody))
+ return d1
+
+ def _cacheResponse((requestBody, responseBody)):
+ if requestBody is not None:
+ request.stream = MemoryStream(requestBody)
+ request.stream.doStartReading = None
+
principalURI = self._principalURI(request.authnUser)
- key = (request.method,
- request.uri,
- principalURI)
+ if hasattr(request, 'cacheKey'):
+ key = request.cacheKey
+ else:
+ key = (request.method,
+ request.uri,
+ principalURI,
+ request.headers.getHeader('depth'),
+ hash(requestBody))
self._responses[key] = (self._tokenForURI(principalURI),
self._tokenForURI(request.uri),
self._time(), (response.code,
response.headers,
- body))
+ responseBody))
+ print self._responses.keys()
+
+ response.stream = MemoryStream(responseBody)
+ return response
+
+
d = allDataFromStream(response.stream)
+ d.addCallback(_getRequestBody)
d.addCallback(_cacheResponse)
return d
@@ -198,13 +237,10 @@
class PropfindCacheMixin(object):
def http_PROPFIND(self, request):
def _cacheResponse(responseCache, response):
- d2 = responseCache.cacheResponseForRequest(request, response)
- d2.addCallback(
- lambda ign: responseCache.getResponseForRequest(request))
- return d2
+ return responseCache.cacheResponseForRequest(request, response)
def _getResponseCache(response):
- print "Caching response: %r" % (response,)
+ print "Caching response: %r, %r" % (request.stream, response)
d1 = request.locateResource("/")
d1.addCallback(lambda resource: resource.responseCache)
d1.addCallback(_cacheResponse, response)
Modified: CalendarServer/branches/propfind-cache-2/twistedcaldav/root.py
===================================================================
--- CalendarServer/branches/propfind-cache-2/twistedcaldav/root.py 2008-05-07 22:25:07 UTC (rev 2389)
+++ CalendarServer/branches/propfind-cache-2/twistedcaldav/root.py 2008-05-07 22:39:15 UTC (rev 2390)
@@ -134,15 +134,23 @@
return d
def _getCachedResource(_ign, request):
- response = self.responseCache.getResponseForRequest(request)
- assert response is not None
+ d = self.responseCache.getResponseForRequest(request)
+ d.addCallback(_serveResponse)
+ return d
+
+ def _serveResponse(response):
+ if response is None:
+ request.notInCache = True
+ raise KeyError("Not found in cache.")
+
print "Serving from cache %r, %r." % (request, response)
return _CachedResponseResource(response), []
def _resourceNotInCacheEb(failure):
return super(RootResource, self).locateChild(request,segments)
- if request.method == 'PROPFIND':
+ if request.method == 'PROPFIND' and not getattr(
+ request, 'notInCache', False):
d = defer.maybeDeferred(self.authenticate, request)
d.addCallbacks(_authCb, _authEb)
d.addCallback(_getCachedResource, request)
Modified: CalendarServer/branches/propfind-cache-2/twistedcaldav/test/test_cache.py
===================================================================
--- CalendarServer/branches/propfind-cache-2/twistedcaldav/test/test_cache.py 2008-05-07 22:25:07 UTC (rev 2389)
+++ CalendarServer/branches/propfind-cache-2/twistedcaldav/test/test_cache.py 2008-05-07 22:39:15 UTC (rev 2390)
@@ -42,20 +42,24 @@
class StubRequest(object):
- def __init__(self, method, uri, authnUser):
+ def __init__(self, method, uri, authnUser, depth=1, body=None):
self.method = method
self.uri = uri
self.authnUser = davxml.Principal(davxml.HRef.fromString(authnUser))
+ self.headers = Headers({'depth': depth})
- self.cacheRequest = False
+ if body is None:
+ body = "foobar"
+ self.body = body
+ self.stream = MemoryStream(body)
+
class StubResponse(object):
def __init__(self, code, headers, body):
self.code = code
self.headers = Headers(headers)
self.body = body
-
self.stream = MemoryStream(body)
@@ -102,7 +106,10 @@
self.rc._responses[(
'PROPFIND',
'/calendars/users/cdaboo/',
- '/principals/users/cdaboo/')] = (
+ '/principals/users/cdaboo/',
+ 1,
+ 'foobar',
+ )] = (
'principalToken0', 'uriToken0', 0, self.expected_response)
@@ -116,72 +123,98 @@
def test_getResponseForRequestNotInCache(self):
- response = self.rc.getResponseForRequest(StubRequest(
+ d = self.rc.getResponseForRequest(StubRequest(
'PROPFIND',
'/calendars/users/dreid/',
'/principals/users/dreid/'))
- self.assertEquals(response, None)
+ d.addCallback(self.assertEquals, None)
+ return d
-
def test_getResponseForRequestInCache(self):
- response = self.rc.getResponseForRequest(StubRequest(
+ d = self.rc.getResponseForRequest(StubRequest(
'PROPFIND',
'/calendars/users/cdaboo/',
'/principals/users/cdaboo/'))
- self.assertResponse(response, self.expected_response)
+ d.addCallback(self.assertResponse, self.expected_response)
+ return d
def test_getResponseForRequestPrincipalTokenChanged(self):
self.tokens['/principals/users/cdaboo/'] = 'principalToken1'
- response = self.rc.getResponseForRequest(StubRequest(
+ d = self.rc.getResponseForRequest(StubRequest(
'PROPFIND',
'/calendars/users/cdaboo/',
'/principals/users/cdaboo/'))
- self.assertEquals(response, None)
+ d.addCallback(self.assertEquals, None)
+ return d
def test_getResponseForRequestUriTokenChanged(self):
self.tokens['/calendars/users/cdaboo/'] = 'uriToken1'
- response = self.rc.getResponseForRequest(StubRequest(
+ d = self.rc.getResponseForRequest(StubRequest(
'PROPFIND',
'/calendars/users/cdaboo/',
'/principals/users/cdaboo/'))
- self.assertEquals(response, None)
+ d.addCallback(self.assertEquals, None)
+ return d
def test_getResponseForRequestCacheTimeoutLapsed(self):
self.rc._time = (lambda: 50000)
- response = self.rc.getResponseForRequest(StubRequest(
+ d = self.rc.getResponseForRequest(StubRequest(
'PROPFIND',
'/calendars/users/cdaboo/',
'/principals/users/cdaboo/'))
- self.assertEquals(response, None)
+ d.addCallback(self.assertEquals, None)
+ return d
+ def test_getResponseForDepthZero(self):
+ d = self.rc.getResponseForRequest(StubRequest(
+ 'PROPFIND',
+ '/calendars/users/cdaboo/',
+ '/principals/users/cdaboo/',
+ depth=0))
+
+ d.addCallback(self.assertEquals, None)
+ return d
+
+
+ def test_getResponseForBody(self):
+ d = self.rc.getResponseForRequest(StubRequest(
+ 'PROPFIND',
+ '/calendars/users/cdaboo/',
+ '/principals/users/cdaboo',
+ body='bazbax'))
+
+ d.addCallback(self.assertEquals, None)
+ return d
+
+
def test_cacheResponseForRequest(self):
expected_response = StubResponse(200, {}, "Foobar")
def _assertResponse(ign):
- response = self.rc.getResponseForRequest(StubRequest(
+ d1 = self.rc.getResponseForRequest(StubRequest(
'PROPFIND',
'/principals/users/dreid/',
'/principals/users/dreid/'))
- return self.assertResponse(response,
- (expected_response.code,
- expected_response.headers,
- expected_response.body))
+ d1.addCallback(self.assertResponse,
+ (expected_response.code,
+ expected_response.headers,
+ expected_response.body))
+ return d1
-
d = self.rc.cacheResponseForRequest(
StubRequest('PROPFIND',
'/principals/users/dreid/',
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20080507/fcd3386a/attachment-0001.html
More information about the calendarserver-changes
mailing list