[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