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
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
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