[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