func()

in pkg/profiling/task/network/analyze/layer7/protocols/http1/reader/reader.go [111:150]


func (m *MessageOpt) TransformReadableContent(defaultEncoding string, maxSize int) (string, error) {
	contentType := m.Headers().Get("Content-Type")
	if contentType == "" {
		contentType = fmt.Sprintf("text/html; charset=%s", defaultEncoding)
	}
	isPlain := strings.HasPrefix(contentType, "text/") || contentType == "application/json"

	// header to string
	headerBuf, err := io.ReadAll(m.HeaderBuffer())
	if err != nil {
		return "", err
	}
	if maxSize > 0 && len(headerBuf) >= maxSize {
		return string(headerBuf[:maxSize]), nil
	}
	headerString := string(headerBuf)
	if !isPlain {
		return fmt.Sprintf("%s[not plain, current content type: %s]", headerString, contentType), nil
	}

	// body to string
	bodyLength := m.BodyBuffer().Len()
	if bodyLength == 0 {
		return headerString, nil
	}
	bodyReader, err := m.buildBodyReader(defaultEncoding)
	if err != nil {
		return "", err
	}

	bodyData, err := io.ReadAll(bodyReader)
	if err != nil && err != io.ErrUnexpectedEOF {
		return "", err
	}
	resultSize := len(bodyData)
	if maxSize > 0 && (resultSize+len(headerString)) > maxSize {
		resultSize = maxSize - len(headerString)
	}
	return fmt.Sprintf("%s%s", headerString, string(bodyData[0:resultSize])), nil
}