~cjwatson/lazr.restful/caveats

« back to all changes in this revision

Viewing changes to src/lazr/restful/publisher.py

Tags: 0.19.10
Fixed bug 809863: WebServicePublicationMixin.getResouce() converts
ComponentLookupErrors to NotFound.

Show diffs side-by-side

added added

removed removed

Lines of Context:
36
36
from zope.schema.interfaces import IBytes
37
37
from zope.security.checker import ProxyFactory
38
38
 
39
 
from lazr.uri import URI
40
 
 
41
39
from lazr.restful import (
42
40
    CollectionResource,
43
41
    EntryField,
163
161
        supports the ICollection, or IEntry interface we wrap it into the
164
162
        appropriate resource.
165
163
        """
166
 
        if (ICollection.providedBy(ob) or
167
 
            queryMultiAdapter((ob, request), ICollection) is not None):
168
 
            # Object supports ICollection protocol.
169
 
            resource = CollectionResource(ob, request)
170
 
        elif (IEntry.providedBy(ob) or
171
 
              queryMultiAdapter((ob, request), IEntry) is not None):
172
 
            # Object supports IEntry protocol.
173
 
            resource = EntryResource(ob, request)
174
 
        elif (IEntryField.providedBy(ob) or
175
 
              queryAdapter(ob, IEntryField) is not None):
176
 
            # Object supports IEntryField protocol.
177
 
            resource = EntryFieldResource(ob, request)
178
 
        elif queryMultiAdapter((ob, request), IHTTPResource) is not None:
179
 
            # Object can be adapted to a resource.
180
 
            resource = queryMultiAdapter((ob, request), IHTTPResource)
181
 
        elif IHTTPResource.providedBy(ob):
182
 
            # A resource knows how to take care of itself.
183
 
            return ob
184
 
        else:
185
 
            # This object should not be published on the web service.
 
164
        try:
 
165
            if (ICollection.providedBy(ob) or
 
166
                queryMultiAdapter((ob, request), ICollection) is not None):
 
167
                # Object supports ICollection protocol.
 
168
                resource = CollectionResource(ob, request)
 
169
            elif (IEntry.providedBy(ob) or
 
170
                  queryMultiAdapter((ob, request), IEntry) is not None):
 
171
                # Object supports IEntry protocol.
 
172
                resource = EntryResource(ob, request)
 
173
            elif (IEntryField.providedBy(ob) or
 
174
                  queryAdapter(ob, IEntryField) is not None):
 
175
                # Object supports IEntryField protocol.
 
176
                resource = EntryFieldResource(ob, request)
 
177
            elif queryMultiAdapter((ob, request), IHTTPResource) is not None:
 
178
                # Object can be adapted to a resource.
 
179
                resource = queryMultiAdapter((ob, request), IHTTPResource)
 
180
            elif IHTTPResource.providedBy(ob):
 
181
                # A resource knows how to take care of itself.
 
182
                return ob
 
183
            else:
 
184
                # This object should not be published on the web service.
 
185
                raise NotFound(ob, '')
 
186
        except ComponentLookupError:
186
187
            raise NotFound(ob, '')
187
188
 
188
189
        # Wrap the resource in a security proxy.
211
212
            WebServicePublicationMixin, self).callObject(request, object)
212
213
        self._processNotifications(request)
213
214
        if request.response.getStatus() / 100 == 3:
214
 
            vhost = URI(request.getApplicationURL()).host
215
215
            if IWebBrowserInitiatedRequest.providedBy(request):
216
216
                # This request was (probably) sent by a web
217
217
                # browser. Because web browsers, content negotiation,
237
237
                    (scheme, netloc, path, query, fragment) = (
238
238
                        urlparse.urlsplit(location))
239
239
                    if query == '':
240
 
                       query = qs_append
 
240
                        query = qs_append
241
241
                    else:
242
 
                       query += '&' + qs_append
 
242
                        query += '&' + qs_append
243
243
                    uri = urlparse.urlunsplit(
244
244
                        (scheme, netloc, path, query, fragment))
245
245
                    request.response.setHeader("Location", str(uri))
278
278
    def _removeVirtualHostTraversals(self):
279
279
        """Remove the /[path_override] and /[version] traversal names."""
280
280
        names = list()
281
 
        start_stack = list(self.getTraversalStack())
282
281
        config = getUtility(IWebServiceConfiguration)
283
282
        if config.path_override is not None:
284
283
            api = self._popTraversal(config.path_override)