in pkg/profiling/task/network/analyze/layer7/protocols/http1/reader/reader.go [206:243]
func (m *MessageOpt) checkChunkedBody(buf *buffer.Buffer, bodyReader *bufio.Reader) (*buffer.Buffer, enums.ParseResult, error) {
buffers := make([]*buffer.Buffer, 0)
for {
line, _, err := bodyReader.ReadLine()
if err != nil {
return nil, enums.ParseResultSkipPackage, err
}
needBytesStr := string(line)
needBytes, err := strconv.ParseInt(needBytesStr, 16, 64)
if err != nil {
return nil, enums.ParseResultSkipPackage, fmt.Errorf("read chunked size error: %s", needBytesStr)
}
if needBytes == 0 {
break
}
if b, r, err1 := m.checkBodyWithSize(buf, bodyReader, int(needBytes), false); err1 != nil {
return nil, enums.ParseResultSkipPackage, err1
} else if r != enums.ParseResultSuccess {
return nil, r, nil
} else {
if pos := b.DetectNotSendingLastPosition(); pos != nil {
log.Debugf("found the socket data not sending finished in BPF, so update the body to the latest data, %v", pos)
successSlice := b.Slice(true, b.Position(), pos)
buffers = append(buffers, successSlice)
break
}
buffers = append(buffers, b)
}
d, _, err := bodyReader.ReadLine()
if err != nil {
return nil, enums.ParseResultSkipPackage, err
}
if len(d) != 0 {
return nil, enums.ParseResultSkipPackage, fmt.Errorf("the chunk data parding error, should be empty: %s", d)
}
}
return buffer.CombineSlices(true, buffers...), enums.ParseResultSuccess, nil
}