From d7db3e433d03b2a171bc70ee9d6e65b3354010c2 Mon Sep 17 00:00:00 2001 From: Donat Zenichev Date: Tue, 4 Apr 2023 11:46:28 +0200 Subject: [PATCH] MT#56321 HeaderFilter: add multi-line headers parsing We have to add multi-line headers parsing support, to be able to properly detect and apply filters to such headers. Since the SEMS prefers to work with single line values, multi-line values are getting converted into signle line, like that: Accept: application/sdp, application/isup, multipart/mixed gets converted into: Accept: application/sdp, application/isup, multipart/mixed Additionally: Support of spaces detection in hf names has been added. We do not consider spaces as part of the hf name, if they are added. Original ticket number: 56354 Change-Id: I6adda8218ee6b88035fa9297187187d868f4eb60 --- apps/sbc/HeaderFilter.cpp | 83 ++++++++++++++++++++++++++++++++++----- 1 file changed, 73 insertions(+), 10 deletions(-) diff --git a/apps/sbc/HeaderFilter.cpp b/apps/sbc/HeaderFilter.cpp index 44803352..cef440d3 100644 --- a/apps/sbc/HeaderFilter.cpp +++ b/apps/sbc/HeaderFilter.cpp @@ -90,7 +90,7 @@ bool readFilter(AmConfigReader& cfg, const char* cfg_key_filter, const char* cfg return true; } -int skip_header(const std::string& hdr, size_t start_pos, +int skip_header(std::string& hdr, size_t start_pos, size_t& name_end, size_t& val_begin, size_t& val_end, size_t& hdr_end) { /* adapted from sip/parse_header.cpp */ @@ -111,8 +111,11 @@ int skip_header(const std::string& hdr, size_t start_pos, int st = H_NAME; int saved_st = 0; + /* iterate till actual name, if space(s)/tab(s) in front of hf name */ + bool iteration_till_name = true; + size_t p = start_pos; - for (; p& filter_list) { /* todo: multi-line header support */ size_t start_pos = 0; - while (start_pos& filter_list) { return res; } - string hdr_name = hdrs.substr(start_pos, name_end-start_pos); + string hdr_name = hdrs.substr(start_pos, name_end - start_pos); std::transform(hdr_name.begin(), hdr_name.end(), hdr_name.begin(), ::tolower); bool erase = (f_type == Whitelist); + string hdr_value = hdrs.substr(val_begin, val_end - val_begin); + + DBG("hdr name parsed: '%s'\n", hdr_name.c_str()); + DBG("hdr value parsed: '%s'\n", hdr_value.c_str()); + for (set::iterator it = headerfilter_list.begin(); it != headerfilter_list.end(); ++it) { @@ -237,9 +299,10 @@ int inplaceHeaderFilter(string& hdrs, const vector& filter_list) { } if (erase) { - DBG("erasing header '%s' by %s\n", hdr_name.c_str(), FilterType2String(f_type)); + DBG("erasing header '%s' by filter '%s'\n", hdr_name.c_str(), FilterType2String(f_type)); hdrs.erase(start_pos, hdr_end-start_pos); } else { + DBG("header accepted '%s' by filter '%s'\n", hdr_name.c_str(), FilterType2String(f_type)); start_pos = hdr_end; } }