[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