Squashed commit of the following:
commit
c5b9bb50ce47a73a4928b3d4d50c7d97bdee9546
Author: Maya Dagon <mdagon@cisco.com>
Date: Fri May 7 12:12:53 2021 -0400
http2_inspect: update state and delete streams after reaching flow
depth
}
}
-void Http2Stream::clear_frame()
+// check if stream is completed, do cleanup if it is
+void Http2Stream::check_and_cleanup_completed()
{
- assert(current_frame != nullptr);
- current_frame->clear();
- delete current_frame;
- current_frame = nullptr;
-
if ((state[SRC_CLIENT] >= STREAM_COMPLETE) && (state[SRC_SERVER] >= STREAM_COMPLETE))
{
if (hi_flow_data != nullptr)
}
}
+void Http2Stream::clear_frame()
+{
+ assert(current_frame != nullptr);
+ current_frame->clear();
+ delete current_frame;
+ current_frame = nullptr;
+
+ check_and_cleanup_completed();
+}
+
void Http2Stream::set_state(HttpCommon::SourceId source_id, StreamState new_state)
{
assert((STREAM_EXPECT_HEADERS <= new_state) && (new_state <= STREAM_ERROR));
uint32_t get_stream_id() const { return stream_id; }
void eval_frame(const uint8_t* header_buffer, uint32_t header_len, const uint8_t* data_buffer,
uint32_t data_len, HttpCommon::SourceId source_id);
+ void check_and_cleanup_completed();
void clear_frame();
const Field& get_buf(unsigned id);
HttpFlowData* get_hi_flow_data() const { return hi_flow_data; }
HttpCommon::SourceId source_id);
static bool read_frame_hdr(Http2FlowData* session_data, const uint8_t* data,
uint32_t length, HttpCommon::SourceId source_id, uint32_t& data_offset);
+ static void discarded_data_frame_cleanup(Http2FlowData* session_data, HttpCommon::SourceId source_id);
};
// but don't create pkt_data buffer
frame_buf.data = (const uint8_t*)"";
}
+ else
+ discarded_data_frame_cleanup(session_data, source_id);
}
return frame_buf;
}
+void Http2StreamSplitter::discarded_data_frame_cleanup(Http2FlowData* session_data, HttpCommon::SourceId source_id)
+{
+ Http2Stream* const stream = session_data->find_current_stream(source_id);
+
+ if (!stream || stream->get_state(source_id) == STREAM_ERROR)
+ return;
+
+ if (stream->is_end_stream_on_data_flush(source_id))
+ {
+ if (session_data->concurrent_files > 0)
+ session_data->concurrent_files -= 1;
+ stream->set_state(source_id, STREAM_COMPLETE);
+ stream->check_and_cleanup_completed();
+ if (session_data->delete_stream)
+ {
+ session_data->processing_stream_id = session_data->get_current_stream_id(source_id);
+ session_data->delete_processing_stream();
+ session_data->processing_stream_id = NO_STREAM_ID;
+ }
+ }
+}