[Checkins] SVN: zope.webdav/trunk/src/zope/webdav/ When an error
occurs when rendering a property for viewing
Michael Kerrin
michael.kerrin at openapp.biz
Sun Aug 27 09:51:00 EDT 2006
Log message for revision 69795:
When an error occurs when rendering a property for viewing
which has no view, then we log the error with the IErrorReportingUtility
for fixing, and set a status of 500 (Internal Server Error) for this
property.
Changed:
U zope.webdav/trunk/src/zope/webdav/propfind.py
U zope.webdav/trunk/src/zope/webdav/tests/test_propfind.py
-=-
Modified: zope.webdav/trunk/src/zope/webdav/propfind.py
===================================================================
--- zope.webdav/trunk/src/zope/webdav/propfind.py 2006-08-27 13:45:42 UTC (rev 69794)
+++ zope.webdav/trunk/src/zope/webdav/propfind.py 2006-08-27 13:50:58 UTC (rev 69795)
@@ -41,6 +41,7 @@
from zope import interface
from zope import component
from zope.app.container.interfaces import IReadContainer
+from zope.app.error.interfaces import IErrorReportingUtility
from zope.etree.interfaces import IEtree
import zope.webdav.utils
@@ -195,14 +196,20 @@
error_view = component.queryMultiAdapter(
(error, req), zope.webdav.interfaces.IDAVErrorWidget)
if error_view is None:
+ ## An unexpected error occured here. This errr should be
+ ## fixed. In order to easily debug the problem we will
+ ## log the error with the ErrorReportingUtility
+ errUtility = component.getUtility(IErrorReportingUtility)
+ errUtility.raising(exc_info, req)
+ propstat = response.getPropstat(500) # Internal Server Error
+ else:
+ propstat = response.getPropstat(error_view.status)
## XXX - needs testing
- raise exc_info[0], exc_info[1], exc_info[2]
+ propstat.responsedescription += \
+ error_view.propstatdescription
+ response.responsedescription += \
+ error_view.responsedescription
- propstat = response.getPropstat(error_view.status)
- ## XXX - needs testing
- propstat.responsedescription += error_view.propstatdescription
- response.responsedescription += error_view.responsedescription
-
rendered_el = etree.Element(prop.tag)
propstat.properties.append(rendered_el)
Modified: zope.webdav/trunk/src/zope/webdav/tests/test_propfind.py
===================================================================
--- zope.webdav/trunk/src/zope/webdav/tests/test_propfind.py 2006-08-27 13:45:42 UTC (rev 69794)
+++ zope.webdav/trunk/src/zope/webdav/tests/test_propfind.py 2006-08-27 13:50:58 UTC (rev 69795)
@@ -29,6 +29,7 @@
import zope.schema.interfaces
from zope.traversing.browser.interfaces import IAbsoluteURL
from zope.app.container.interfaces import IReadContainer
+from zope.app.error.interfaces import IErrorReportingUtility
import zope.webdav.properties
import zope.webdav.publisher
@@ -189,6 +190,8 @@
"{DAVtest:}extratextprop", IExtraPropertyStorage)
brokenProperty = zope.webdav.properties.DAVProperty(
"{DAVtest:}brokenprop", IBrokenPropertyStorage)
+# this is a hack to make all the render all properties work as this broken
+# property then never shows up these tests responses.
brokenProperty.restricted = True
@@ -371,6 +374,16 @@
zope.webdav.interfaces.IWebDAVRequest))
+class ErrorReportingUtility(object):
+ interface.implements(IErrorReportingUtility)
+
+ def __init__(self):
+ self.errors = []
+
+ def raising(self, exc_info, request):
+ self.errors.append((exc_info, request))
+
+
class PROPFINDTestRender(unittest.TestCase, TestMultiStatusBody):
# Test all the methods that render a resource into a `response' XML
# element. We are going to need to register the DAV widgets for
@@ -378,9 +391,15 @@
def setUp(self):
propfindSetUp()
+ ## This is for the test_renderBrokenProperty
+ self.errUtility = ErrorReportingUtility()
+ component.getGlobalSiteManager().registerUtility(self.errUtility)
def tearDown(self):
propfindTearDown()
+ ## This is for the test_renderBrokenProperty
+ component.getGlobalSiteManager().unregisterUtility(self.errUtility)
+ del self.errUtility
def test_renderPropnames(self):
resource = Resource("some text", 10)
@@ -540,7 +559,26 @@
<ns0:status xmlns:ns0="DAV:">HTTP/1.1 200 OK</ns0:status>
</ns0:propstat></ns0:response>""")
+ def test_renderBrokenProperty(self):
+ resource = Resource("some text", 10)
+ request = zope.webdav.publisher.WebDAVRequest(StringIO(""), {})
+ propf = PROPFIND(None, None)
+ etree = component.getUtility(IEtree)
+ props = etree.fromstring("""<prop xmlns="DAV:" xmlns:D="DAVtest:">
+<D:brokenprop />
+</prop>""")
+ response = propf.renderSelectedProperties(resource, request, props)
+ response = response()
+
+ self.assertMSPropertyValue(response, "{DAVtest:}brokenprop",
+ status = 500)
+
+ # now check that the error reporting utility caught the error.
+ error = self.errUtility.errors[0]
+ self.assertEqual(isinstance(error[0][1], NotImplementedError), True)
+
+
class PROPFINDRecuseTest(unittest.TestCase):
def setUp(self):
More information about the Checkins
mailing list