func()

in pkg/accesslog/collector/protocols/http2.go [246:291]


func (r *HTTP2Protocol) HandleWholeStream(_ *PartitionConnection, stream *HTTP2Streaming) error {
	details := make([]events.SocketDetail, 0)
	var allInclude = true
	var idRange *buffer.DataIDRange
	details, idRange, allInclude = AppendSocketDetailsFromBuffer(details, stream.ReqHeaderBuffer, idRange, allInclude)
	details, idRange, allInclude = AppendSocketDetailsFromBuffer(details, stream.ReqBodyBuffer, idRange, allInclude)
	details, idRange, allInclude = AppendSocketDetailsFromBuffer(details, stream.RespHeaderBuffer, idRange, allInclude)
	details, idRange, allInclude = AppendSocketDetailsFromBuffer(details, stream.RespBodyBuffer, idRange, allInclude)

	if !allInclude {
		return fmt.Errorf("cannot found any detail events for HTTP/2 protocol, data id: %d-%d, current details count: %d",
			stream.ReqHeaderBuffer.FirstSocketBuffer().DataID(), stream.RespBodyBuffer.LastSocketBuffer().DataID(),
			len(details))
	}
	idRange.DeleteDetails(stream.ReqHeaderBuffer)

	streamHost := stream.ReqHeader[":authority"]
	if streamHost == "" {
		streamHost = stream.ReqHeader[":host"]
	}
	forwarder.SendTransferProtocolEvent(r.ctx, common.NewProtocolLogEvent(details, &v3.AccessLogProtocolLogs{
		Protocol: &v3.AccessLogProtocolLogs_Http{
			Http: &v3.AccessLogHTTPProtocol{
				StartTime: forwarder.BuildOffsetTimestamp(r.FirstDetail(stream.ReqBodyBuffer, details[0]).GetStartTime()),
				EndTime:   forwarder.BuildOffsetTimestamp(details[len(details)-1].GetEndTime()),
				Version:   v3.AccessLogHTTPProtocolVersion_HTTP2,
				Request: &v3.AccessLogHTTPProtocolRequest{
					Method:             r.ParseHTTPMethod(stream),
					Path:               stream.ReqHeader[":path"],
					SizeOfHeadersBytes: r.BufferSizeOfZero(stream.ReqHeaderBuffer),
					SizeOfBodyBytes:    r.BufferSizeOfZero(stream.ReqBodyBuffer),
					Host:               streamHost,
					Trace: AnalyzeTraceInfo(func(key string) string {
						return stream.ReqHeader[key]
					}, http2Log),
				},
				Response: &v3.AccessLogHTTPProtocolResponse{
					StatusCode:         int32(stream.Status),
					SizeOfHeadersBytes: r.BufferSizeOfZero(stream.RespHeaderBuffer),
					SizeOfBodyBytes:    r.BufferSizeOfZero(stream.RespBodyBuffer),
				},
			},
		},
	}))
	return nil
}