summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2007-04-28 14:30:08 +0000
committerBenny Prijono <bennylp@teluu.com>2007-04-28 14:30:08 +0000
commit9afe128beb506bebd90f716a630008485e0b0b4a (patch)
tree145636af0fa065e66ab2219a10888292b14e2a26
parent0077817a9d0cc585f8f4d40dbf7c20ab653227cf (diff)
Fixed ticket #237: interop problem: some endpoints send colon character in Via parameters
git-svn-id: http://svn.pjsip.org/repos/pjproject/branches/pjproject-0.5-stable@1218 74dad513-b988-da41-8d7b-12977e46ad98
-rw-r--r--pjsip/src/pjsip/sip_msg.c16
-rw-r--r--pjsip/src/pjsip/sip_parser.c9
-rw-r--r--pjsip/src/test-pjsip/msg_test.c17
3 files changed, 38 insertions, 4 deletions
diff --git a/pjsip/src/pjsip/sip_msg.c b/pjsip/src/pjsip/sip_msg.c
index 47c493db..5329d38b 100644
--- a/pjsip/src/pjsip/sip_msg.c
+++ b/pjsip/src/pjsip/sip_msg.c
@@ -1725,10 +1725,22 @@ static int pjsip_via_hdr_print( pjsip_via_hdr *hdr,
copy_advance_pair(buf, ";maddr=", 7, hdr->maddr_param);
copy_advance_pair(buf, ";received=", 10, hdr->recvd_param);
copy_advance_pair(buf, ";branch=", 8, hdr->branch_param);
-
+
+ /* Via's via-extension params should be printed with token spec
+ * according to RFC 3261's generic-param production, but some
+ * endpoint uses pname/pvalue production for these params, by
+ * sending to us Via parameter containing ":".
+ *
+ * So for interoperability sake, lets allow ":" in Via param.
+
printed = pjsip_param_print_on(&hdr->other_param, buf, endbuf-buf,
&pjsip_TOKEN_SPEC,
- &pjsip_TOKEN_SPEC, ';');
+ &pjsip_TOKEN_SPEC, ';');
+ */
+ printed = pjsip_param_print_on(&hdr->other_param, buf, endbuf-buf,
+ &pjsip_PARAM_CHAR_SPEC,
+ &pjsip_PARAM_CHAR_SPEC, ';');
+
if (printed < 0)
return -1;
buf += printed;
diff --git a/pjsip/src/pjsip/sip_parser.c b/pjsip/src/pjsip/sip_parser.c
index cf0f0389..a6bf3154 100644
--- a/pjsip/src/pjsip/sip_parser.c
+++ b/pjsip/src/pjsip/sip_parser.c
@@ -1843,7 +1843,16 @@ static void int_parse_via_param( pjsip_via_hdr *hdr, pj_scanner *scanner,
while ( *scanner->curptr == ';' ) {
pj_str_t pname, pvalue;
+ /* Via's via-extension params should be printed with token spec
+ * according to RFC 3261's generic-param production, but some
+ * endpoint uses pname/pvalue production for these params, by
+ * sending to us Via parameter containing ":".
+ *
+ * So for interoperability sake, lets allow ":" in Via param.
int_parse_param( scanner, pool, &pname, &pvalue);
+ */
+
+ int_parse_uri_param(scanner, pool, &pname, &pvalue);
if (!parser_stricmp(pname, pjsip_BRANCH_STR) && pvalue.slen) {
hdr->branch_param = pvalue;
diff --git a/pjsip/src/test-pjsip/msg_test.c b/pjsip/src/test-pjsip/msg_test.c
index 120cf78f..561850ef 100644
--- a/pjsip/src/test-pjsip/msg_test.c
+++ b/pjsip/src/test-pjsip/msg_test.c
@@ -77,7 +77,7 @@ struct test_msg
{
/* Typical response message. */
"SIP/2.0 200 OK\r\n"
- "Via: SIP/2.0/SCTP server10.biloxi.com;branch=z9hG4bKnashds8;rport;received=192.0.2.1\r\n"
+ "Via: SIP/2.0/SCTP server10.biloxi.com;branch=z9hG4bKnashds8;rport;received=192.0.2.1;param=a:b\r\n"
"Via: SIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1;received=192.0.2.2\r\n"
"Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bK776asdhds ;received=192.0.2.3\r\n"
"Route: <sip:proxy.sipprovider.com>\r\n"
@@ -175,6 +175,13 @@ parse_msg:
goto on_return;
}
}
+ if (!pj_list_empty(&err_list)) {
+ PJ_LOG(3,(THIS_FILE, " Syntax error in line %d col %d",
+ err_list.next->line, err_list.next->col));
+ status = -11;
+ goto on_return;
+ }
+
pj_get_timestamp(&t2);
pj_sub_timestamp(&t2, &t1);
pj_add_timestamp(&var.parse_time, &t2);
@@ -553,13 +560,14 @@ static pjsip_msg *create_msg1(pj_pool_t *pool)
pjsip_clen_hdr *clen;
pjsip_cseq_hdr *cseq;
pjsip_msg *msg = pjsip_msg_create(pool, PJSIP_RESPONSE_MSG);
+ pjsip_param *param;
pjsip_msg_body *body;
//"SIP/2.0 200 OK\r\n"
msg->line.status.code = 200;
msg->line.status.reason = pj_str("OK");
- //"Via: SIP/2.0/SCTP server10.biloxi.com;branch=z9hG4bKnashds8;rport;received=192.0.2.1\r\n"
+ //"Via: SIP/2.0/SCTP server10.biloxi.com;branch=z9hG4bKnashds8;rport;received=192.0.2.1;param=a:b\r\n"
via = pjsip_via_hdr_create(pool);
pjsip_msg_add_hdr(msg, (pjsip_hdr*)via);
via->transport = pj_str("SCTP");
@@ -568,6 +576,11 @@ static pjsip_msg *create_msg1(pj_pool_t *pool)
via->rport_param = 0;
via->recvd_param = pj_str("192.0.2.1");
+ param = pj_pool_zalloc(pool, sizeof(pjsip_param));
+ param->name = pj_str("param");
+ param->value = pj_str("a:b");
+ pj_list_push_back(&via->other_param, param);
+
//"Via: SIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1;received=192.0.2.2\r\n"
via = pjsip_via_hdr_create(pool);
pjsip_msg_add_hdr(msg, (pjsip_hdr*)via);