func (s *Server) handle(origCtx context.Context, handler TChanServer, 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.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) if err := writer.Close(); err != nil { return err } return nil }