Module: sems
Branch: master
Commit: 2ad43bfc84a2879e620aa72ed642fd4bd1650c00
URL:    
http://git.sip-router.org/cgi-bin/gitweb.cgi/sems/?a=commit;h=2ad43bfc84a2879e620aa72ed642fd4bd1650c00

Author: Stefan Sayer <[email protected]>
Committer: Stefan Sayer <[email protected]>
Date:   Fri Oct 29 14:41:16 2010 +0200

sbc: support for using header and header components

---

 apps/sbc/SBC.cpp   |   44 ++++++++++++++++++++++++++++++++++++++++++++
 doc/Readme.sbc.txt |   22 +++++++++++++++++++++-
 2 files changed, 65 insertions(+), 1 deletions(-)

diff --git a/apps/sbc/SBC.cpp b/apps/sbc/SBC.cpp
index 122f28a..bdaec10 100644
--- a/apps/sbc/SBC.cpp
+++ b/apps/sbc/SBC.cpp
@@ -401,6 +401,50 @@ string SBCDialog::replaceParameters(const char* r_type,
        skip_chars = skip_p-p;
       } break;
 
+      case 'H': { // header
+       size_t name_offset = 2;
+       if (s[p+1] != '(') {
+         if (s[p+2] != '(') {
+           WARN("Error parsing H header replacement (missing '(')\n");
+           break;
+         }
+         name_offset = 3;
+       }
+       if (s.length()<name_offset+1) {
+         WARN("Error parsing H header replacement (short string)\n");
+         break;
+       }
+
+       size_t skip_p = p+name_offset;
+       for (;skip_p<s.length() && s[skip_p] != ')';skip_p++) { }
+       if (skip_p==s.length()) {
+         WARN("Error parsing H header replacement (unclosed brackets)\n");
+         break;
+       }
+       string hdr_name = s.substr(p+name_offset, skip_p-p-name_offset);
+       // DBG("param_name = '%s' (skip-p - p = %d)\n", param_name.c_str(), 
skip_p-p);
+       if (name_offset == 2) {
+         // full header
+         res += getHeader(req.hdrs, hdr_name);
+       } else {
+         // parse URI and use component
+         AmUriParser uri_parser;
+         uri_parser.uri = getHeader(req.hdrs, hdr_name);
+         if ((s[p+1] == '.')) {
+           res += uri_parser.uri;
+           break;
+         }
+
+         if (!uri_parser.parse_uri()) {
+           WARN("Error parsing header %s URI '%s'\n",
+                hdr_name.c_str(), uri_parser.uri.c_str());
+           break;
+         }
+         replaceParsedParam(s, p, uri_parser, res);
+       }
+       skip_chars = skip_p-p;
+      } break;
+
       default: {
        WARN("unknown replace pattern $%c%c\n",
             s[p], s[p+1]);
diff --git a/doc/Readme.sbc.txt b/doc/Readme.sbc.txt
index 49cedf4..3f99fc3 100644
--- a/doc/Readme.sbc.txt
+++ b/doc/Readme.sbc.txt
@@ -90,6 +90,27 @@ The patterns which can be used are the following:
       auth_pwd=$P(p)
       From=sip:$P(u)@$P(d)
 
+  $H(headername) - value of header <headername>
+   Examples:
+    o P-Caller-Uuid: 0004152379B8
+       and
+      prepaid_caller_uuid=$H(P-Caller-Uuid)
+
+    o P-NextHop-IP: 10.0.2.15
+       and
+      next_hop_ip=$H(P-NextHop-IP)
+
+  $HU(headername) - header <headername> (as URI) User
+  $Hd(headername) - header <headername> (as URI) domain (host:port)
+  ...
+
+   Example:
+    o P-SomeNH-URI: sip:[email protected]:5092
+       and
+      next_hop_ip=$Hh(P-SomeNH-URI)
+      next_hop_port=$Hp(P-SomeNH-URI)
+
+
   \\  -> \
   \$  -> $
   \*  -> *
@@ -121,7 +142,6 @@ Headers and messages may be filtered. A filter can be set to
  o transparent - no filtering done
 
  o whitelist - only let items pass that are in the filter list
-
  o blacklist - filter out items that are in the filter list
 
 Note that if ACK messages should not be filtered.

_______________________________________________
Semsdev mailing list
[email protected]
http://lists.iptel.org/mailman/listinfo/semsdev

Reply via email to