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

Author: Stefan Sayer <[email protected]>
Committer: Stefan Sayer <[email protected]>
Date:   Fri Jan  7 17:14:38 2011 +0100

sbc: append_headers profile option

---

 apps/sbc/SBC.cpp                         |   18 ++++++++++++++++--
 apps/sbc/SBCCallProfile.cpp              |    8 ++++++++
 apps/sbc/SBCCallProfile.h                |    2 ++
 apps/sbc/etc/transparent.sbcprofile.conf |    3 +++
 doc/Readme.sbc.txt                       |   16 +++++++++++++++-
 5 files changed, 44 insertions(+), 3 deletions(-)

diff --git a/apps/sbc/SBC.cpp b/apps/sbc/SBC.cpp
index c993e52..bd578cf 100644
--- a/apps/sbc/SBC.cpp
+++ b/apps/sbc/SBC.cpp
@@ -32,8 +32,6 @@ SBC - feature-wishlist
 - call distribution
 - select profile on monitoring in-mem DB record
 - fallback profile
-- add headers
-- online profile reload
  */
 #include "SBC.h"
 
@@ -427,6 +425,22 @@ void SBCDialog::onInvite(const AmSipRequest& req)
   inplaceHeaderFilter(invite_req.hdrs,
                      call_profile.headerfilter_list, 
call_profile.headerfilter);
 
+
+  if (!call_profile.append_headers.empty()) {
+    string append_headers = replaceParameters(call_profile.append_headers,
+                                             "append_headers", REPLACE_VALS);
+    if (append_headers.size()>2) {
+      if (append_headers[append_headers.size()-2] != '\r' ||
+         append_headers[append_headers.size()-1] != '\n') {
+       while ((append_headers[append_headers.size()-1] == '\r') ||
+              (append_headers[append_headers.size()-1] == '\n'))
+         append_headers.erase(append_headers.size()-1);
+       append_headers += "\r\n";
+      }
+      invite_req.hdrs+=append_headers;
+    }
+  }
+
   if (call_profile.auth_enabled) {
     call_profile.auth_credentials.user = 
       replaceParameters(call_profile.auth_credentials.user, "auth_user", 
REPLACE_VALS);
diff --git a/apps/sbc/SBCCallProfile.cpp b/apps/sbc/SBCCallProfile.cpp
index 34bc57e..5f02442 100644
--- a/apps/sbc/SBCCallProfile.cpp
+++ b/apps/sbc/SBCCallProfile.cpp
@@ -167,6 +167,9 @@ bool SBCCallProfile::readFromConfiguration(const string& 
name,
     reply_translations[from_code] = make_pair(to_code, to_reply.substr(s_pos));
   }
 
+  // append_headers=P-Received-IP: $si\r\nP-Received-Port:$sp\r\n
+  append_headers = cfg.getParameter("append_headers");
+
   md5hash = "<unknown>";
   if (!cfg.getMD5(profile_file_name, md5hash)){
     ERROR("calculating MD5 of file %s\n", profile_file_name.c_str());
@@ -217,6 +220,10 @@ bool SBCCallProfile::readFromConfiguration(const string& 
name,
     INFO("SBC:      reply translation for  %s\n", reply_trans_codes.c_str());
   }
 
+  if (append_headers.size()) {
+    INFO("SBC:      append headers '%s'\n", append_headers.c_str());
+  }
+
   return true;
 }
 
@@ -315,6 +322,7 @@ string SBCCallProfile::print() const {
 
     res += "prepaid_acc_dest:     " + reply_trans_codes +"\n";
   }
+  res += "append_headers:     " + append_headers + "\n";
   res += "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n";
   return res;
 }
diff --git a/apps/sbc/SBCCallProfile.h b/apps/sbc/SBCCallProfile.h
index 01690d0..353fa73 100644
--- a/apps/sbc/SBCCallProfile.h
+++ b/apps/sbc/SBCCallProfile.h
@@ -83,6 +83,8 @@ struct SBCCallProfile {
 
   map<unsigned int, std::pair<unsigned int, string> > reply_translations;
 
+  string append_headers;
+
   // todo: RTP forwarding mode
   // todo: RTP transcoding mode
 
diff --git a/apps/sbc/etc/transparent.sbcprofile.conf 
b/apps/sbc/etc/transparent.sbcprofile.conf
index e3f00e4..1db5f84 100644
--- a/apps/sbc/etc/transparent.sbcprofile.conf
+++ b/apps/sbc/etc/transparent.sbcprofile.conf
@@ -27,6 +27,9 @@
 #sdp_filter=whitelist
 #sdpfilter_list=g729,g723,ilbc,speex,gsm,amr
 
+## append extra headers
+#append_headers="P-Source-IP: $si\r\nP-Source-Port: $sp\r\n"
+
 ## reply translations
 # translate some 6xx class replies to 4xx class:
 #reply_translations="603=>488 Not acceptable here|600=>406 Not Acceptable"
diff --git a/doc/Readme.sbc.txt b/doc/Readme.sbc.txt
index 765a36b..f63ef4f 100644
--- a/doc/Readme.sbc.txt
+++ b/doc/Readme.sbc.txt
@@ -154,6 +154,9 @@ The patterns which can be used are the following:
   \\  -> \
   \$  -> $
   \*  -> *
+  \r  -> cr  (e.g. use \r\n to separate different headers in append_headers)
+  \n  -> lf
+  \t  -> tab
 
 If a quotation mark (") is used, it needs to be escaped with a backslash in
 the sbc profile configuration file.
@@ -208,6 +211,17 @@ set to transparent, the SDP is parsed and reconstructed 
(SDP sanity check).
 Codecs may be filtered out by their payload names in whitelist or blacklist
 modes. The payload names in the list are case-insensitive (PCMU==pcmu).
 
+Adding headers
+--------------
+Additional headers can be added to the outgoing initial INVITE by using the
+append_headers call profile option. Here, several headers can be separated with
+\r\n. All replacement patterns from above can be used.
+
+Examples:
+ append_headers="P-Received-IP: $Ri\r\nP-Received-Port: $Rp"
+ append_headers="P-Source-IP: $si\r\nP-Source-Port: $sp\r\n"
+ append_headers="P-Original-URI: $r"
+
 Response code translations
 -----------------------
 Response codes and reasons may be translated, e.g. if some 6xx class replies 
need
@@ -322,6 +336,6 @@ x maximum call duration timer
 - call distribution
 - select profile on monitoring in-mem DB record
 - fallback profile
-- add headers
+x add headers
 - bridging between interfaces
 - rel1xx in non-transparent mode

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

Reply via email to