int inplaceHeaderFilter(string& hdrs, const set<string>& headerfilter_list, FilterType f_type) { if (!hdrs.length() || !isActiveFilter(f_type)) return 0; int res = 0; size_t start_pos = 0; while (start_pos<hdrs.length()) { size_t name_end, val_begin, val_end, hdr_end; if ((res = skip_header(hdrs, start_pos, name_end, val_begin, val_end, hdr_end)) != 0) { return res; } string hdr_name = hdrs.substr(start_pos, name_end-start_pos); transform(hdr_name.begin(), hdr_name.end(), hdr_name.begin(), ::tolower); bool erase = false; if (f_type == Whitelist) { erase = headerfilter_list.find(hdr_name)==headerfilter_list.end(); } else if (f_type == Blacklist) { erase = headerfilter_list.find(hdr_name)!=headerfilter_list.end(); } if (erase) { DBG("erasing header '%s'\n", hdr_name.c_str()); hdrs.erase(start_pos, hdr_end-start_pos); } else { start_pos = hdr_end; } } // todo: multi-line header support return res; }
int inplaceHeaderFilter(string& hdrs, const vector<FilterEntry>& filter_list) { if (!hdrs.length() || ! filter_list.size()) return 0; DBG("applying %zd header filters\n", filter_list.size()); for (vector<FilterEntry>::const_iterator fe = filter_list.begin(); fe != filter_list.end(); fe++) { const set<string>& headerfilter_list = fe->filter_list; const FilterType& f_type = fe->filter_type; if (!isActiveFilter(f_type)) continue; // todo: multi-line header support size_t start_pos = 0; while (start_pos<hdrs.length()) { size_t name_end, val_begin, val_end, hdr_end; int res; if ((res = skip_header(hdrs, start_pos, name_end, val_begin, val_end, hdr_end)) != 0) { return res; } 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 = false; if (f_type == Whitelist) { erase = headerfilter_list.find(hdr_name)==headerfilter_list.end(); } else if (f_type == Blacklist) { erase = headerfilter_list.find(hdr_name)!=headerfilter_list.end(); } if (erase) { DBG("erasing header '%s' by %s\n", hdr_name.c_str(), FilterType2String(f_type)); hdrs.erase(start_pos, hdr_end-start_pos); } else { start_pos = hdr_end; } } } return 0; }
int filterSDPalines(AmSdp& sdp, FilterType sdpalinesfilter, const std::set<string>& sdpalinesfilter_list) { // If not Black- or Whitelist, simply return if (!isActiveFilter(sdpalinesfilter)) return 0; // We start with per Session-alines sdp.attributes = filterAlinesInternal(sdp.attributes, sdpalinesfilter, sdpalinesfilter_list); for (std::vector<SdpMedia>::iterator m_it = sdp.media.begin(); m_it != sdp.media.end(); m_it++) { SdpMedia& media = *m_it; // todo: what if no payload supported any more? media.attributes = filterAlinesInternal(media.attributes, sdpalinesfilter, sdpalinesfilter_list); } return 0; }
int filterSDP(AmSdp& sdp, FilterType sdpfilter, const std::set<string>& sdpfilter_list) { if (!isActiveFilter(sdpfilter)) return 0; for (std::vector<SdpMedia>::iterator m_it = sdp.media.begin(); m_it != sdp.media.end(); m_it++) { SdpMedia& media = *m_it; std::vector<SdpPayload> new_pl; for (std::vector<SdpPayload>::iterator p_it = media.payloads.begin(); p_it != media.payloads.end(); p_it++) { string c = p_it->encoding_name; std::transform(c.begin(), c.end(), c.begin(), ::tolower); bool is_filtered = (sdpfilter == Whitelist) ^ (sdpfilter_list.find(c) != sdpfilter_list.end()); // DBG("%s (%s) is_filtered: %s\n", p_it->encoding_name.c_str(), c.c_str(), // is_filtered?"true":"false"); if (!is_filtered) new_pl.push_back(*p_it); } if (new_pl.empty()) { // in case of SDP offer we could remove media line but in case of answer // we should just reject the stream by setting port to 0 (at least one // format must be given; see RFC 3264, sect. 6) media.port = 0; if (media.payloads.size() > 1) media.payloads.erase(media.payloads.begin() + 1, media.payloads.end()); } else media.payloads = new_pl; } return 0; }