Пример #1
0
    def handle_rpc(self, req_env, start_response):
        initial_ctx = WsgiMethodContext(self.app, req_env,
                                        self.app.out_protocol.mime_type)

        # implementation hook
        self.event_manager.fire_event('wsgi_call', initial_ctx)
        initial_ctx.in_string, in_string_charset = reconstruct_wsgi_request(
            req_env)

        # note that in fanout mode, only the response from the last
        # call will be returned.
        for ctx in self.generate_contexts(initial_ctx, in_string_charset):
            if ctx.in_error:
                return self.handle_error(ctx, ctx.in_error, start_response)

            self.get_in_object(ctx)
            if ctx.in_error:
                logger.error(ctx.in_error)
                return self.handle_error(ctx, ctx.in_error, start_response)

            self.get_out_object(ctx)
            if ctx.out_error:
                return self.handle_error(ctx, ctx.out_error, start_response)

            if ctx.transport.resp_code is None:
                ctx.transport.resp_code = HTTP_200

            self.get_out_string(ctx)

            if ctx.descriptor and ctx.descriptor.mtom:
                # when there is more than one return type, the result is
                # encapsulated inside a list. when there's just one, the result
                # is returned in a non-encapsulated form. the apply_mtom always
                # expects the objects to be inside an iterable, hence the following
                # test.
                out_type_info = ctx.descriptor.out_message._type_info
                if len(out_type_info) == 1:
                    out_object = [out_object]

                ctx.transport.resp_headers, ctx.out_string = apply_mtom(
                    ctx.transport.resp_headers, ctx.out_string,
                    ctx.descriptor.out_message._type_info.values(), out_object)

        # implementation hook
        self.event_manager.fire_event('wsgi_return', ctx)

        # the client has not set a content-length, so we delete it as the input
        # is just an iterable.
        if ctx.transport.resp_headers['Content-Length'] is None:
            del ctx.transport.resp_headers['Content-Length']

        # initiate the response
        start_response(ctx.transport.resp_code,
                       ctx.transport.resp_headers.items())

        return ctx.out_string