|
@@ -1,7 +1,7 @@
|
|
/*
|
|
/*
|
|
* $Id$
|
|
* $Id$
|
|
*
|
|
*
|
|
- * sip msg. header proxy parser
|
|
|
|
|
|
+ * sip msg. header proxy parser
|
|
*
|
|
*
|
|
*
|
|
*
|
|
* Copyright (C) 2001-2003 FhG Fokus
|
|
* Copyright (C) 2001-2003 FhG Fokus
|
|
@@ -23,8 +23,8 @@
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
* GNU General Public License for more details.
|
|
*
|
|
*
|
|
- * You should have received a copy of the GNU General Public License
|
|
|
|
- * along with this program; if not, write to the Free Software
|
|
|
|
|
|
+ * You should have received a copy of the GNU General Public License
|
|
|
|
+ * along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*
|
|
*
|
|
* History:
|
|
* History:
|
|
@@ -93,7 +93,7 @@ char* get_hdr_field(char* buf, char* end, struct hdr_field* hdr)
|
|
}
|
|
}
|
|
|
|
|
|
/* eliminate leading whitespace */
|
|
/* eliminate leading whitespace */
|
|
- tmp=eat_lws_end(tmp, end);
|
|
|
|
|
|
+ tmp=eat_lws_end(tmp, end);
|
|
if (tmp>=end) {
|
|
if (tmp>=end) {
|
|
LOG(L_ERR, "ERROR: get_hdr_field: HF empty\n");
|
|
LOG(L_ERR, "ERROR: get_hdr_field: HF empty\n");
|
|
goto error;
|
|
goto error;
|
|
@@ -143,8 +143,8 @@ char* get_hdr_field(char* buf, char* end, struct hdr_field* hdr)
|
|
hdr->parsed=cseq_b;
|
|
hdr->parsed=cseq_b;
|
|
hdr->body.len=tmp-hdr->body.s;
|
|
hdr->body.len=tmp-hdr->body.s;
|
|
DBG("get_hdr_field: cseq <%.*s>: <%.*s> <%.*s>\n",
|
|
DBG("get_hdr_field: cseq <%.*s>: <%.*s> <%.*s>\n",
|
|
- hdr->name.len, ZSW(hdr->name.s),
|
|
|
|
- cseq_b->number.len, ZSW(cseq_b->number.s),
|
|
|
|
|
|
+ hdr->name.len, ZSW(hdr->name.s),
|
|
|
|
+ cseq_b->number.len, ZSW(cseq_b->number.s),
|
|
cseq_b->method.len, cseq_b->method.s);
|
|
cseq_b->method.len, cseq_b->method.s);
|
|
break;
|
|
break;
|
|
case HDR_TO_T:
|
|
case HDR_TO_T:
|
|
@@ -164,7 +164,7 @@ char* get_hdr_field(char* buf, char* end, struct hdr_field* hdr)
|
|
hdr->parsed=to_b;
|
|
hdr->parsed=to_b;
|
|
hdr->body.len=tmp-hdr->body.s;
|
|
hdr->body.len=tmp-hdr->body.s;
|
|
DBG("DEBUG: get_hdr_field: <%.*s> [%d]; uri=[%.*s] \n",
|
|
DBG("DEBUG: get_hdr_field: <%.*s> [%d]; uri=[%.*s] \n",
|
|
- hdr->name.len, ZSW(hdr->name.s),
|
|
|
|
|
|
+ hdr->name.len, ZSW(hdr->name.s),
|
|
hdr->body.len, to_b->uri.len,ZSW(to_b->uri.s));
|
|
hdr->body.len, to_b->uri.len,ZSW(to_b->uri.s));
|
|
DBG("DEBUG: to body [%.*s]\n",to_b->body.len,
|
|
DBG("DEBUG: to body [%.*s]\n",to_b->body.len,
|
|
ZSW(to_b->body.s));
|
|
ZSW(to_b->body.s));
|
|
@@ -208,6 +208,13 @@ char* get_hdr_field(char* buf, char* end, struct hdr_field* hdr)
|
|
case HDR_RPID_T:
|
|
case HDR_RPID_T:
|
|
case HDR_SIPIFMATCH_T:
|
|
case HDR_SIPIFMATCH_T:
|
|
case HDR_REFER_TO_T:
|
|
case HDR_REFER_TO_T:
|
|
|
|
+ case HDR_SESSIONEXPIRES_T:
|
|
|
|
+ case HDR_ACCEPTCONTACT_T:
|
|
|
|
+ case HDR_ALLOWEVENTS_T:
|
|
|
|
+ case HDR_CONTENTENCODING_T:
|
|
|
|
+ case HDR_REFERREDBY_T:
|
|
|
|
+ case HDR_REJECTCONTACT_T:
|
|
|
|
+ case HDR_REQUESTDISPOSITION_T:
|
|
case HDR_OTHER_T:
|
|
case HDR_OTHER_T:
|
|
/* just skip over it */
|
|
/* just skip over it */
|
|
hdr->body.s=tmp;
|
|
hdr->body.s=tmp;
|
|
@@ -273,13 +280,13 @@ int parse_headers(struct sip_msg* msg, hdr_flags_t flags, int next)
|
|
|
|
|
|
end=msg->buf+msg->len;
|
|
end=msg->buf+msg->len;
|
|
tmp=msg->unparsed;
|
|
tmp=msg->unparsed;
|
|
-
|
|
|
|
|
|
+
|
|
if (next) {
|
|
if (next) {
|
|
orig_flag = msg->parsed_flag;
|
|
orig_flag = msg->parsed_flag;
|
|
msg->parsed_flag &= ~flags;
|
|
msg->parsed_flag &= ~flags;
|
|
}else
|
|
}else
|
|
- orig_flag=0;
|
|
|
|
-
|
|
|
|
|
|
+ orig_flag=0;
|
|
|
|
+
|
|
DBG("parse_headers: flags=%llx\n", (unsigned long long)flags);
|
|
DBG("parse_headers: flags=%llx\n", (unsigned long long)flags);
|
|
while( tmp<end && (flags & msg->parsed_flag) != flags){
|
|
while( tmp<end && (flags & msg->parsed_flag) != flags){
|
|
hf=pkg_malloc(sizeof(struct hdr_field));
|
|
hf=pkg_malloc(sizeof(struct hdr_field));
|
|
@@ -300,6 +307,13 @@ int parse_headers(struct sip_msg* msg, hdr_flags_t flags, int next)
|
|
msg->parsed_flag|=HDR_EOH_F;
|
|
msg->parsed_flag|=HDR_EOH_F;
|
|
pkg_free(hf);
|
|
pkg_free(hf);
|
|
goto skip;
|
|
goto skip;
|
|
|
|
+ case HDR_SESSIONEXPIRES_T:
|
|
|
|
+ case HDR_ACCEPTCONTACT_T:
|
|
|
|
+ case HDR_ALLOWEVENTS_T:
|
|
|
|
+ case HDR_CONTENTENCODING_T:
|
|
|
|
+ case HDR_REFERREDBY_T:
|
|
|
|
+ case HDR_REJECTCONTACT_T:
|
|
|
|
+ case HDR_REQUESTDISPOSITION_T:
|
|
case HDR_OTHER_T: /*do nothing*/
|
|
case HDR_OTHER_T: /*do nothing*/
|
|
break;
|
|
break;
|
|
case HDR_CALLID_T:
|
|
case HDR_CALLID_T:
|
|
@@ -456,8 +470,8 @@ int parse_headers(struct sip_msg* msg, hdr_flags_t flags, int next)
|
|
}
|
|
}
|
|
#ifdef EXTRA_DEBUG
|
|
#ifdef EXTRA_DEBUG
|
|
DBG("header field type %d, name=<%.*s>, body=<%.*s>\n",
|
|
DBG("header field type %d, name=<%.*s>, body=<%.*s>\n",
|
|
- hf->type,
|
|
|
|
- hf->name.len, ZSW(hf->name.s),
|
|
|
|
|
|
+ hf->type,
|
|
|
|
+ hf->name.len, ZSW(hf->name.s),
|
|
hf->body.len, ZSW(hf->body.s));
|
|
hf->body.len, ZSW(hf->body.s));
|
|
#endif
|
|
#endif
|
|
tmp=rest;
|
|
tmp=rest;
|
|
@@ -541,55 +555,55 @@ int parse_msg(char* buf, unsigned int len, struct sip_msg* msg)
|
|
/* dump parsed data */
|
|
/* dump parsed data */
|
|
if (msg->via1){
|
|
if (msg->via1){
|
|
DBG(" first via: <%.*s/%.*s/%.*s> <%.*s:%.*s(%d)>",
|
|
DBG(" first via: <%.*s/%.*s/%.*s> <%.*s:%.*s(%d)>",
|
|
- msg->via1->name.len,
|
|
|
|
- ZSW(msg->via1->name.s),
|
|
|
|
|
|
+ msg->via1->name.len,
|
|
|
|
+ ZSW(msg->via1->name.s),
|
|
msg->via1->version.len,
|
|
msg->via1->version.len,
|
|
ZSW(msg->via1->version.s),
|
|
ZSW(msg->via1->version.s),
|
|
msg->via1->transport.len,
|
|
msg->via1->transport.len,
|
|
- ZSW(msg->via1->transport.s),
|
|
|
|
|
|
+ ZSW(msg->via1->transport.s),
|
|
msg->via1->host.len,
|
|
msg->via1->host.len,
|
|
ZSW(msg->via1->host.s),
|
|
ZSW(msg->via1->host.s),
|
|
- msg->via1->port_str.len,
|
|
|
|
- ZSW(msg->via1->port_str.s),
|
|
|
|
|
|
+ msg->via1->port_str.len,
|
|
|
|
+ ZSW(msg->via1->port_str.s),
|
|
msg->via1->port);
|
|
msg->via1->port);
|
|
- if (msg->via1->params.s) DBG(";<%.*s>",
|
|
|
|
|
|
+ if (msg->via1->params.s) DBG(";<%.*s>",
|
|
msg->via1->params.len, ZSW(msg->via1->params.s));
|
|
msg->via1->params.len, ZSW(msg->via1->params.s));
|
|
- if (msg->via1->comment.s)
|
|
|
|
- DBG(" <%.*s>",
|
|
|
|
|
|
+ if (msg->via1->comment.s)
|
|
|
|
+ DBG(" <%.*s>",
|
|
msg->via1->comment.len, ZSW(msg->via1->comment.s));
|
|
msg->via1->comment.len, ZSW(msg->via1->comment.s));
|
|
DBG ("\n");
|
|
DBG ("\n");
|
|
}
|
|
}
|
|
if (msg->via2){
|
|
if (msg->via2){
|
|
DBG(" first via: <%.*s/%.*s/%.*s> <%.*s:%.*s(%d)>",
|
|
DBG(" first via: <%.*s/%.*s/%.*s> <%.*s:%.*s(%d)>",
|
|
- msg->via2->name.len,
|
|
|
|
- ZSW(msg->via2->name.s),
|
|
|
|
|
|
+ msg->via2->name.len,
|
|
|
|
+ ZSW(msg->via2->name.s),
|
|
msg->via2->version.len,
|
|
msg->via2->version.len,
|
|
ZSW(msg->via2->version.s),
|
|
ZSW(msg->via2->version.s),
|
|
- msg->via2->transport.len,
|
|
|
|
- ZSW(msg->via2->transport.s),
|
|
|
|
|
|
+ msg->via2->transport.len,
|
|
|
|
+ ZSW(msg->via2->transport.s),
|
|
msg->via2->host.len,
|
|
msg->via2->host.len,
|
|
ZSW(msg->via2->host.s),
|
|
ZSW(msg->via2->host.s),
|
|
- msg->via2->port_str.len,
|
|
|
|
- ZSW(msg->via2->port_str.s),
|
|
|
|
|
|
+ msg->via2->port_str.len,
|
|
|
|
+ ZSW(msg->via2->port_str.s),
|
|
msg->via2->port);
|
|
msg->via2->port);
|
|
- if (msg->via2->params.s) DBG(";<%.*s>",
|
|
|
|
|
|
+ if (msg->via2->params.s) DBG(";<%.*s>",
|
|
msg->via2->params.len, ZSW(msg->via2->params.s));
|
|
msg->via2->params.len, ZSW(msg->via2->params.s));
|
|
- if (msg->via2->comment.s) DBG(" <%.*s>",
|
|
|
|
|
|
+ if (msg->via2->comment.s) DBG(" <%.*s>",
|
|
msg->via2->comment.len, ZSW(msg->via2->comment.s));
|
|
msg->via2->comment.len, ZSW(msg->via2->comment.s));
|
|
DBG ("\n");
|
|
DBG ("\n");
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
-
|
|
|
|
|
|
+
|
|
|
|
|
|
#ifdef EXTRA_DEBUG
|
|
#ifdef EXTRA_DEBUG
|
|
DBG("exiting parse_msg\n");
|
|
DBG("exiting parse_msg\n");
|
|
#endif
|
|
#endif
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
-
|
|
|
|
|
|
+
|
|
error:
|
|
error:
|
|
/* more debugging, msg->orig is/should be null terminated*/
|
|
/* more debugging, msg->orig is/should be null terminated*/
|
|
- LOG(L_ERR, "ERROR: parse_msg: message=<%.*s>\n",
|
|
|
|
|
|
+ LOG(L_ERR, "ERROR: parse_msg: message=<%.*s>\n",
|
|
(int)msg->len, ZSW(msg->buf));
|
|
(int)msg->len, ZSW(msg->buf));
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
@@ -619,7 +633,7 @@ void free_sip_msg(struct sip_msg* msg)
|
|
if (msg->reply_lump) free_reply_lump(msg->reply_lump);
|
|
if (msg->reply_lump) free_reply_lump(msg->reply_lump);
|
|
/* don't free anymore -- now a pointer to a static buffer */
|
|
/* don't free anymore -- now a pointer to a static buffer */
|
|
# ifdef DYN_BUF
|
|
# ifdef DYN_BUF
|
|
- pkg_free(msg->buf);
|
|
|
|
|
|
+ pkg_free(msg->buf);
|
|
# endif
|
|
# endif
|
|
}
|
|
}
|
|
|
|
|