in internal/http/request.go [207:336]
func (r *Request) FetchChanges(id uint32, builder *flatbuffers.Builder) bool {
if r.path == nil && r.hdr == nil && r.args == nil && r.respHdr == nil {
return false
}
var path flatbuffers.UOffsetT
if r.path != nil {
path = builder.CreateByteString(r.path)
}
var hdrVec, respHdrVec flatbuffers.UOffsetT
if r.hdr != nil {
hdrs := []flatbuffers.UOffsetT{}
oldHdr := r.rawHdr
newHdr := r.hdr.View()
for n := range oldHdr {
if _, ok := newHdr[n]; !ok {
// deleted
name := builder.CreateString(n)
A6.TextEntryStart(builder)
A6.TextEntryAddName(builder, name)
te := A6.TextEntryEnd(builder)
hdrs = append(hdrs, te)
}
}
for n, v := range newHdr {
if raw, ok := oldHdr[n]; !ok || raw[0] != v[0] {
// set
name := builder.CreateString(n)
value := builder.CreateString(v[0])
A6.TextEntryStart(builder)
A6.TextEntryAddName(builder, name)
A6.TextEntryAddValue(builder, value)
te := A6.TextEntryEnd(builder)
hdrs = append(hdrs, te)
}
}
size := len(hdrs)
hrc.RewriteStartHeadersVector(builder, size)
for i := size - 1; i >= 0; i-- {
te := hdrs[i]
builder.PrependUOffsetT(te)
}
hdrVec = builder.EndVector(size)
}
if r.respHdr != nil {
respHdrs := []flatbuffers.UOffsetT{}
for n, arr := range r.respHdr {
for _, v := range arr {
name := builder.CreateString(n)
value := builder.CreateString(v)
A6.TextEntryStart(builder)
A6.TextEntryAddName(builder, name)
A6.TextEntryAddValue(builder, value)
te := A6.TextEntryEnd(builder)
respHdrs = append(respHdrs, te)
}
}
size := len(respHdrs)
hrc.RewriteStartRespHeadersVector(builder, size)
for i := size - 1; i >= 0; i-- {
te := respHdrs[i]
builder.PrependUOffsetT(te)
}
respHdrVec = builder.EndVector(size)
}
var argsVec flatbuffers.UOffsetT
if r.args != nil {
args := []flatbuffers.UOffsetT{}
oldArgs := r.rawArgs
newArgs := r.args
for n := range oldArgs {
if _, ok := newArgs[n]; !ok {
// deleted
name := builder.CreateString(n)
A6.TextEntryStart(builder)
A6.TextEntryAddName(builder, name)
te := A6.TextEntryEnd(builder)
args = append(args, te)
}
}
for n, v := range newArgs {
if raw, ok := oldArgs[n]; !ok || !reflect.DeepEqual(raw, v) {
// set / add
for _, vv := range v {
name := builder.CreateString(n)
value := builder.CreateString(vv)
A6.TextEntryStart(builder)
A6.TextEntryAddName(builder, name)
A6.TextEntryAddValue(builder, value)
te := A6.TextEntryEnd(builder)
args = append(args, te)
}
}
}
size := len(args)
hrc.RewriteStartArgsVector(builder, size)
for i := size - 1; i >= 0; i-- {
te := args[i]
builder.PrependUOffsetT(te)
}
argsVec = builder.EndVector(size)
}
hrc.RewriteStart(builder)
if path > 0 {
hrc.RewriteAddPath(builder, path)
}
if hdrVec > 0 {
hrc.RewriteAddHeaders(builder, hdrVec)
}
if respHdrVec > 0 {
hrc.RewriteAddRespHeaders(builder, respHdrVec)
}
if argsVec > 0 {
hrc.RewriteAddArgs(builder, argsVec)
}
rewrite := hrc.RewriteEnd(builder)
hrc.RespStart(builder)
hrc.RespAddId(builder, id)
hrc.RespAddActionType(builder, hrc.ActionRewrite)
hrc.RespAddAction(builder, rewrite)
res := hrc.RespEnd(builder)
builder.Finish(res)
return true
}