func()

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
}