[Zope-Checkins] SVN: Zope/trunk/lib/python/OFS/ Merge the fix in r69331 from 2.10 branch (WebDAV/HEAD request acquisition issue)

Alec Mitchell apm13 at columbia.edu
Tue Aug 1 15:49:56 EDT 2006


Log message for revision 69332:
  Merge the fix in r69331 from 2.10 branch (WebDAV/HEAD request acquisition issue)
  

Changed:
  U   Zope/trunk/lib/python/OFS/Traversable.py
  U   Zope/trunk/lib/python/OFS/tests/testTraverse.py

-=-
Modified: Zope/trunk/lib/python/OFS/Traversable.py
===================================================================
--- Zope/trunk/lib/python/OFS/Traversable.py	2006-08-01 19:30:42 UTC (rev 69331)
+++ Zope/trunk/lib/python/OFS/Traversable.py	2006-08-01 19:49:56 UTC (rev 69332)
@@ -26,6 +26,7 @@
 from zExceptions import NotFound
 from ZODB.POSException import ConflictError
 from OFS.interfaces import ITraversable
+import webdav
 
 from zope.interface import implements, Interface
 from zope.component import queryMultiAdapter
@@ -165,6 +166,7 @@
         else:
             obj = self
 
+        resource = _marker
         try:
             while path:
                 name = path_pop()
@@ -237,6 +239,13 @@
                         else:
                             try:
                                 next = obj[name]
+                                # The item lookup may return a NullResource,
+                                # if this is the case we save it and return it
+                                # if all other lookups fail.
+                                if isinstance(next,
+                                              webdav.NullResource.NullResource):
+                                    resource = next
+                                    raise KeyError(name)
                             except AttributeError:
                                 # Raise NotFound for easier debugging
                                 # instead of AttributeError: __getitem__
@@ -268,8 +277,11 @@
                         except AttributeError:
                             raise e
                         if next is _marker:
-                            # Nothing found re-raise error
-                            raise e
+                            # If we have a NullResource from earlier use it.
+                            next = resource
+                            if next is _marker:
+                                # Nothing found re-raise error
+                                raise e
 
                 obj = next
 

Modified: Zope/trunk/lib/python/OFS/tests/testTraverse.py
===================================================================
--- Zope/trunk/lib/python/OFS/tests/testTraverse.py	2006-08-01 19:30:42 UTC (rev 69331)
+++ Zope/trunk/lib/python/OFS/tests/testTraverse.py	2006-08-01 19:49:56 UTC (rev 69332)
@@ -592,11 +592,25 @@
 
     However, acquired attributes *should* be shadowed. See discussion on
     http://codespeak.net/pipermail/z3-five/2006q2/001474.html
-    
+
       >>> manage_addIndexSimpleContent(self.folder, 'mouse', 'Mouse')
       >>> self.folder.ftf.unrestrictedTraverse('mouse')()
       u'The mouse has been eaten by the eagle'
-      
+
+    Head requests have some unusual behavior in Zope 2, in particular, a failed
+    item lookup on an ObjectManager returns a NullResource, rather
+    than raising a KeyError.  We need to make sure that this doesn't
+    result in acquired attributes being shadowed by the NullResource,
+    but that unknown names still give NullResources:
+
+      >>> self.app.REQUEST.maybe_webdav_client = True
+      >>> self.app.REQUEST['REQUEST_METHOD'] = 'HEAD'
+      >>> self.folder.ftf.unrestrictedTraverse('mouse')()
+      u'The mouse has been eaten by the eagle'
+      >>> self.folder.ftf.unrestrictedTraverse('nonsense')
+      <webdav.NullResource.NullResource object at ...>
+
+
     Clean up:
 
       >>> from zope.app.testing.placelesssetup import tearDown



More information about the Zope-Checkins mailing list