in pkg/accesslog/collector/protocols/http1.go [213:270]
func (p *HTTP1Protocol) HandleHTTPData(metrics *HTTP1Metrics, connection *PartitionConnection,
request *reader.Request, response *reader.Response) error {
details := make([]events.SocketDetail, 0)
var allInclude = true
var idRange *buffer.DataIDRange
details, idRange, allInclude = AppendSocketDetailsFromBuffer(details, request.HeaderBuffer(), idRange, allInclude)
details, idRange, allInclude = AppendSocketDetailsFromBuffer(details, request.BodyBuffer(), idRange, allInclude)
details, idRange, allInclude = AppendSocketDetailsFromBuffer(details, response.HeaderBuffer(), idRange, allInclude)
details, idRange, allInclude = AppendSocketDetailsFromBuffer(details, response.BodyBuffer(), idRange, allInclude)
if !allInclude {
return fmt.Errorf("cannot found full detail events for HTTP/1.x protocol, "+
"data id: %d-%d, current details count: %d",
idRange.From, idRange.To, len(details))
}
http1Log.Debugf("found fully HTTP1 request and response, contains %d detail events, "+
"connection ID: %d, random ID: %d, data range: %d-%d(%t)",
len(details), metrics.ConnectionID, metrics.RandomID, idRange.From, idRange.To, idRange.IsToBufferReadFinished)
originalRequest := request.Original()
originalResponse := response.Original()
// delete details(each request or response is fine because it's will delete the original buffer)
idRange.DeleteDetails(request.HeaderBuffer())
defer func() {
p.CloseStream(originalRequest.Body)
p.CloseStream(originalResponse.Body)
}()
host := request.Headers().Get("Host")
if host == "" && originalRequest.URL != nil {
host = originalRequest.URL.Host
}
forwarder.SendTransferProtocolEvent(p.ctx, common.NewProtocolLogEvent(details, &v3.AccessLogProtocolLogs{
Protocol: &v3.AccessLogProtocolLogs_Http{
Http: &v3.AccessLogHTTPProtocol{
StartTime: forwarder.BuildOffsetTimestamp(details[0].GetStartTime()),
EndTime: forwarder.BuildOffsetTimestamp(details[len(details)-1].GetEndTime()),
Version: v3.AccessLogHTTPProtocolVersion_HTTP1,
Request: &v3.AccessLogHTTPProtocolRequest{
Method: TransformHTTPMethod(originalRequest.Method),
Path: originalRequest.URL.Path,
SizeOfHeadersBytes: uint64(request.HeaderBuffer().DataSize()),
SizeOfBodyBytes: uint64(request.BodyBuffer().DataSize()),
Trace: AnalyzeTraceInfo(func(key string) string {
return originalRequest.Header.Get(key)
}, http1Log),
Host: host,
},
Response: &v3.AccessLogHTTPProtocolResponse{
StatusCode: int32(originalResponse.StatusCode),
SizeOfHeadersBytes: uint64(response.HeaderBuffer().DataSize()),
SizeOfBodyBytes: uint64(response.BodyBuffer().DataSize()),
},
},
},
}))
return nil
}