浏览代码

core: kemi - functions to get headers by name and index

Daniel-Constantin Mierla 6 年之前
父节点
当前提交
166ef92d03
共有 1 个文件被更改,包括 78 次插入8 次删除
  1. 78 8
      src/core/kemi.c

+ 78 - 8
src/core/kemi.c

@@ -2019,12 +2019,17 @@ static int sr_kemi_hdr_append_to_reply(sip_msg_t *msg, str *txt)
 /**
  *
  */
-static sr_kemi_xval_t* sr_kemi_hdr_get_mode(sip_msg_t *msg, str *hname, int rmode)
+static sr_kemi_xval_t* sr_kemi_hdr_get_mode(sip_msg_t *msg, str *hname, int idx,
+		int rmode)
 {
 	char hbuf[256];
 	str s;
 	hdr_field_t shdr;
 	hdr_field_t *ihdr;
+#define SR_KEMI_VHDR_SIZE 256
+	hdr_field_t *vhdr[SR_KEMI_VHDR_SIZE];
+	int n;
+	int hmatch;
 
 	memset(&_sr_kemi_xval, 0, sizeof(sr_kemi_xval_t));
 
@@ -2055,22 +2060,48 @@ static sr_kemi_xval_t* sr_kemi_hdr_get_mode(sip_msg_t *msg, str *hname, int rmod
 		sr_kemi_xval_null(&_sr_kemi_xval, rmode);
 		return &_sr_kemi_xval;
 	}
+	n = 0;
 	for (ihdr=msg->headers; ihdr; ihdr=ihdr->next) {
+		hmatch = 0;
 		if (shdr.type!=HDR_OTHER_T && shdr.type!=HDR_ERROR_T) {
 			/* find by type */
 			if (shdr.type==ihdr->type) {
-				break;
+				hmatch = 1;
 			}
 		} else {
 			/* find by name */
 			if (cmp_hdrname_str(&ihdr->name, hname)==0) {
+				hmatch = 1;
+			}
+		}
+		if (hmatch == 1) {
+			if(idx==n) {
 				break;
+			} else {
+				if(idx<0) {
+					vhdr[n] = ihdr;
+				}
+				n++;
+				if(n==SR_KEMI_VHDR_SIZE) {
+					LM_DBG("too many headers with name: %.*s\n",
+							hname->len, hname->s);
+					sr_kemi_xval_null(&_sr_kemi_xval, rmode);
+					return &_sr_kemi_xval;
+				}
 			}
 		}
 	}
-	if(ihdr==NULL) {
-		sr_kemi_xval_null(&_sr_kemi_xval, rmode);
-		return &_sr_kemi_xval;
+	if(idx>=0) {
+		if(ihdr==NULL) {
+			sr_kemi_xval_null(&_sr_kemi_xval, rmode);
+			return &_sr_kemi_xval;
+		}
+	} else {
+		if(n + idx < 0) {
+			sr_kemi_xval_null(&_sr_kemi_xval, rmode);
+			return &_sr_kemi_xval;
+		}
+		ihdr = vhdr[n + idx];
 	}
 
 	_sr_kemi_xval.vtype = SR_KEMIP_STR;
@@ -2083,7 +2114,7 @@ static sr_kemi_xval_t* sr_kemi_hdr_get_mode(sip_msg_t *msg, str *hname, int rmod
  */
 static sr_kemi_xval_t* sr_kemi_hdr_get(sip_msg_t *msg, str *hname)
 {
-	return sr_kemi_hdr_get_mode(msg, hname, SR_KEMI_XVAL_NULL_NONE);
+	return sr_kemi_hdr_get_mode(msg, hname, 0, SR_KEMI_XVAL_NULL_NONE);
 }
 
 /**
@@ -2091,7 +2122,7 @@ static sr_kemi_xval_t* sr_kemi_hdr_get(sip_msg_t *msg, str *hname)
  */
 static sr_kemi_xval_t* sr_kemi_hdr_gete(sip_msg_t *msg, str *hname)
 {
-	return sr_kemi_hdr_get_mode(msg, hname, SR_KEMI_XVAL_NULL_EMPTY);
+	return sr_kemi_hdr_get_mode(msg, hname, 0, SR_KEMI_XVAL_NULL_EMPTY);
 }
 
 /**
@@ -2099,7 +2130,31 @@ static sr_kemi_xval_t* sr_kemi_hdr_gete(sip_msg_t *msg, str *hname)
  */
 static sr_kemi_xval_t* sr_kemi_hdr_getw(sip_msg_t *msg, str *hname)
 {
-	return sr_kemi_hdr_get_mode(msg, hname, SR_KEMI_XVAL_NULL_PRINT);
+	return sr_kemi_hdr_get_mode(msg, hname, 0, SR_KEMI_XVAL_NULL_PRINT);
+}
+
+/**
+ *
+ */
+static sr_kemi_xval_t* sr_kemi_hdr_get_idx(sip_msg_t *msg, str *hname, int idx)
+{
+	return sr_kemi_hdr_get_mode(msg, hname, idx, SR_KEMI_XVAL_NULL_NONE);
+}
+
+/**
+ *
+ */
+static sr_kemi_xval_t* sr_kemi_hdr_gete_idx(sip_msg_t *msg, str *hname, int idx)
+{
+	return sr_kemi_hdr_get_mode(msg, hname, idx, SR_KEMI_XVAL_NULL_EMPTY);
+}
+
+/**
+ *
+ */
+static sr_kemi_xval_t* sr_kemi_hdr_getw_idx(sip_msg_t *msg, str *hname, int idx)
+{
+	return sr_kemi_hdr_get_mode(msg, hname, idx, SR_KEMI_XVAL_NULL_PRINT);
 }
 
 /**
@@ -2166,6 +2221,21 @@ static sr_kemi_t _sr_kemi_hdr[] = {
 		{ SR_KEMIP_STR, SR_KEMIP_NONE, SR_KEMIP_NONE,
 			SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
 	},
+	{ str_init("hdr"), str_init("get_idx"),
+		SR_KEMIP_XVAL, sr_kemi_hdr_get_idx,
+		{ SR_KEMIP_STR, SR_KEMIP_INT, SR_KEMIP_NONE,
+			SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
+	},
+	{ str_init("hdr"), str_init("gete_idx"),
+		SR_KEMIP_XVAL, sr_kemi_hdr_gete_idx,
+		{ SR_KEMIP_STR, SR_KEMIP_INT, SR_KEMIP_NONE,
+			SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
+	},
+	{ str_init("hdr"), str_init("getw_idx"),
+		SR_KEMIP_XVAL, sr_kemi_hdr_getw_idx,
+		{ SR_KEMIP_STR, SR_KEMIP_INT, SR_KEMIP_NONE,
+			SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
+	},
 
 	{ {0, 0}, {0, 0}, 0, NULL, { 0, 0, 0, 0, 0, 0 } }
 };