From d5773dfd7c329691d7b4999634c0ad5668d7853a Mon Sep 17 00:00:00 2001 From: Stefan Sayer Date: Fri, 7 Jan 2011 16:55:16 +0100 Subject: [PATCH] sbc: add \r, \n, \t replacement --- apps/sbc/ParamReplacer.cpp | 355 +++++++++++++++++++------------------ 1 file changed, 184 insertions(+), 171 deletions(-) diff --git a/apps/sbc/ParamReplacer.cpp b/apps/sbc/ParamReplacer.cpp index 74ff77f1..13dfe6ad 100644 --- a/apps/sbc/ParamReplacer.cpp +++ b/apps/sbc/ParamReplacer.cpp @@ -61,217 +61,230 @@ string replaceParameters(const string& s, string res; bool is_replaced = false; size_t p = 0; - char last_char=' '; + bool is_escaped = false; + + // char last_char=' '; while (p= p+1)) { - is_replaced = true; - p++; + + if (is_escaped) { switch (s[p]) { - case 'f': { // from - if ((s.length() == p+1) || (s[p+1] == '.')) { - res += req.from; - break; + case 'r': res += '\r'; break; + case 'n': res += '\n'; break; + case 't': res += '\t'; break; + default: res += s[p]; break; + } + is_escaped = false; + } else { // not escaped + if (s[p]=='\\') { + if (p==s.length()-1) { + res += '\\'; // add single \ at the end + } else { + is_escaped = true; + is_replaced = true; } - - if (from_parser.uri.empty()) { - from_parser.uri = req.from; - if (!from_parser.parse_uri()) { - WARN("Error parsing From URI '%s'\n", req.from.c_str()); + } else if ((s[p]=='$') && (s.length() >= p+1)) { + is_replaced = true; + p++; + switch (s[p]) { + case 'f': { // from + if ((s.length() == p+1) || (s[p+1] == '.')) { + res += req.from; break; } - } - replaceParsedParam(s, p, from_parser, res); + if (from_parser.uri.empty()) { + from_parser.uri = req.from; + if (!from_parser.parse_uri()) { + WARN("Error parsing From URI '%s'\n", req.from.c_str()); + break; + } + } - }; break; + replaceParsedParam(s, p, from_parser, res); - case 't': { // to - if ((s.length() == p+1) || (s[p+1] == '.')) { - res += req.to; - break; - } + }; break; - if (to_parser.uri.empty()) { - to_parser.uri = req.to; - if (!to_parser.parse_uri()) { - WARN("Error parsing To URI '%s'\n", req.to.c_str()); + case 't': { // to + if ((s.length() == p+1) || (s[p+1] == '.')) { + res += req.to; break; } - } - replaceParsedParam(s, p, to_parser, res); + if (to_parser.uri.empty()) { + to_parser.uri = req.to; + if (!to_parser.parse_uri()) { + WARN("Error parsing To URI '%s'\n", req.to.c_str()); + break; + } + } - }; break; + replaceParsedParam(s, p, to_parser, res); - case 'r': { // r-uri - if ((s.length() == p+1) || (s[p+1] == '.')) { - res += req.r_uri; - break; - } - - if (ruri_parser.uri.empty()) { - ruri_parser.uri = req.r_uri; - if (!ruri_parser.parse_uri()) { - WARN("Error parsing R-URI '%s'\n", req.r_uri.c_str()); + }; break; + + case 'r': { // r-uri + if ((s.length() == p+1) || (s[p+1] == '.')) { + res += req.r_uri; break; } - } - replaceParsedParam(s, p, ruri_parser, res); - }; break; - case 'c': { // call-id - if ((s.length() == p+1) || (s[p+1] == 'i')) { - res += req.callid; - break; - } - WARN("unknown replacement $c%c\n", s[p+1]); - }; break; + if (ruri_parser.uri.empty()) { + ruri_parser.uri = req.r_uri; + if (!ruri_parser.parse_uri()) { + WARN("Error parsing R-URI '%s'\n", req.r_uri.c_str()); + break; + } + } + replaceParsedParam(s, p, ruri_parser, res); + }; break; - case 's': { // source (remote) - if (s.length() < p+1) { - WARN("unknown replacement $s\n"); - break; - } + case 'c': { // call-id + if ((s.length() == p+1) || (s[p+1] == 'i')) { + res += req.callid; + break; + } + WARN("unknown replacement $c%c\n", s[p+1]); + }; break; - if (s[p+1] == 'i') { // $si source IP address - res += req.remote_ip.c_str(); - break; - } else if (s[p+1] == 'p') { // $sp source port - res += int2str(req.remote_port); - break; - } + case 's': { // source (remote) + if (s.length() < p+1) { + WARN("unknown replacement $s\n"); + break; + } - WARN("unknown replacement $s%c\n", s[p+1]); - }; break; + if (s[p+1] == 'i') { // $si source IP address + res += req.remote_ip.c_str(); + break; + } else if (s[p+1] == 'p') { // $sp source port + res += int2str(req.remote_port); + break; + } - case 'R': { // received (local) - if (s.length() < p+1) { - WARN("unknown replacement $R\n"); - break; - } + WARN("unknown replacement $s%c\n", s[p+1]); + }; break; - if (s[p+1] == 'i') { // $si source IP address - res += req.local_ip.c_str(); - break; - } else if (s[p+1] == 'p') { // $sp source port - res += int2str(req.local_port); - break; - } - WARN("unknown replacement $R%c\n", s[p+1]); - }; break; + case 'R': { // received (local) + if (s.length() < p+1) { + WARN("unknown replacement $R\n"); + break; + } + + if (s[p+1] == 'i') { // $si source IP address + res += req.local_ip.c_str(); + break; + } else if (s[p+1] == 'p') { // $sp source port + res += int2str(req.local_port); + break; + } + WARN("unknown replacement $R%c\n", s[p+1]); + }; break; #define case_HDR(pv_char, pv_name, hdr_name) \ - case pv_char: { \ - AmUriParser uri_parser; \ - uri_parser.uri = getHeader(req.hdrs, hdr_name); \ - if ((s.length() == p+1) || (s[p+1] == '.')) { \ - res += uri_parser.uri; \ - break; \ - } \ + case pv_char: { \ + AmUriParser uri_parser; \ + uri_parser.uri = getHeader(req.hdrs, hdr_name); \ + if ((s.length() == p+1) || (s[p+1] == '.')) { \ + res += uri_parser.uri; \ + break; \ + } \ \ - if (!uri_parser.parse_uri()) { \ - WARN("Error parsing " pv_name " URI '%s'\n", uri_parser.uri.c_str()); \ - break; \ - } \ - if (s[p+1] == 'i') { \ - res+=uri_parser.uri_user+"@"+uri_parser.uri_host; \ - if (!uri_parser.uri_port.empty()) \ - res+=":"+uri_parser.uri_port; \ - } else { \ - replaceParsedParam(s, p, uri_parser, res); \ - } \ - }; break; - - case_HDR('a', "PAI", SIP_HDR_P_ASSERTED_IDENTITY); // P-Asserted-Identity - case_HDR('p', "PPI", SIP_HDR_P_PREFERRED_IDENTITY); // P-Preferred-Identity - - case 'P': { // app-params - if (s[p+1] != '(') { - WARN("Error parsing P param replacement (missing '(')\n"); - break; - } - if (s.length()