void AppIdHttpSession::set_field(HttpFieldIds id, const std::string* str,
AppidChangeBits& change_bits)
{
- delete meta_data[id];
- meta_data[id] = str;
- if (str)
+ if (str and !str->empty())
{
+ delete meta_data[id];
+ meta_data[id] = str;
set_http_change_bits(change_bits, id);
if (appidDebug->is_active())
print_field(id, str);
}
+ else if (str)
+ delete str;
}
void AppIdHttpSession::set_field(HttpFieldIds id, const uint8_t* str, int32_t len,
AppidChangeBits& change_bits)
{
- delete meta_data[id];
if (str and len)
{
+ delete meta_data[id];
meta_data[id] = new std::string((const char*)str, len);
set_http_change_bits(change_bits, id);
if (appidDebug->is_active())
print_field(id, meta_data[id]);
}
- else
- meta_data[id] = nullptr;
}
void AppIdHttpSession::print_field(HttpFieldIds id, const std::string* field)
if (get_service_app_id() == APP_ID_HTTP2)
{
if ((stream_index != 0) and (stream_index >= get_hsessions_size()))
+ {
service = client = payload = misc = referred = APP_ID_UNKNOWN;
+ return;
+ }
else if (AppIdHttpSession* hsession = get_hsession(stream_index))
{
service = get_service_app_id();
payload = hsession->payload.get_id();
misc = hsession->misc_app_id;
referred = hsession->referred_payload_app_id;
+ return;
}
}
- else
- {
- get_first_stream_app_ids(service, client, payload, misc);
- referred = get_referred_app_id();
- }
+
+ get_first_stream_app_ids(service, client, payload, misc);
+ referred = get_referred_app_id();
}
void AppIdSessionApi::get_app_id(AppId* service, AppId* client,
CHECK_EQUAL(change_bits.test(APPID_USERAGENT_BIT), true);
CHECK_EQUAL(change_bits.test(APPID_RESPONSE_BIT), true);
CHECK_EQUAL(change_bits.test(APPID_REFERER_BIT), true);
+
+ // verify empty fields do not override existing fields
+ mock_hsession->set_field(REQ_AGENT_FID, nullptr, change_bits);
+ field = mock_hsession->get_field(REQ_AGENT_FID);
+ STRCMP_EQUAL(field->c_str(), "agent");
+ mock_hsession->set_field(REQ_AGENT_FID, new std::string(""), change_bits);
+ field = mock_hsession->get_field(REQ_AGENT_FID);
+ STRCMP_EQUAL(field->c_str(), "agent");
+ mock_hsession->set_field(REQ_AGENT_FID, nullptr, 0, change_bits);
+ field = mock_hsession->get_field(REQ_AGENT_FID);
+ STRCMP_EQUAL(field->c_str(), "agent");
+ mock_hsession->set_field(REQ_AGENT_FID, (const uint8_t*)"", 0, change_bits);
+ field = mock_hsession->get_field(REQ_AGENT_FID);
+ STRCMP_EQUAL(field->c_str(), "agent");
}
TEST(appid_http_session, set_tun_dest)
CHECK_EQUAL(APP_ID_NONE, id);
}
+TEST(appid_session_api, get_app_id)
+{
+ SfIp ip;
+ AppIdSession asd(IpProtocol::TCP, &ip, 1492, dummy_appid_inspector, odpctxt);
+ AppidChangeBits change_bits;
+ asd.set_application_ids_service(APP_ID_HTTP2, change_bits);
+
+ AppId service, client, payload, misc, referred;
+ asd.get_api().get_app_id(service, client, payload, misc, referred, 0);
+
+ CHECK_EQUAL(service, APP_ID_HTTP2);
+ CHECK_EQUAL(client, APP_ID_NONE);
+ CHECK_EQUAL(payload, APP_ID_NONE);
+ CHECK_EQUAL(misc, APP_ID_NONE);
+ CHECK_EQUAL(referred, APP_ID_NONE);
+
+ service = client = payload = misc = referred = APPID_UT_ID;
+ asd.get_api().get_app_id(&service, &client, &payload, &misc, &referred, 0);
+
+ CHECK_EQUAL(service, APP_ID_HTTP2);
+ CHECK_EQUAL(client, APP_ID_NONE);
+ CHECK_EQUAL(payload, APP_ID_NONE);
+ CHECK_EQUAL(misc, APP_ID_NONE);
+ CHECK_EQUAL(referred, APP_ID_NONE);
+
+ delete &asd.get_api();
+}
+
TEST(appid_session_api, get_tls_host)
{
AppidChangeBits change_bits;