#endif
HttpFlowData::HttpFlowData(Flow* flow, const HttpParaList* params_) :
- FlowData(inspector_id), params(params_), flow(flow)
+ FlowData(inspector_id), params(params_)
{
- static HttpFlowStreamIntf h1_stream;
#ifdef REG_TEST
if (HttpTestManager::use_test_output(HttpTestManager::IN_HTTP))
{
HttpModule::increment_peg_counts(PEG_MAX_CONCURRENT_SESSIONS);
if (flow->stream_intf)
- flow->stream_intf->get_stream_id(flow, hx_stream_id);
-
- if (valid_hx_stream_id())
{
- for_httpx = true;
- events[0]->suppress_event(HttpEnums::EVENT_LOSS_OF_SYNC);
- events[1]->suppress_event(HttpEnums::EVENT_LOSS_OF_SYNC);
+ flow->stream_intf->get_stream_id(flow, hx_stream_id);
+ if (hx_stream_id >= 0)
+ {
+ for_httpx = true;
+ events[0]->suppress_event(HttpEnums::EVENT_LOSS_OF_SYNC);
+ events[1]->suppress_event(HttpEnums::EVENT_LOSS_OF_SYNC);
+ }
}
- else
- flow->stream_intf = &h1_stream;
}
HttpFlowData::~HttpFlowData()
discard_list = discard_list->next;
delete tmp;
}
-
- if (!for_httpx)
- flow->stream_intf = nullptr;
}
void HttpFlowData::half_reset(SourceId source_id)
return hx_stream_id;
}
-bool HttpFlowData::valid_hx_stream_id() const
-{
- return (hx_stream_id >= 0);
-}
-
-FlowData* HttpFlowStreamIntf::get_stream_flow_data(const Flow* flow)
-{
- return (HttpFlowData*)flow->get_flow_data(HttpFlowData::inspector_id);
-}
-
-void HttpFlowStreamIntf::set_stream_flow_data(Flow* flow, FlowData* flow_data)
-{
- flow->set_flow_data(flow_data);
-}
-
-void HttpFlowStreamIntf::get_stream_id(const Flow*, int64_t& stream_id)
-{
- // HTTP Flows by itself doesn't have any stream id, thus assigning -1 to
- // indicate invalid value
- stream_id = -1;
-}
-
-
#ifdef REG_TEST
void HttpFlowData::show(FILE* out_file) const
{
void set_hx_body_state(HttpCommon::SourceId source_id, HttpCommon::HXBodyState state)
{ hx_body_state[source_id] = state; }
- bool valid_hx_stream_id() const;
int64_t get_hx_stream_id() const;
bool is_for_httpx() const { return for_httpx; }
int64_t hx_stream_id = -1;
HttpCommon::HXBodyState hx_body_state[2] = { HttpCommon::HX_BODY_NOT_COMPLETE,
HttpCommon::HX_BODY_NOT_COMPLETE };
- snort::Flow* flow;
#ifdef REG_TEST
static uint64_t instance_count;
#endif
};
-class HttpFlowStreamIntf : public snort::StreamFlowIntf
-{
-public:
- snort::FlowData* get_stream_flow_data(const snort::Flow* flow) override;
- void set_stream_flow_data(snort::Flow* flow, snort::FlowData* flow_data) override;
- void get_stream_id(const snort::Flow* flow, int64_t& stream_id) override;
-};
-
#endif
if (flow->stream_intf)
return (HttpFlowData*)flow->stream_intf->get_stream_flow_data(flow);
else
- return nullptr;
+ return (HttpFlowData*)flow->get_flow_data(HttpFlowData::inspector_id);
}
void HttpInspect::http_set_flow_data(Flow* flow, HttpFlowData* flow_data)
{
- flow->stream_intf->set_stream_flow_data(flow, flow_data);
+ if (flow->stream_intf)
+ flow->stream_intf->set_stream_flow_data(flow, flow_data);
+ else
+ flow->set_flow_data(flow_data);
}
void HttpInspect::eval(Packet* p)
class HttpApi;
class HttpParam;
+class HttpIpsOption;
class HttpInspect : public HttpInspectBase
{
private:
friend HttpApi;
friend HttpStreamSplitter;
+ friend HttpIpsOption;
HttpStreamSplitter splitter[2] = { { true, this }, { false, this } };
// This is the session state information we share with HttpInspect and store with stream. A
// session is defined by a TCP connection. Since scan() is the first to see a new TCP
// connection the new flow data object is created here.
- HttpFlowData* session_data = nullptr;
- if (flow->stream_intf)
- session_data = (HttpFlowData*)flow->stream_intf->get_stream_flow_data(flow);
+ HttpFlowData* session_data = HttpInspect::http_get_flow_data(flow);
if (session_data == nullptr)
{
if (!p->flow || !p->flow->gadget || (HttpInspect::get_latest_is(p) == PS_NONE))
return nullptr;
- assert(p->flow->stream_intf);
- const HttpFlowData* const hi_flow_data =
- (HttpFlowData*)p->flow->stream_intf->get_stream_flow_data(p->flow);
+ const HttpFlowData* const hi_flow_data = HttpInspect::http_get_flow_data(p->flow);
const HttpInspect* const hi = (hi_flow_data->is_for_httpx()) ?
(HttpInspect*)(p->flow->assistant_gadget) : (HttpInspect*)(p->flow->gadget);