void HttpMsgHeader::publish()
{
- uint32_t stream_id = 0;
- if (session_data->for_http2)
- {
- Http2FlowData* h2i_flow_data = (Http2FlowData*)flow->get_flow_data(Http2FlowData::inspector_id);
- assert(h2i_flow_data);
- stream_id = h2i_flow_data->get_current_stream_id(source_id);
- }
+ const uint32_t stream_id = get_h2_stream_id(source_id);
HttpEvent http_event(this, session_data->for_http2, stream_id);
void HttpMsgHeader::setup_file_processing()
{
// Generate the unique file id for file processing
- transaction->set_file_processing_id(source_id, get_transaction_id());
+ transaction->set_file_processing_id(source_id, get_transaction_id(),
+ get_h2_stream_id(source_id));
if ((session_data->file_depth_remaining[source_id] = FileService::get_max_file_depth()) < 0)
{
trailer[SRC_SERVER] = transaction->get_trailer(SRC_SERVER);
}
+uint32_t HttpMsgSection::get_h2_stream_id(HttpCommon::SourceId source_id)
+{
+ if (h2_stream_id != STAT_NOT_COMPUTE)
+ return h2_stream_id;
+ if (session_data->for_http2)
+ {
+ Http2FlowData* h2i_flow_data = (Http2FlowData*)flow->get_flow_data(Http2FlowData::inspector_id);
+ assert(h2i_flow_data);
+ h2_stream_id = h2i_flow_data->get_current_stream_id(source_id);
+ }
+ else
+ h2_stream_id = 0;
+ return h2_stream_id;
+}
+
void HttpMsgSection::clear()
{
transaction->clear_section();
HttpEnums::MethodId method_id;
const bool tcp_close;
+ int64_t h2_stream_id = HttpCommon::STAT_NOT_COMPUTE;
+ uint32_t get_h2_stream_id(HttpCommon::SourceId source_id);
+
// Pointers to related message sections in the same transaction
HttpMsgRequest* request;
HttpMsgStatus* status;
}
void HttpTransaction::set_file_processing_id(const SourceId source_id,
- const uint64_t transaction_id)
+ const uint64_t transaction_id, const uint32_t stream_id)
{
- const int data_len = sizeof(source_id) + sizeof(transaction_id);
+ const int data_len = sizeof(source_id) + sizeof(transaction_id) + sizeof(stream_id);
uint8_t data[data_len];
memcpy(data, (void*)&source_id, sizeof(source_id));
uint32_t offset = sizeof(source_id);
memcpy(data + offset, (void*)&transaction_id, sizeof(transaction_id));
+ offset += sizeof(transaction_id);
+ memcpy(data + offset, (void*)&stream_id, sizeof(stream_id));
file_processing_id[source_id] = str_to_hash(data, data_len);
}
HttpTransaction* next = nullptr;
- // Each file processed has a unique id per flow: hash(source_id, transaction_id)
+ // Each file processed has a unique id per flow: hash(source_id, transaction_id, h2_stream_id)
+ // If this is an HTTP/1 flow, h2_stream_id is 0
void set_file_processing_id(const HttpCommon::SourceId source_id,
- const uint64_t transaction_id);
+ const uint64_t transaction_id, const uint32_t stream_id);
uint64_t get_file_processing_id(HttpCommon::SourceId source_id)
{ return file_processing_id[source_id]; }