in internal/http/response.go [210:274]
func (r *Response) FetchChanges(builder *flatbuffers.Builder) bool {
if !r.HasChange() {
return false
}
var hdrVec 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.RespStartHeadersVector(builder, size)
for i := size - 1; i >= 0; i-- {
te := hdrs[i]
builder.PrependUOffsetT(te)
}
hdrVec = builder.EndVector(size)
}
var bodyVec flatbuffers.UOffsetT
if r.body != nil {
b := r.body.Bytes()
if len(b) > 0 {
bodyVec = builder.CreateByteVector(b)
}
}
hrc.RespStart(builder)
if r.statusCode != 0 {
hrc.RespAddStatus(builder, uint16(r.statusCode))
}
if hdrVec > 0 {
hrc.RespAddHeaders(builder, hdrVec)
}
if bodyVec > 0 {
hrc.RespAddBody(builder, bodyVec)
}
hrc.RespAddId(builder, r.r.Id())
res := hrc.RespEnd(builder)
builder.Finish(res)
return true
}