On 2010 June 19, Saturday 16:28:04 you wrote:
> Hi Robert,
>
> Robert Szokovacs wrote:
> > Hi,
> >
> > In RFC3261, sections 7.3.x it is mentioned that it is legal to have
> > multiple SIP header with the same header name and also legal to combine
> > those to comma separated values in a single header.
> > The current SEMS doesn't seem to support this:
> > - getHeader() in AmSipMsg.cpp only returns the first one if there are
> > multiple headers.
> > - get_header_keyvalue() in AmUtils.cpp is not aware of the possibility of
> > multiple values separated by comma.
>
> that's right, there is some issues with these functions.
>
> I have added this to the bug on the tracker:
> https://bugtracker.iptel.org/view.php?id=24
Hi,
I have attached a patch that addresses the issues I described. I introduced a
boolean parameter to getHeader() which switches between the old and the
"correct" behaviour (defaulted to the correct) and patched all places to use
the old one so I hope nothing broke. Also had to add a new parameter to
findHeader. Modified removeHeader() also to remove all instances of the header
specified.
Regarding the original problem in 0000024, I had trouble finding out the exact
format of the parameter from the RFC. Is it legal to the key be quoted? Can it
contain escaped characters? Which ones? Same with the value. Is it legal to
have whitespace around the "=" ? Etc. Any pointers?
br
Szo
diff -ruw -x .svn sems-orig/apps/announce_transfer/AnnounceTransfer.cpp sems-new/apps/announce_transfer/AnnounceTransfer.cpp
--- sems-orig/apps/announce_transfer/AnnounceTransfer.cpp 2010-06-22 13:00:45.000000000 +0200
+++ sems-new/apps/announce_transfer/AnnounceTransfer.cpp 2010-06-22 12:43:37.000000000 +0200
@@ -112,7 +112,7 @@
status = Announcing;
callee_uri = get_session_param(req.hdrs, "Refer-To");
if (!callee_uri.length()) {
- callee_uri = getHeader(req.hdrs, "P-Refer-To");
+ callee_uri = getHeader(req.hdrs, "P-Refer-To", true);
if (callee_uri.length()) {
INFO("Use of P-Refer-To header is deprecated. "
"Use '%s: Refer-To=<uri>' instead.\n",PARAM_HDR);
@@ -140,7 +140,7 @@
(req.method == "NOTIFY")) {
try {
- if (strip_header_params(getHeader(req.hdrs,"Event", "o")) != "refer")
+ if (strip_header_params(getHeader(req.hdrs,"Event", "o", true)) != "refer")
throw AmSession::Exception(481, "Subscription does not exist");
if ((strip_header_params(req.content_type) != "message/sipfrag"))
diff -ruw -x .svn sems-orig/apps/annrecorder/AnnRecorder.cpp sems-new/apps/annrecorder/AnnRecorder.cpp
--- sems-orig/apps/annrecorder/AnnRecorder.cpp 2010-06-22 13:00:43.000000000 +0200
+++ sems-new/apps/annrecorder/AnnRecorder.cpp 2010-06-22 12:45:01.000000000 +0200
@@ -125,7 +125,7 @@
string user;
string typ;
- string iptel_app_param = getHeader(req.hdrs, PARAM_HDR);
+ string iptel_app_param = getHeader(req.hdrs, PARAM_HDR, true);
if (!iptel_app_param.length()) {
throw AmSession::Exception(500, MOD_NAME ": parameters not found");
diff -ruw -x .svn sems-orig/apps/auth_b2b/AuthB2B.cpp sems-new/apps/auth_b2b/AuthB2B.cpp
--- sems-orig/apps/auth_b2b/AuthB2B.cpp 2010-06-22 13:00:43.000000000 +0200
+++ sems-new/apps/auth_b2b/AuthB2B.cpp 2010-06-22 12:44:18.000000000 +0200
@@ -113,7 +113,7 @@
AmMediaProcessor::instance()->removeSession(this);
if (AuthB2BFactory::user.empty()) {
- string app_param = getHeader(req.hdrs, PARAM_HDR);
+ string app_param = getHeader(req.hdrs, PARAM_HDR, true);
if (!app_param.length()) {
AmSession::Exception(500, "auth_b2b: parameters not found");
diff -ruw -x .svn sems-orig/apps/call_timer/CallTimer.cpp sems-new/apps/call_timer/CallTimer.cpp
--- sems-orig/apps/call_timer/CallTimer.cpp 2010-06-22 13:00:43.000000000 +0200
+++ sems-new/apps/call_timer/CallTimer.cpp 2010-06-22 12:46:01.000000000 +0200
@@ -88,7 +88,7 @@
throw AmSession::Exception(500,"could not get a user timer reference");
}
- string app_param = getHeader(req.hdrs, PARAM_HDR);
+ string app_param = getHeader(req.hdrs, PARAM_HDR, true);
unsigned int call_time = CallTimerFactory::DefaultCallTimer;
diff -ruw -x .svn sems-orig/apps/conference/Conference.cpp sems-new/apps/conference/Conference.cpp
--- sems-orig/apps/conference/Conference.cpp 2010-06-22 13:00:43.000000000 +0200
+++ sems-new/apps/conference/Conference.cpp 2010-06-22 12:44:44.000000000 +0200
@@ -379,22 +379,22 @@
int i, len;
string lonely_user_file;
- string app_param_hdr = getHeader(req.hdrs, PARAM_HDR);
+ string app_param_hdr = getHeader(req.hdrs, PARAM_HDR, true);
if (app_param_hdr.length()) {
from_header = get_header_keyvalue(app_param_hdr, "Dialout-From");
extra_headers = get_header_keyvalue(app_param_hdr, "Dialout-Extra");
dialout_suffix = get_header_keyvalue(app_param_hdr, "Dialout-Suffix");
language = get_header_keyvalue(app_param_hdr, "Language");
} else {
- from_header = getHeader(req.hdrs, "P-Dialout-From");
- extra_headers = getHeader(req.hdrs, "P-Dialout-Extra");
- dialout_suffix = getHeader(req.hdrs, "P-Dialout-Suffix");
+ from_header = getHeader(req.hdrs, "P-Dialout-From", true);
+ extra_headers = getHeader(req.hdrs, "P-Dialout-Extra", true);
+ dialout_suffix = getHeader(req.hdrs, "P-Dialout-Suffix", true);
if (from_header.length() || extra_headers.length()
|| dialout_suffix.length()) {
DBG("Warning: P-Dialout- style headers are deprecated."
" Please use P-App-Param header instead.\n");
}
- language = getHeader(req.hdrs, "P-Language");
+ language = getHeader(req.hdrs, "P-Language", true);
if (language.length()) {
DBG("Warning: P-Language header is deprecated."
" Please use P-App-Param header instead.\n");
@@ -837,7 +837,7 @@
dlg.remote_tag = "";
// get route set and next hop
- string iptel_app_param = getHeader(req.hdrs, PARAM_HDR);
+ string iptel_app_param = getHeader(req.hdrs, PARAM_HDR, true);
if (iptel_app_param.length()) {
dlg.setRoute(get_header_keyvalue(iptel_app_param,"Transfer-RR"));
dlg.next_hop = get_header_keyvalue(iptel_app_param,"Transfer-NH");
@@ -845,8 +845,8 @@
INFO("Use of P-Transfer-RR/P-Transfer-NH is deprecated. "
"Use '%s: Transfer-RR=<rr>;Transfer-NH=<nh>' instead.\n",PARAM_HDR);
- dlg.setRoute(getHeader(req.hdrs,"P-Transfer-RR"));
- dlg.next_hop = getHeader(req.hdrs,"P-Transfer-NH");
+ dlg.setRoute(getHeader(req.hdrs,"P-Transfer-RR", true));
+ dlg.next_hop = getHeader(req.hdrs,"P-Transfer-NH", true);
}
DBG("ConferenceDialog::onSipRequest: local_party = %s\n",dlg.local_party.c_str());
diff -ruw -x .svn sems-orig/apps/dsm/DSM.cpp sems-new/apps/dsm/DSM.cpp
--- sems-orig/apps/dsm/DSM.cpp 2010-06-22 13:00:45.000000000 +0200
+++ sems-new/apps/dsm/DSM.cpp 2010-06-22 12:45:48.000000000 +0200
@@ -453,7 +453,7 @@
void DSMFactory::addParams(DSMCall* s, const string& hdrs) {
// TODO: use real parser with quoting and optimize
map<string, string> params;
- vector<string> items = explode(getHeader(hdrs, PARAM_HDR), ";");
+ vector<string> items = explode(getHeader(hdrs, PARAM_HDR, true), ";");
for (vector<string>::iterator it=items.begin();
it != items.end(); it++) {
vector<string> kv = explode(*it, "=");
@@ -508,7 +508,7 @@
from_parser.uri = req.from_uri;
else {
size_t end;
- string pai = getHeader(req.hdrs, SIP_HDR_P_ASSERTED_IDENTITY);
+ string pai = getHeader(req.hdrs, SIP_HDR_P_ASSERTED_IDENTITY, true);
if (!from_parser.parse_contact(pai, 0, end)) {
ERROR("Failed to parse "SIP_HDR_P_ASSERTED_IDENTITY " '%s'\n",
pai.c_str());
diff -ruw -x .svn sems-orig/apps/dsm/mods/mod_uri/ModUri.cpp sems-new/apps/dsm/mods/mod_uri/ModUri.cpp
--- sems-orig/apps/dsm/mods/mod_uri/ModUri.cpp 2010-06-22 13:00:45.000000000 +0200
+++ sems-new/apps/dsm/mods/mod_uri/ModUri.cpp 2010-06-22 12:45:22.000000000 +0200
@@ -81,7 +81,7 @@
string hname = resolveVars(par1, sess, sc_sess, event_params);
string dstname = resolveVars(par2, sess, sc_sess, event_params);
- sc_sess->var[dstname] = getHeader(sc_sess->var["hdrs"], hname);
+ sc_sess->var[dstname] = getHeader(sc_sess->var["hdrs"], hname, true);
DBG("got header '%s' value '%s' as $%s\n",
hname.c_str(), sc_sess->var[dstname].c_str(), dstname.c_str());
diff -ruw -x .svn sems-orig/apps/early_announce/EarlyAnnounce.cpp sems-new/apps/early_announce/EarlyAnnounce.cpp
--- sems-orig/apps/early_announce/EarlyAnnounce.cpp 2010-06-22 13:00:45.000000000 +0200
+++ sems-new/apps/early_announce/EarlyAnnounce.cpp 2010-06-22 12:44:11.000000000 +0200
@@ -298,7 +298,7 @@
#ifdef USE_MYSQL
- string iptel_app_param = getHeader(req.hdrs, PARAM_HDR);
+ string iptel_app_param = getHeader(req.hdrs, PARAM_HDR, true);
string language = get_header_keyvalue(iptel_app_param,"Language");
string announce_file = "";
@@ -385,11 +385,11 @@
continue_b2b = true;
} else if (EarlyAnnounceFactory::ContinueB2B ==
EarlyAnnounceFactory::AppParam) {
- string iptel_app_param = getHeader(invite_req.hdrs, PARAM_HDR);
+ string iptel_app_param = getHeader(invite_req.hdrs, PARAM_HDR, true);
if (iptel_app_param.length()) {
continue_b2b = get_header_keyvalue(iptel_app_param,"B2B")=="yes";
} else {
- continue_b2b = getHeader(invite_req.hdrs,"P-B2B")=="yes";
+ continue_b2b = getHeader(invite_req.hdrs,"P-B2B", true)=="yes";
}
}
DBG("determined: continue_b2b = %s\n", continue_b2b?"true":"false");
@@ -398,7 +398,7 @@
unsigned int code_i = 404;
string reason = "Not Found";
- string iptel_app_param = getHeader(invite_req.hdrs, PARAM_HDR);
+ string iptel_app_param = getHeader(invite_req.hdrs, PARAM_HDR, true);
if (iptel_app_param.length()) {
string code = get_header_keyvalue(iptel_app_param,"Final-Reply-Code");
if (code.length() && str2i(code, code_i)) {
@@ -408,11 +408,11 @@
if (!reason.length())
reason = "Not Found";
} else {
- string code = getHeader(invite_req.hdrs,"P-Final-Reply-Code");
+ string code = getHeader(invite_req.hdrs,"P-Final-Reply-Code", true);
if (code.length() && str2i(code, code_i)) {
ERROR("while parsing P-Final-Reply-Code\n");
}
- string h_reason = getHeader(invite_req.hdrs,"P-Final-Reply-Reason");
+ string h_reason = getHeader(invite_req.hdrs,"P-Final-Reply-Reason", true);
if (h_reason.length()) {
INFO("Use of P-Final-Reply-Code/P-Final-Reply-Reason is deprecated. ");
INFO("Use '%s: Final-Reply-Code=<code>;"
diff -ruw -x .svn sems-orig/apps/examples/b2b_connect/b2b_connect.cpp sems-new/apps/examples/b2b_connect/b2b_connect.cpp
--- sems-orig/apps/examples/b2b_connect/b2b_connect.cpp 2010-06-22 13:00:46.000000000 +0200
+++ sems-new/apps/examples/b2b_connect/b2b_connect.cpp 2010-06-22 12:46:22.000000000 +0200
@@ -78,7 +78,7 @@
// throw AmSession::Exception(500,"could not get a user timer reference");
// }
- string app_param = getHeader(req.hdrs, PARAM_HDR);
+ string app_param = getHeader(req.hdrs, PARAM_HDR, true);
if (!app_param.length()) {
throw AmSession::Exception(500, "b2b_connect: parameters not found");
@@ -108,7 +108,7 @@
return;
}
- string app_param = getHeader(req.hdrs, PARAM_HDR);
+ string app_param = getHeader(req.hdrs, PARAM_HDR, true);
string remote_party, remote_uri;
if (!app_param.length()) {
diff -ruw -x .svn sems-orig/apps/ivr/Ivr.cpp sems-new/apps/ivr/Ivr.cpp
--- sems-orig/apps/ivr/Ivr.cpp 2010-06-22 13:00:43.000000000 +0200
+++ sems-new/apps/ivr/Ivr.cpp 2010-06-22 12:47:18.000000000 +0200
@@ -109,7 +109,7 @@
if(!PyArg_ParseTuple(args,"ss",&headers,&header_name))
return NULL;
- string res = getHeader(headers,header_name);
+ string res = getHeader(headers,header_name, true);
return PyString_FromString(res.c_str());
}
@@ -134,14 +134,14 @@
return NULL;
string res;
- string iptel_app_param = getHeader(headers, PARAM_HDR);
+ string iptel_app_param = getHeader(headers, PARAM_HDR, true);
if (iptel_app_param.length()) {
res = get_header_keyvalue(iptel_app_param,header_name);
} else {
INFO("Use of P-%s is deprecated. \n", header_name);
INFO("Use '%s: %s=<addr>' instead.\n", PARAM_HDR, header_name);
- res = getHeader(headers,string("P-") + header_name);
+ res = getHeader(headers,string("P-") + header_name, true);
}
diff -ruw -x .svn sems-orig/apps/py_sems/PySems.cpp sems-new/apps/py_sems/PySems.cpp
--- sems-orig/apps/py_sems/PySems.cpp 2010-06-22 13:00:43.000000000 +0200
+++ sems-new/apps/py_sems/PySems.cpp 2010-06-22 12:47:42.000000000 +0200
@@ -128,7 +128,7 @@
if(!PyArg_ParseTuple(args,"ss",&headers,&header_name))
return NULL;
- string res = getHeader(headers,header_name);
+ string res = getHeader(headers,header_name, true);
return PyString_FromString(res.c_str());
}
diff -ruw -x .svn sems-orig/apps/registrar_client/SIPRegistrarClient.cpp sems-new/apps/registrar_client/SIPRegistrarClient.cpp
--- sems-orig/apps/registrar_client/SIPRegistrarClient.cpp 2010-06-22 13:00:45.000000000 +0200
+++ sems-new/apps/registrar_client/SIPRegistrarClient.cpp 2010-06-22 12:44:54.000000000 +0200
@@ -385,7 +385,7 @@
string contacts = reply.contact;
if (contacts.empty())
- contacts = getHeader(reply.hdrs, "Contact", "m");
+ contacts = getHeader(reply.hdrs, "Contact", "m", true);
bool found = false;
if (!contacts.length()) {
diff -ruw -x .svn sems-orig/apps/sw_prepaid_sip/SWPrepaidSIP.cpp sems-new/apps/sw_prepaid_sip/SWPrepaidSIP.cpp
--- sems-orig/apps/sw_prepaid_sip/SWPrepaidSIP.cpp 2010-06-22 13:00:45.000000000 +0200
+++ sems-new/apps/sw_prepaid_sip/SWPrepaidSIP.cpp 2010-06-22 12:48:02.000000000 +0200
@@ -121,25 +121,25 @@
setReceiving(false);
AmMediaProcessor::instance()->removeSession(this);
- m_uuid = getHeader(req.hdrs,"P-Caller-Uuid");
+ m_uuid = getHeader(req.hdrs,"P-Caller-Uuid", true);
if(!m_uuid.length()) {
ERROR("Application header P-Caller-Uuid not found\n");
throw AmSession::Exception(500, "could not get UUID parameter");
}
- m_proxy = getHeader(req.hdrs,"P-Proxy");
+ m_proxy = getHeader(req.hdrs,"P-Proxy", true);
if(!m_proxy.length()) {
ERROR("Application header P-Proxy not found\n");
throw AmSession::Exception(500, "could not get PROXY parameter");
}
- m_ruri = getHeader(req.hdrs,"P-R-Uri");
+ m_ruri = getHeader(req.hdrs,"P-R-Uri", true);
if(!m_ruri.length()) {
ERROR("Application header P-R-Uri not found\n");
throw AmSession::Exception(500, "could not get RURI parameter");
}
- m_dest = getHeader(req.hdrs,"P-Acc-Dest");
+ m_dest = getHeader(req.hdrs,"P-Acc-Dest", true);
if(!m_dest.length()) {
ERROR("Application header P-Acc-Dest not found\n");
diff -ruw -x .svn sems-orig/apps/voicebox/Voicebox.cpp sems-new/apps/voicebox/Voicebox.cpp
--- sems-orig/apps/voicebox/Voicebox.cpp 2010-06-22 13:00:45.000000000 +0200
+++ sems-new/apps/voicebox/Voicebox.cpp 2010-06-22 12:46:29.000000000 +0200
@@ -300,7 +300,7 @@
string did;
- string iptel_app_param = getHeader(req.hdrs, PARAM_HDR);
+ string iptel_app_param = getHeader(req.hdrs, PARAM_HDR, true);
if (!iptel_app_param.length()) {
AmSession::Exception(500, APP_NAME ": parameters not found");
diff -ruw -x .svn sems-orig/apps/voicemail/AnswerMachine.cpp sems-new/apps/voicemail/AnswerMachine.cpp
--- sems-orig/apps/voicemail/AnswerMachine.cpp 2010-06-22 13:00:45.000000000 +0200
+++ sems-new/apps/voicemail/AnswerMachine.cpp 2010-06-22 12:46:36.000000000 +0200
@@ -513,7 +513,7 @@
int vm_mode = MODE_VOICEMAIL;
- string iptel_app_param = getHeader(req.hdrs, PARAM_HDR);
+ string iptel_app_param = getHeader(req.hdrs, PARAM_HDR, true);
string mode = get_header_keyvalue(iptel_app_param,"mod", "Mode");
if (!EmailAddress.length()) {
diff -ruw -x .svn sems-orig/core/AmPlugIn.cpp sems-new/core/AmPlugIn.cpp
--- sems-orig/core/AmPlugIn.cpp 2010-06-22 13:00:47.000000000 +0200
+++ sems-new/core/AmPlugIn.cpp 2010-06-22 12:36:52.000000000 +0200
@@ -815,7 +815,7 @@
req.cmd = req.user;
break;
case AmConfig::App_APPHDR:
- req.cmd = getHeader(req.hdrs, APPNAME_HDR);
+ req.cmd = getHeader(req.hdrs, APPNAME_HDR, true);
break;
case AmConfig::App_RURIPARAM:
req.cmd = get_header_param(req.r_uri, "app");
diff -ruw -x .svn sems-orig/core/AmSession.cpp sems-new/core/AmSession.cpp
--- sems-orig/core/AmSession.cpp 2010-06-22 13:00:47.000000000 +0200
+++ sems-new/core/AmSession.cpp 2010-06-22 12:34:25.000000000 +0200
@@ -887,7 +887,7 @@
try {
try {
// handle codec and send reply
- string str_msg_flags = getHeader(hdrs,"P-MsgFlags");
+ string str_msg_flags = getHeader(hdrs,"P-MsgFlags", true);
unsigned int msg_flags = 0;
if(reverse_hex2int(str_msg_flags,msg_flags)){
ERROR("while parsing 'P-MsgFlags' header\n");
diff -ruw -x .svn sems-orig/core/AmSipMsg.cpp sems-new/core/AmSipMsg.cpp
--- sems-orig/core/AmSipMsg.cpp 2010-06-22 13:00:47.000000000 +0200
+++ sems-new/core/AmSipMsg.cpp 2010-06-22 12:39:37.000000000 +0200
@@ -4,34 +4,43 @@
#include "AmSipMsg.h"
-string getHeader(const string& hdrs,const string& hdr_name)
+string getHeader(const string& hdrs,const string& hdr_name, bool single)
{
size_t pos1;
size_t pos2;
size_t pos_s;
- if (findHeader(hdrs,hdr_name, pos1, pos2, pos_s))
- return hdrs.substr(pos1,pos2-pos1);
+ size_t skip = 0;
+ string ret = "";
+ while(findHeader(hdrs, hdr_name, skip, pos1, pos2, pos_s))
+ {
+ if(skip)
+ ret.append(", ");
else
- return "";
+ if(single) return hdrs.substr(pos1,pos2-pos1);
+ ret.append(hdrs.substr(pos1,pos2-pos1));
+ skip = pos2+1;
+ }
+ return ret;
}
string getHeader(const string& hdrs,const string& hdr_name,
- const string& compact_hdr_name)
+ const string& compact_hdr_name, bool single)
{
- string res = getHeader(hdrs, hdr_name);
+ string res = getHeader(hdrs, hdr_name, single);
if (!res.length())
- return getHeader(hdrs, compact_hdr_name);
+ return getHeader(hdrs, compact_hdr_name, single);
return res;
}
-bool findHeader(const string& hdrs,const string& hdr_name,
+bool findHeader(const string& hdrs,const string& hdr_name, const size_t skip,
size_t& pos1, size_t& pos2, size_t& hdr_start)
{
unsigned int p;
char* hdr = strdup(hdr_name.c_str());
- const char* hdrs_c = hdrs.c_str();
+ if(skip >= hdrs.length()) return false;
+ const char* hdrs_c = hdrs.c_str() + skip;
char* hdr_c = hdr;
- const char* hdrs_end = hdrs_c + hdrs.length();
+ const char* hdrs_end = hdrs.c_str() + hdrs.length();
const char* hdr_end = hdr_c + hdr_name.length();
while(hdr_c != hdr_end){
@@ -101,19 +110,19 @@
bool removeHeader(string& hdrs, const string& hdr_name) {
size_t pos1, pos2, hdr_start;
+ bool found = false;
- if (findHeader(hdrs,hdr_name, pos1, pos2,
- hdr_start)) {
+ while (findHeader(hdrs, hdr_name, 0, pos1, pos2, hdr_start)) {
while (pos2 < hdrs.length() &&
(hdrs[pos2]=='\r' || hdrs[pos2]=='\n'))
pos2++;
hdr_start -= hdr_name.length();
hdrs.erase(hdr_start, pos2 - hdr_start);
- return true;
+ found = true;
}
- return false;
+ return found;
}
/* Print Member */
diff -ruw -x .svn sems-orig/core/AmSipMsg.h sems-new/core/AmSipMsg.h
--- sems-orig/core/AmSipMsg.h 2010-06-22 13:00:47.000000000 +0200
+++ sems-new/core/AmSipMsg.h 2010-06-22 12:03:21.000000000 +0200
@@ -71,16 +71,16 @@
string print();
};
-string getHeader(const string& hdrs,const string& hdr_name);
+string getHeader(const string& hdrs,const string& hdr_name, bool single = false);
string getHeader(const string& hdrs,const string& hdr_name,
- const string& compact_hdr_name);
+ const string& compact_hdr_name, bool single = false);
-/** find a header,
+/** find a header, starting from char skip
if found, value is between pos1 and pos2
and hdr start is the start of the header
@return true if found */
-bool findHeader(const string& hdrs,const string& hdr_name,
+bool findHeader(const string& hdrs,const string& hdr_name, const size_t skip,
size_t& pos1, size_t& pos2,
size_t& hdr_start);
diff -ruw -x .svn sems-orig/core/AmUtils.cpp sems-new/core/AmUtils.cpp
--- sems-orig/core/AmUtils.cpp 2010-06-22 13:00:47.000000000 +0200
+++ sems-new/core/AmUtils.cpp 2010-06-22 15:50:51.000000000 +0200
@@ -789,6 +789,18 @@
* while skipping escaped values
*/
string get_header_keyvalue(const string& param_hdr, const string& name) {
+ vector <string> parts = explode(param_hdr, ",");
+ vector<string>::iterator vit;
+ string part;
+ for ( vit=parts.begin() ; vit < parts.end(); vit++ )
+ {
+ part = get_header_keyvalue_single(*vit, name);
+ if(!part.empty()) break;
+ }
+ return part;
+}
+
+string get_header_keyvalue_single(const string& param_hdr, const string& name) {
// ugly, but we need escaping
#define ST_FINDKEY 0
#define ST_FK_ESC 1
@@ -903,7 +915,7 @@
/** get the value of key @param name from \ref PARAM_HDR header in hdrs */
string get_session_param(const string& hdrs, const string& name) {
- string iptel_app_param = getHeader(hdrs, PARAM_HDR);
+ string iptel_app_param = getHeader(hdrs, PARAM_HDR, true);
if (!iptel_app_param.length()) {
// DBG("call parameters header PARAM_HDR not found "
// "(need to configure ser's tw_append?).\n");
diff -ruw -x .svn sems-orig/core/AmUtils.h sems-new/core/AmUtils.h
--- sems-orig/core/AmUtils.h 2010-06-22 13:00:47.000000000 +0200
+++ sems-new/core/AmUtils.h 2010-06-22 15:55:26.000000000 +0200
@@ -268,6 +268,9 @@
/** get the value of key @param name from the list param_hdr*/
string get_header_keyvalue(const string& param_hdr, const string& name);
+/** get the value of key @param name from the list param_hdr, no comma separated values*/
+string get_header_keyvalue_single(const string& param_hdr, const string& name);
+
/** get the value of key @param short_name or @param name or from the list param_hdr*/
string get_header_keyvalue(const string& param_hdr, const string& short_name, const string& name);
diff -ruw -x .svn sems-orig/core/plug-in/session_timer/SessionTimer.cpp sems-new/core/plug-in/session_timer/SessionTimer.cpp
--- sems-orig/core/plug-in/session_timer/SessionTimer.cpp 2010-06-22 13:00:46.000000000 +0200
+++ sems-new/core/plug-in/session_timer/SessionTimer.cpp 2010-06-22 12:35:40.000000000 +0200
@@ -157,7 +157,7 @@
*/
bool SessionTimerFactory::checkSessionExpires(const AmSipRequest& req)
{
- string session_expires = getHeader(req.hdrs, "Session-Expires", "x");
+ string session_expires = getHeader(req.hdrs, "Session-Expires", "x", true);
if (session_expires.length()) {
unsigned int i_se;
@@ -179,10 +179,10 @@
if((req.method == "INVITE")||(req.method == "UPDATE")){
remote_timer_aware =
- key_in_list(getHeader(req.hdrs, SIP_HDR_SUPPORTED),"timer");
+ key_in_list(getHeader(req.hdrs, SIP_HDR_SUPPORTED),"timer", true);
// determine session interval
- string sess_expires_hdr = getHeader(req.hdrs, "Session-Expires", "x");
+ string sess_expires_hdr = getHeader(req.hdrs, "Session-Expires", "x", true);
bool rem_has_sess_expires = false;
unsigned int rem_sess_expires=0;
@@ -198,7 +198,7 @@
// get Min-SE
unsigned int i_minse = min_se;
- string min_se_hdr = getHeader(req.hdrs, "Min-SE");
+ string min_se_hdr = getHeader(req.hdrs, "Min-SE", true);
if (!min_se_hdr.empty()) {
if (str2i(strip_header_params(min_se_hdr),
i_minse)) {
@@ -256,9 +256,9 @@
return;
// determine session interval
- string sess_expires_hdr = getHeader(reply.hdrs, "Session-Expires");
+ string sess_expires_hdr = getHeader(reply.hdrs, "Session-Expires", true);
if (sess_expires_hdr.empty())
- sess_expires_hdr = getHeader(reply.hdrs, "x"); // compact form
+ sess_expires_hdr = getHeader(reply.hdrs, "x", true); // compact form
session_refresher = refresh_local;
session_refresher_role = UAC;
diff -ruw -x .svn sems-orig/core/plug-in/uac_auth/UACAuth.cpp sems-new/core/plug-in/uac_auth/UACAuth.cpp
--- sems-orig/core/plug-in/uac_auth/UACAuth.cpp 2010-06-22 13:00:47.000000000 +0200
+++ sems-new/core/plug-in/uac_auth/UACAuth.cpp 2010-06-22 12:36:15.000000000 +0200
@@ -134,13 +134,14 @@
// credential->user.c_str(),
// credential->pwd.c_str());
if (((reply.code == 401) &&
- getHeader(ri->second.hdrs, "Authorization").length()) ||
+ getHeader(ri->second.hdrs, "Authorization", true).length()) ||
((reply.code == 407) &&
- getHeader(ri->second.hdrs, "Proxy-Authorization").length())) {
+ getHeader(ri->second.hdrs, "Proxy-Authorization", true).length())) {
DBG("Authorization failed!\n");
} else {
- string auth_hdr = (reply.code==407) ? getHeader(reply.hdrs, "Proxy-Authenticate") :
- getHeader(reply.hdrs, "WWW-Authenticate");
+ string auth_hdr = (reply.code==407) ?
+ getHeader(reply.hdrs, "Proxy-Authenticate", true) :
+ getHeader(reply.hdrs, "WWW-Authenticate", true);
string result;
string auth_uri;
_______________________________________________
Semsdev mailing list
[email protected]
http://lists.iptel.org/mailman/listinfo/semsdev