in internal/http/request.go [349:401]
func (r *Request) askExtraInfo(builder *flatbuffers.Builder,
infoType ei.Info, info flatbuffers.UOffsetT) ([]byte, error) {
ei.ReqStart(builder)
ei.ReqAddInfoType(builder, infoType)
ei.ReqAddInfo(builder, info)
eiRes := ei.ReqEnd(builder)
builder.Finish(eiRes)
c := r.conn
if len(r.extraInfoHeader) == 0 {
r.extraInfoHeader = make([]byte, util.HeaderLen)
}
header := r.extraInfoHeader
out := builder.FinishedBytes()
size := len(out)
binary.BigEndian.PutUint32(header, uint32(size))
header[0] = util.RPCExtraInfo
n, err := util.WriteBytes(c, header, len(header))
if err != nil {
util.WriteErr(n, err)
return nil, common.ErrConnClosed
}
n, err = util.WriteBytes(c, out, size)
if err != nil {
util.WriteErr(n, err)
return nil, common.ErrConnClosed
}
n, err = util.ReadBytes(c, header, util.HeaderLen)
if util.ReadErr(n, err, util.HeaderLen) {
return nil, common.ErrConnClosed
}
ty := header[0]
header[0] = 0
length := binary.BigEndian.Uint32(header)
log.Infof("receive rpc type: %d data length: %d", ty, length)
buf := make([]byte, length)
n, err = util.ReadBytes(c, buf, int(length))
if util.ReadErr(n, err, int(length)) {
return nil, common.ErrConnClosed
}
resp := ei.GetRootAsResp(buf, 0)
res := resp.ResultBytes()
return res, nil
}