Пример #1
0
    def post(self):
        request = _to_request(self.request)

        if not self._validate(request):
            return

        answer = gen.Future()

        @fail_to(answer)
        def on_dispatch(future):
            if not future.exception():
                response = future.result()
                if response.headers:
                    hs = headers.to_http_headers(response.headers)
                    for k, v in hs.iteritems():
                        self.set_header(k, v)
                if response.body is not None:
                    self.write(response.body)
            else:
                self._handle_request_exception(future.exception(), request)

            answer.set_result(None)

        maybe_async(
            self._handler.handle, request
        ).add_done_callback(on_dispatch)

        return answer
Пример #2
0
    def __call__(self, tchan_request):
        request = _to_request(tchan_request)

        v = _Validator(request)
        try:
            v.validate()
        except BadRequestError as e:
            raise TChBadRequestError(
                'BadRequest: %s\n' % str(e)
            )

        answer = gen.Future()

        @fail_to(answer)
        def on_dispatch(future):
            if not future.exception():
                response = future.result()
                tchan_response = Response(
                    body=response.body,
                    headers=headers.encode(
                        request.encoding, response.headers),
                    transport=None,  # TODO transport?
                )
                answer.set_result(tchan_response)
                return

            _handle_request_exception(future.exception(), request)

        maybe_async(
            self.handler.handle, request
        ).add_done_callback(on_dispatch)

        return answer
Пример #3
0
    def handle(self, encoder, request):
        if request.encoding != encoder.name:
            raise ServerDecodingError(
                exception=EncodingMismatchError(
                    want=encoder.name,
                    got=request.encoding,
                ),
                encoding=encoder.name,
                service=request.service,
                procedure=request.procedure,
                caller=request.caller,
            )

        try:
            request = encoder.decode_request(request)
        except Exception as e:
            raise ServerDecodingError(
                exception=e,
                encoding=encoder.name,
                service=request.service,
                procedure=request.procedure,
                caller=request.caller,
            )

        answer = gen.Future()

        @fail_to(answer)
        def on_done(future):
            try:
                if future.exception():
                    response = encoder.encode_exc_info(future.exc_info())
                else:
                    response = encoder.encode_response(
                        request,
                        future.result(),
                    )
            except ServerEncodingError:
                raise
            except Exception as e:
                raise ProcedureFailedError(
                    service=request.service,
                    procedure=request.procedure,
                    exception=e,
                )
            answer.set_result(response)

        maybe_async(self.handler, request).add_done_callback(on_done)
        return answer