in forward/request_sender.go [160:216]
func (s *requestSender) MakeCall(ctx context.Context, res *[]byte, fwdError *error, appError *error) <-chan bool {
done := make(chan bool, 1)
go func() {
defer close(done)
peer := s.channel.Peers().GetOrAdd(s.destination)
call, err := peer.BeginCall(ctx, s.service, s.endpoint, &tchannel.CallOptions{
Format: s.format,
})
if err != nil {
*fwdError = err
done <- true
return
}
var arg3 []byte
headers := s.headers
if s.format == tchannel.Thrift {
if headers == nil {
headers = []byte{0, 0}
}
_, arg3, _, err = raw.WriteArgs(call, headers, s.request)
} else {
var resp *tchannel.OutboundCallResponse
_, arg3, resp, err = raw.WriteArgs(call, headers, s.request)
// check if the response is an application level error
if err == nil && resp.ApplicationError() {
// parse the json from the application level error
errResp := struct {
Type string `json:"type"`
Message string `json:"message"`
}{}
err = json.Unmarshal(arg3, &errResp)
// if parsing succeeded return the error as an application error
if err == nil {
*appError = errors.New(errResp.Message)
done <- true
return
}
}
}
if err != nil {
*fwdError = err
done <- true
return
}
*res = arg3
done <- true
}()
return done
}