 +                return f
 +            return None
 +
-+        d = defer.maybeDeferred(self._getChild, None, resource, [segment], updatepaths=False)
++        d = defer.maybeDeferred(self._getChild, None, parent, [segment], updatepaths=False)
 +        d.addCallback(self._rememberResource, url)
 +        d.addErrback(notFound)
 +        return d

+            The contained response will have a status code of
+            L{responsecode.BAD_REQUEST}.
+        """
+        if resource is None or child_path is None:
+            return None
+        
+        url = joinURL(self.urlForResource(resource), child_path)
+
+        cached = self._urlsByResource.get(url, None)
+        if cached is not None:
+            return succeed(cached)
+
+        segment = unquote(child_path)
+
+        def notFound(f):
+            f.trap(http.HTTPError)

+        d.addErrback(notFound)
+        return d
 
+    def locateChildResource(self, parent, child_name):
+        """
+        Looks up the child resource with the given name given the parent
+        resource.  This is similar to locateResource(), but doesn't have to
+        start the lookup from the root resource, so it is potentially faster.
+        @param parent: the parent of the resource being looked up.
+        @param child_name: the name of the child of C{parent} to looked up.
+            to C{parent}.
+        @return: a L{Deferred} resulting in the L{IResource} at the
+            given URL or C{None} if no such resource can be located.
