[CalendarServer-changes] [2374] CalendarServer/branches/propfind-cache/twistedcaldav

source_changes at macosforge.org source_changes at macosforge.org
Tue May 6 12:47:48 PDT 2008


Revision: 2374
          http://trac.macosforge.org/projects/calendarserver/changeset/2374
Author:   dreid at apple.com
Date:     2008-05-06 12:47:46 -0700 (Tue, 06 May 2008)

Log Message:
-----------
Actually serve the whole response from the cache, also cache PROPFINDs on the Calendar home and PrincipalURI.

Modified Paths:
--------------
    CalendarServer/branches/propfind-cache/twistedcaldav/cache.py
    CalendarServer/branches/propfind-cache/twistedcaldav/directory/principal.py
    CalendarServer/branches/propfind-cache/twistedcaldav/root.py
    CalendarServer/branches/propfind-cache/twistedcaldav/static.py
    CalendarServer/branches/propfind-cache/twistedcaldav/test/test_cache.py

Modified: CalendarServer/branches/propfind-cache/twistedcaldav/cache.py
===================================================================
--- CalendarServer/branches/propfind-cache/twistedcaldav/cache.py	2008-05-06 17:42:02 UTC (rev 2373)
+++ CalendarServer/branches/propfind-cache/twistedcaldav/cache.py	2008-05-06 19:47:46 UTC (rev 2374)
@@ -25,7 +25,10 @@
 
 from twisted.web2.iweb import IResource
 from twisted.web2.dav import davxml
-from twisted.web2.http import HTTPError
+from twisted.web2.dav.util import allDataFromStream
+from twisted.web2.http import HTTPError, Response
+from twisted.web2.stream import MemoryStream
+
 from twisted.web2.dav.xattrprops import xattrPropertyStore
 
 class CacheTokensProperty(davxml.WebDAVTextElement):
@@ -125,6 +128,7 @@
         key = (request.method,
                request.uri,
                principalURI)
+
         if key not in self._responses:
             return None
 
@@ -139,7 +143,9 @@
         elif self._time() >= cacheTime + self.CACHE_TIMEOUT:
             return None
 
-        return response
+        return Response(response[0],
+                        headers=response[1],
+                        stream=MemoryStream(response[2]))
 
 
     def cacheResponseForRequest(self, request, response):
@@ -151,18 +157,29 @@
 
         @param response: An L{IResponse} provider that will be returned on
             subsequent checks for the given L{IRequest}
+
+        @return: A deferred that fires when the response has been added
+            to the cache.
         """
-        principalURI = self._principalURI(request.authnUser)
+        def _cacheResponse(body):
+            principalURI = self._principalURI(request.authnUser)
 
-        key = (request.method,
-               request.uri,
-               principalURI)
+            key = (request.method,
+                   request.uri,
+                   principalURI)
 
-        self._responses[key] = (self._tokenForURI(principalURI),
-                                self._tokenForURI(request.uri),
-                                self._time(), response)
+            self._responses[key] = (self._tokenForURI(principalURI),
+                                    self._tokenForURI(request.uri),
+                                    self._time(), (response.code,
+                                                   response.headers,
+                                                   body))
 
+        d = allDataFromStream(response.stream)
+        d.addCallback(_cacheResponse)
+        return d
 
+
+
 class _CachedResponseResource(object):
     implements(IResource)
 

Modified: CalendarServer/branches/propfind-cache/twistedcaldav/directory/principal.py
===================================================================
--- CalendarServer/branches/propfind-cache/twistedcaldav/directory/principal.py	2008-05-06 17:42:02 UTC (rev 2373)
+++ CalendarServer/branches/propfind-cache/twistedcaldav/directory/principal.py	2008-05-06 19:47:46 UTC (rev 2374)
@@ -534,6 +534,22 @@
     def listChildren(self):
         return ()
 
+    def http_PROPFIND(self, request):
+        def _cacheResponse(response):
+            print "Caching response: %r" % (response,)
+            responseCache = request.site.resource.resource.resource.resource.responseCache
+            d1 = responseCache.cacheResponseForRequest(request, response)
+            d1.addCallback(
+                lambda ign: responseCache.getResponseForRequest(request))
+            return d1
+
+        d = super(DirectoryPrincipalResource, self).http_PROPFIND(request)
+        d.addCallback(_cacheResponse)
+        return d
+
+
+
+
 class DirectoryCalendarPrincipalResource (DirectoryPrincipalResource, CalendarPrincipalResource):
     """
     Directory calendar principal resource.

Modified: CalendarServer/branches/propfind-cache/twistedcaldav/root.py
===================================================================
--- CalendarServer/branches/propfind-cache/twistedcaldav/root.py	2008-05-06 17:42:02 UTC (rev 2373)
+++ CalendarServer/branches/propfind-cache/twistedcaldav/root.py	2008-05-06 19:47:46 UTC (rev 2374)
@@ -136,7 +136,7 @@
         def _getCachedResource(_ign, request):
             response = self.responseCache.getResponseForRequest(request)
             assert response is not None
-            print "Serving from cache %r." % (response,)
+            print "Serving from cache %r, %r." % (request, response)
             return _CachedResponseResource(response), []
 
         def _resourceNotInCacheEb(failure):

Modified: CalendarServer/branches/propfind-cache/twistedcaldav/static.py
===================================================================
--- CalendarServer/branches/propfind-cache/twistedcaldav/static.py	2008-05-06 17:42:02 UTC (rev 2373)
+++ CalendarServer/branches/propfind-cache/twistedcaldav/static.py	2008-05-06 19:47:46 UTC (rev 2374)
@@ -571,11 +571,13 @@
         def _cacheResponse(response):
             print "Caching response: %r" % (response,)
             responseCache = request.site.resource.resource.resource.resource.responseCache
-            responseCache.cacheResponseForRequest(request, response)
-            return response
+            d1 = responseCache.cacheResponseForRequest(request, response)
+            d1.addCallback(
+                lambda ign: responseCache.getResponseForRequest(request))
+            return d1
 
         d = super(CalendarHomeFile, self).http_PROPFIND(request)
-        d.addBoth(_cacheResponse)
+        d.addCallback(_cacheResponse)
         return d
 
 class ScheduleFile (AutoProvisioningFileMixIn, CalDAVFile):

Modified: CalendarServer/branches/propfind-cache/twistedcaldav/test/test_cache.py
===================================================================
--- CalendarServer/branches/propfind-cache/twistedcaldav/test/test_cache.py	2008-05-06 17:42:02 UTC (rev 2373)
+++ CalendarServer/branches/propfind-cache/twistedcaldav/test/test_cache.py	2008-05-06 19:47:46 UTC (rev 2374)
@@ -21,6 +21,9 @@
 from twisted.python.filepath import FilePath
 
 from twisted.web2.dav import davxml
+from twisted.web2.dav.util import allDataFromStream
+from twisted.web2.stream import MemoryStream
+from twisted.web2.http_headers import Headers
 
 from twistedcaldav.cache import CacheChangeNotifier
 from twistedcaldav.cache import CacheTokensProperty
@@ -47,7 +50,16 @@
         self.cacheRequest = False
 
 
+class StubResponse(object):
+    def __init__(self, code, headers, body):
+        self.code = code
+        self.headers = Headers(headers)
+        self.body = body
 
+        self.stream = MemoryStream(body)
+
+
+
 class CacheChangeNotifierTests(TestCase):
     def setUp(self):
         self.props = InMemoryPropertyStore()
@@ -85,7 +97,7 @@
 
         self.rc._time = (lambda:0)
 
-        self.expected_response = object()
+        self.expected_response = (200, Headers({}), "Foo")
 
         self.rc._responses[(
                 'PROPFIND',
@@ -94,6 +106,15 @@
             'principalToken0', 'uriToken0', 0, self.expected_response)
 
 
+    def assertResponse(self, response, expected):
+        self.assertEquals(response.code, expected[0])
+        self.assertEquals(response.headers, expected[1])
+
+        d = allDataFromStream(response.stream)
+        d.addCallback(self.assertEquals, expected[2])
+        return d
+
+
     def test_getResponseForRequestNotInCache(self):
         response = self.rc.getResponseForRequest(StubRequest(
                 'PROPFIND',
@@ -109,7 +130,7 @@
                 '/calendars/users/cdaboo/',
                 '/principals/users/cdaboo/'))
 
-        self.assertEquals(self.expected_response, response)
+        self.assertResponse(response, self.expected_response)
 
 
     def test_getResponseForRequestPrincipalTokenChanged(self):
@@ -146,20 +167,31 @@
 
 
     def test_cacheResponseForRequest(self):
-        expected_response = object()
-        self.rc.cacheResponseForRequest(StubRequest('PROPFIND',
-                                                    '/principals/users/dreid/',
-                                                    '/principals/users/dreid/'),
-                                        expected_response)
+        expected_response = StubResponse(200, {}, "Foobar")
 
-        response = self.rc.getResponseForRequest(StubRequest(
-                'PROPFIND',
-                '/principals/users/dreid/',
-                '/principals/users/dreid/'))
+        def _assertResponse(ign):
+            response = self.rc.getResponseForRequest(StubRequest(
+                    'PROPFIND',
+                    '/principals/users/dreid/',
+                    '/principals/users/dreid/'))
 
-        self.assertEquals(response, expected_response)
 
+            return self.assertResponse(response,
+                                       (expected_response.code,
+                                        expected_response.headers,
+                                        expected_response.body))
 
+
+        d = self.rc.cacheResponseForRequest(
+            StubRequest('PROPFIND',
+                        '/principals/users/dreid/',
+                        '/principals/users/dreid/'),
+            expected_response)
+
+        d.addCallback(_assertResponse)
+        return d
+
+
     def test__tokenForURI(self):
         docroot = FilePath(self.mktemp())
         principal = docroot.child('principals').child('users').child('wsanchez')

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20080506/da48e2a8/attachment.html


More information about the calendarserver-changes mailing list