[CalendarServer-changes] [2557] CalendarServer/trunk/twistedcaldav

source_changes at macosforge.org source_changes at macosforge.org
Mon Jun 16 11:45:14 PDT 2008


Revision: 2557
          http://trac.macosforge.org/projects/calendarserver/changeset/2557
Author:   dreid at apple.com
Date:     2008-06-16 11:45:14 -0700 (Mon, 16 Jun 2008)

Log Message:
-----------
Call the super's renderHTTP so that any dav headers added by it are properly cached.  This is very fragile, twisted's architecture currently provides no means to ensure that our caching is the _last_ thing that happens to a response.

Modified Paths:
--------------
    CalendarServer/trunk/twistedcaldav/cache.py
    CalendarServer/trunk/twistedcaldav/test/test_cache.py

Modified: CalendarServer/trunk/twistedcaldav/cache.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/cache.py	2008-06-13 23:42:17 UTC (rev 2556)
+++ CalendarServer/trunk/twistedcaldav/cache.py	2008-06-16 18:45:14 UTC (rev 2557)
@@ -22,7 +22,7 @@
 from zope.interface import implements
 
 from twisted.python.failure import Failure
-from twisted.internet.defer import succeed, fail
+from twisted.internet.defer import succeed, fail, maybeDeferred
 from twisted.internet.protocol import ClientCreator
 
 from twisted.web2.iweb import IResource
@@ -307,7 +307,7 @@
 
 
 class PropfindCacheMixin(object):
-    def http_PROPFIND(self, request):
+    def renderHTTP(self, request):
         def _cacheResponse(responseCache, response):
             return responseCache.cacheResponseForRequest(request, response)
 
@@ -317,6 +317,8 @@
             d1.addCallback(_cacheResponse, response)
             return d1
 
-        d = super(PropfindCacheMixin, self).http_PROPFIND(request)
-        d.addCallback(_getResponseCache)
+        d = maybeDeferred(super(PropfindCacheMixin, self).renderHTTP, request)
+
+        if request.method == 'PROPFIND':
+            d.addCallback(_getResponseCache)
         return d

Modified: CalendarServer/trunk/twistedcaldav/test/test_cache.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/test_cache.py	2008-06-13 23:42:17 UTC (rev 2556)
+++ CalendarServer/trunk/twistedcaldav/test/test_cache.py	2008-06-16 18:45:14 UTC (rev 2557)
@@ -19,7 +19,7 @@
 import cPickle
 
 from twisted.trial.unittest import TestCase
-from twisted.internet.defer import succeed, fail
+from twisted.internet.defer import succeed, fail, maybeDeferred
 from twisted.python.failure import Failure
 
 from twisted.python.filepath import FilePath
@@ -31,6 +31,7 @@
 
 from twistedcaldav.cache import MemcacheResponseCache
 from twistedcaldav.cache import MemcacheChangeNotifier
+from twistedcaldav.cache import PropfindCacheMixin
 
 from twistedcaldav.test.util import InMemoryMemcacheProtocol
 
@@ -359,8 +360,6 @@
                      dict(list(expected_response[1].getAllRawHeaders())),
                      expected_response[2]))))
 
-        print self.memcacheStub._cache
-
         d = self.rc.getResponseForRequest(
             StubRequest('PROPFIND',
                         '/calendars/users/cdaboo/',
@@ -369,3 +368,81 @@
         d.addCallback(self.assertResponse, expected_response)
         return d
 
+
+
+class StubResponseCacheResource(object):
+    def __init__(self):
+        self.cache = {}
+        self.responseCache = self
+
+
+    def getResponseForRequest(self, request):
+        if request in self.cache:
+            return self.cache[request]
+
+
+    def cacheResponseForRequest(self, request, response):
+        self.cache[request] = response
+        return response
+
+
+
+class TestRenderMixin(object):
+    davHeaders = ('foo',)
+
+    def renderHTTP(self, request):
+        self.response.headers.setHeader('dav', self.davHeaders)
+
+        return self.response
+
+
+
+class TestCachingResource(PropfindCacheMixin, TestRenderMixin):
+    def __init__(self, response):
+        self.response = response
+
+
+
+class PropfindCacheMixinTests(TestCase):
+    """
+    Test the PropfindCacheMixin
+    """
+    def setUp(self):
+        self.resource = TestCachingResource(StubResponse(200, {}, "foobar"))
+        self.responseCache = StubResponseCacheResource()
+
+    def test_DAVHeaderCached(self):
+        """
+        Test that the DAV header set in renderHTTP is cached.
+        """
+        def _checkCache(response):
+            self.assertEquals(response.headers.getHeader('dav'),
+                              ('foo',))
+            self.assertEquals(
+                self.responseCache.cache[request].headers.getHeader('dav'),
+                ('foo',))
+
+        request = StubRequest('PROPFIND', '/', '/')
+        request.resources['/'] = self.responseCache
+
+        d = maybeDeferred(self.resource.renderHTTP, request)
+        d.addCallback(_checkCache)
+
+        return d
+
+
+    def test_onlyCachePropfind(self):
+        """
+        Test that we only cache the result of a propfind request.
+        """
+        def _checkCache(response):
+            self.assertEquals(self.responseCache.getResponseForRequest(request),
+                              None)
+
+        request = StubRequest('GET', '/', '/')
+        request.resources['/'] = self.responseCache
+
+        d = maybeDeferred(self.resource.renderHTTP, request)
+        d.addCallback(_checkCache)
+
+        return d

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20080616/7045f32d/attachment.htm 


More information about the calendarserver-changes mailing list