Exemple #1
0
 def test_render(self):
     """
     Test that the result from Data.render is acceptable, including the
     response code, the content-type header, and the actual response body
     itself.
     """
     response = iweb.IResponse(self.data.render(None))
     self.assertEqual(response.code, 200)
     self.assert_(response.headers.hasHeader("content-type"))
     self.assertEqual(response.headers.getHeader("content-type"),
                      http_headers.MimeType("text", "plain"))
     def checkStream(data):
         self.assertEquals(str(data), self.text)
     return stream.readStream(iweb.IResponse(self.data.render(None)).stream,
                              checkStream)
Exemple #2
0
    def _cbFinishRender(self, result):
        def filterit(response, f):
            if (hasattr(f, 'handleErrors')
                    or (response.code >= 200 and response.code < 300)):
                return f(self, response)
            else:
                return response

        response = iweb.IResponse(result, None)
        if response:
            d = defer.Deferred()
            for f in self.responseFilters:
                d.addCallback(filterit, f)
            d.addCallback(self.writeResponse)
            d.callback(response)
            return d

        resource = iweb.IResource(result, None)
        if resource:
            self.resources.append(resource)
            d = defer.maybeDeferred(resource.renderHTTP, self)
            d.addCallback(self._cbFinishRender)
            return d

        raise TypeError("html is not a resource or a response")
Exemple #3
0
    def __init__(self, codeOrResponse):
        """An Exception for propagating HTTP Error Responses.

        @param codeOrResponse: The numeric HTTP code or a complete http.Response
            object.
        @type codeOrResponse: C{int} or L{http.Response}
        """
        self.response = iweb.IResponse(codeOrResponse)
        Exception.__init__(self, str(self.response))
Exemple #4
0
class StaticRenderMixin(resource.RenderMixin, MetaDataMixin):
    @inlineCallbacks
    def checkPreconditions(self, request):
        # This code replaces the code in resource.RenderMixin
        if request.method not in ("GET", "HEAD"):
            etag = (yield self.etag())
            http.checkPreconditions(
                request,
                entityExists=self.exists(),
                etag=etag,
                lastModified=self.lastModified(),
            )

        # Check per-method preconditions
        method = getattr(self, "preconditions_" + request.method, None)
        if method:
            returnValue((yield method(request)))

    @inlineCallbacks
    def renderHTTP(self, request):
        """
        See L{resource.RenderMixIn.renderHTTP}.

        This implementation automatically sets some headers on the response
        based on data available from L{MetaDataMixin} methods.
        """
        try:
            response = yield super(StaticRenderMixin, self).renderHTTP(request)
        except HTTPError, he:
            response = he.response

        response = iweb.IResponse(response)
        # Don't provide additional resource information to error responses
        if response.code < 400:
            # Content-* headers refer to the response content, not
            # (necessarily) to the resource content, so they depend on the
            # request method, and therefore can't be set here.
            etag = (yield self.etag())
            for (header, value) in (
                ("etag", etag),
                ("last-modified", self.lastModified()),
            ):
                if value is not None:
                    response.headers.setHeader(header, value)
        returnValue(response)