[sr-dev] git:pd/outbound: lib/kcore: added parser for Require: header

Peter Dunkley peter.dunkley at crocodile-rcs.com
Wed Feb 27 16:30:45 CET 2013


Module: sip-router
Branch: pd/outbound
Commit: 936b6892a8a0ff25b108635e48a146b7cbc3a7ff
URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=936b6892a8a0ff25b108635e48a146b7cbc3a7ff

Author: Peter Dunkley <peter.dunkley at crocodile-rcs.com>
Committer: Peter Dunkley <peter.dunkley at crocodile-rcs.com>
Date:   Wed Feb 27 14:03:27 2013 +0000

lib/kcore: added parser for Require: header

---

 lib/kcore/parse_require.c |   71 +++++++++++++++++++++++++++++++++++++++++++++
 lib/kcore/parse_require.h |   48 ++++++++++++++++++++++++++++++
 2 files changed, 119 insertions(+), 0 deletions(-)

diff --git a/lib/kcore/parse_require.c b/lib/kcore/parse_require.c
new file mode 100644
index 0000000..7bb1a3d
--- /dev/null
+++ b/lib/kcore/parse_require.c
@@ -0,0 +1,71 @@
+/*
+ * $Id$
+ *
+ * This file is part of Kamailio, a free SIP server.
+ *
+ * Kamailio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version
+ *
+ * Kamailio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * 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
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+/*!
+ * \file
+ * \brief Require parser
+ * \ingroup parser
+ */
+
+#include "../../mem/mem.h"
+#include "parse_require.h"
+
+/*!
+ * Parse all Require headers
+ */
+int parse_require( struct sip_msg *msg)
+{
+	unsigned int require;
+	struct hdr_field  *hdr;
+	struct option_tag_body *rb;
+
+	/* maybe the header is already parsed! */
+	if (msg->require && msg->require->parsed)
+		return 0;
+
+	/* parse to the end in order to get all SUPPORTED headers */
+	if (parse_headers(msg,HDR_EOH_F,0)==-1 || !msg->require)
+		return -1;
+
+	/* bad luck! :-( - we have to parse them */
+	require = 0;
+	for( hdr=msg->require ; hdr ; hdr=next_sibling_hdr(hdr)) {
+		if (hdr->parsed) {
+			require |= ((struct option_tag_body*)hdr->parsed)->option_tags;
+			continue;
+		}
+
+		rb = (struct option_tag_body*)pkg_malloc(sizeof(struct option_tag_body));
+		if (rb == 0) {
+			LM_ERR("out of pkg_memory\n");
+			return -1;
+		}
+
+		parse_option_tag_body(&(hdr->body), &(rb->option_tags));
+		rb->hfree = hf_free_option_tag;
+		rb->option_tags_all = 0;
+		hdr->parsed = (void*)rb;
+		require |= rb->option_tags;
+	}
+
+	((struct option_tag_body*)msg->require->parsed)->option_tags_all = 
+		require;
+	return 0;
+}
diff --git a/lib/kcore/parse_require.h b/lib/kcore/parse_require.h
new file mode 100644
index 0000000..9214455
--- /dev/null
+++ b/lib/kcore/parse_require.h
@@ -0,0 +1,48 @@
+/*
+ * $Id$
+ *
+ * This file is part of Kamailio, a free SIP server.
+ *
+ * Kamailio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version
+ *
+ * Kamailio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * 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
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+/*!
+ * \file
+ * \brief Require parser
+ * \ingroup parser
+ */
+
+#ifndef PARSE_REQUIRE_H
+#define PARSE_REQUIRE_H
+
+#include "../../parser/msg_parser.h"
+#include "../../parser/hf.h"
+#include "../../mem/mem.h"
+#include "option-tags.h"
+
+#define get_require(p_msg) \
+	((p_msg)->require ? ((struct option_tag_body*)(p_msg)->require->parsed)->option_tags_all : 0)
+
+
+/*!
+ * Parse all Require headers.
+ */
+int parse_require( struct sip_msg *msg);
+
+
+void free_require(struct option_tag_body **rb);
+
+#endif /* PARSE_REQUIRE_H */




More information about the sr-dev mailing list