// Handle handles an incoming TChannel call and forwards it to the correct handler. func (s *Server) Handle(ctx context.Context, call *tchannel.InboundCall) { op := call.MethodString() service, method, ok := getServiceMethod(op) if !ok { log.Fatalf("Handle got call for %s which does not match the expected call format", op) } s.RLock() handler, ok := s.handlers[service] s.RUnlock() if !ok { log.Fatalf("Handle got call for service %v which is not registered", service) } if err := s.handle(ctx, handler, method, call); err != nil { s.onError(err) } }
// Handle handles an incoming TChannel call and forwards it to the correct handler. func (s *Server) Handle(ctx context.Context, call *tchannel.InboundCall) { parts := strings.Split(string(call.Operation()), "::") if len(parts) != 2 { log.Fatalf("Handle got call for %v which does not match the expected call format", parts) } service, method := parts[0], parts[1] s.mut.RLock() handler, ok := s.handlers[service] s.mut.RUnlock() if !ok { log.Fatalf("Handle got call for service %v which is not registered", service) } if err := s.handle(ctx, handler, method, call); err != nil { s.onError(err) } }
func (s *Server) handle(origCtx context.Context, handler handler, method string, call *tchannel.InboundCall) error { reader, err := call.Arg2Reader() if err != nil { return err } headers, err := readHeaders(reader) if err != nil { return err } if err := reader.Close(); err != nil { return err } reader, err = call.Arg3Reader() if err != nil { return err } ctx := WithHeaders(origCtx, headers) protocol := thrift.NewTBinaryProtocolTransport(&readWriterTransport{Reader: reader}) success, resp, err := handler.server.Handle(ctx, method, protocol) if err != nil { reader.Close() call.Response().SendSystemError(err) return nil } if err := reader.Close(); err != nil { return err } if !success { call.Response().SetApplicationError() } writer, err := call.Response().Arg2Writer() if err != nil { return err } if err := writeHeaders(writer, ctx.ResponseHeaders()); err != nil { return err } if err := writer.Close(); err != nil { return err } writer, err = call.Response().Arg3Writer() protocol = thrift.NewTBinaryProtocolTransport(&readWriterTransport{Writer: writer}) resp.Write(protocol) err = writer.Close() if handler.postResponseCB != nil { handler.postResponseCB(method, resp) } return err }
func (s *Server) handle(origCtx context.Context, handler handler, method string, call *tchannel.InboundCall) error { reader, err := call.Arg2Reader() if err != nil { return err } headers, err := ReadHeaders(reader) if err != nil { return err } if err := reader.Close(); err != nil { return err } reader, err = call.Arg3Reader() if err != nil { return err } tracer := tchannel.TracerFromRegistrar(s.ch) origCtx = tchannel.ExtractInboundSpan(origCtx, call, headers, tracer) ctx := s.ctxFn(origCtx, method, headers) wp := getProtocolReader(reader) success, resp, err := handler.server.Handle(ctx, method, wp.protocol) thriftProtocolPool.Put(wp) if err != nil { if _, ok := err.(thrift.TProtocolException); ok { // We failed to parse the Thrift generated code, so convert the error to bad request. err = tchannel.NewSystemError(tchannel.ErrCodeBadRequest, err.Error()) } reader.Close() call.Response().SendSystemError(err) return nil } if err := reader.Close(); err != nil { return err } if !success { call.Response().SetApplicationError() } writer, err := call.Response().Arg2Writer() if err != nil { return err } if err := WriteHeaders(writer, ctx.ResponseHeaders()); err != nil { return err } if err := writer.Close(); err != nil { return err } writer, err = call.Response().Arg3Writer() wp = getProtocolWriter(writer) resp.Write(wp.protocol) thriftProtocolPool.Put(wp) err = writer.Close() if handler.postResponseCB != nil { handler.postResponseCB(ctx, method, resp) } return err }