return implement_reassemble(session_data, total, offset, data, len, flags, source_id);
}
-// Eventually we will need to address unexpected connection closes
bool Http2StreamSplitter::finish(Flow* flow)
{
Profile profile(Http2Module::get_profile_stats());
}
else
{
- printf("Finish from flow data %" PRIu64 " direction %d\n", session_data->seq_num,
- source_id);
+ printf("HTTP/2 finish from flow data %" PRIu64 " direction %d\n",
+ session_data->seq_num, source_id);
fflush(stdout);
}
}
#endif
+ // Loop through all nonzero streams and call NHI finish()
bool need_reassemble = false;
+ for (const Http2FlowData::StreamInfo& stream_info : session_data->streams)
+ {
+ if ((stream_info.id == 0) ||
+ (stream_info.stream->get_state(source_id) == STATE_CLOSED) ||
+ (stream_info.stream->get_hi_flow_data() == nullptr) ||
+ (stream_info.stream->get_hi_flow_data()->get_type_expected(source_id)
+ != HttpEnums::SEC_BODY_H2))
+ {
+ continue;
+ }
- // Loop through all streams and call NHI finish()
+ session_data->stream_in_hi = stream_info.id;
+ if (session_data->hi_ss[source_id]->finish(flow))
+ {
+ assert(stream_info.id == session_data->current_stream[source_id]);
+ need_reassemble = true;
+#ifdef REG_TEST
+ if (HttpTestManager::use_test_input(HttpTestManager::IN_HTTP2))
+ HttpTestManager::get_test_input_source()->flush(0);
+#endif
+ }
+ session_data->stream_in_hi = NO_STREAM_ID;
+
+ }
return need_reassemble;
}
// up to process because it is about to go to reassemble(). But we don't support partial start
// lines.
if ((session_data->section_type[source_id] == SEC__NOT_COMPUTE) &&
- (session_data->cutter[source_id] != nullptr) &&
- (session_data->cutter[source_id]->get_octets_seen() > 0))
+ (session_data->cutter[source_id] != nullptr) &&
+ (session_data->cutter[source_id]->get_octets_seen() >
+ session_data->partial_raw_bytes[source_id]))
{
if ((session_data->type_expected[source_id] == SEC_REQUEST) ||
(session_data->type_expected[source_id] == SEC_STATUS))
if ((session_data->section_type[source_id] == SEC__NOT_COMPUTE) &&
(session_data->file_depth_remaining[source_id] > 0) &&
(session_data->cutter[source_id] != nullptr) &&
- (session_data->cutter[source_id]->get_octets_seen() == 0))
+ (session_data->cutter[source_id]->get_octets_seen() ==
+ session_data->partial_raw_bytes[source_id]))
{
Packet* packet = DetectionEngine::get_current_packet();
if (!session_data->mime_state[source_id])
http2 ? HttpTestManager::IN_HTTP2 : HttpTestManager::IN_HTTP;
if (HttpTestManager::use_test_output(type))
{
- fprintf(HttpTestManager::get_output_file(), "scan() returning status %d\n", ret_val);
+ fprintf(HttpTestManager::get_output_file(), "%sscan() returning status %d\n",
+ http2 ? "HTTP/2 ": "", ret_val);
fflush(HttpTestManager::get_output_file());
}
if (HttpTestManager::use_test_input(type))