Explorar o código

params retrieving extended to
@msg.<HEADER>.params.<PARAM_NAME> for header which's value allows param like name=body
@msg.<HEADER>.nameaddr.params[.<PARAM_NAME>] parameter of the header which has nameadde as value
@msg.<HEADER>.nameaddr.uri.params[.<PARAM_NAME>] parameter of the URI
which works for all selects returning uri

Michal Matyska %!s(int64=19) %!d(string=hai) anos
pai
achega
60c006fa65
Modificáronse 2 ficheiros con 60 adicións e 10 borrados
  1. 52 9
      select_core.c
  2. 8 1
      select_core.h

+ 52 - 9
select_core.c

@@ -524,7 +524,7 @@ int select_anyheader(str* res, select_t* s, struct sip_msg* msg)
 	hf0 = NULL;
 
 	/* extract header index if present */
-	if (s->n == 3) {
+	if (s->param_offset[s->lvl+1] == 3) {
 		if (s->params[2].type == SEL_PARAM_INT) {
 			hi = s->params[2].v.i;
 		} else {
@@ -558,6 +558,7 @@ int select_anyheader(str* res, select_t* s, struct sip_msg* msg)
 	return 0;
 }
 
+ABSTRACT_F(select_anyheader_params)
 ABSTRACT_F(select_any_uri)
 
 static struct sip_uri uri;
@@ -655,6 +656,22 @@ int select_uri_hostport(str* res, select_t* s, struct sip_msg* msg)
 }
 
 int select_uri_params(str* res, select_t* s, struct sip_msg* msg)
+{
+	if (!msg || !res) {
+		return select_any_params(res, s, msg);
+	}
+
+	if (parse_uri(res->s, res->len, &uri)<0)
+		return -1;
+	
+	if (s->param_offset[s->lvl+1]-s->param_offset[s->lvl]==1)
+		RETURN0_res(uri.params);
+
+	*res=uri.params;
+	return select_any_params(res, s, msg);
+}
+
+int select_any_params(str* res, select_t* s, struct sip_msg* msg)
 {
 	param_hooks_t h;
 	param_t *p, *list=NULL;
@@ -671,17 +688,11 @@ int select_uri_params(str* res, select_t* s, struct sip_msg* msg)
 		return 0;
 	}
 	
-	if (parse_uri(res->s, res->len, &uri)<0)
-		return -1;
-	
-	if (s->param_offset[s->lvl+1]-s->param_offset[s->lvl]==1)
-		RETURN0_res(uri.params);
-
 	if (s->params[s->param_offset[s->lvl]+1].type!=SEL_PARAM_STR) return -1;
 	wanted=&s->params[s->param_offset[s->lvl]+1].v.s;
 	
-	if (!uri.params.len) return -1;
-	if (parse_params(&uri.params, CLASS_ANY, &h, &list)<0) return -1;
+	if (!res->len) return -1;
+	if (parse_params(res, CLASS_ANY, &h, &list)<0) return -1;
 	
 	for (p = list; p; p=p->next) {
 		if ((p->name.len==wanted->len) && 
@@ -973,3 +984,35 @@ int select_nameaddr_uri(str* res, select_t* s, struct sip_msg* msg)
 	res->len=p-res->s;
 	return 0;
 }
+
+int select_nameaddr_params(str* res, select_t* s, struct sip_msg* msg)
+{
+	char *p;
+	
+	p=find_not_quoted(res, '<');
+	if (!p) {
+		p=find_not_quoted(res, ';');
+	} else {
+		res->len=res->len - (p-res->s) -1;
+		res->s=p +1;
+		p=find_not_quoted(res, '>');
+		if (!p) {
+			ERR("select_nameaddr_params: no > found, invalid nameaddr value\n");
+			return -1;
+		}
+		res->len=res->len - (p-res->s) -1;
+		res->s=p +1;
+		
+		p=find_not_quoted(res, ';');
+	}
+	if (!p) return 1;
+	
+	res->len=res->len - (p-res->s) -1;
+	res->s=p +1;
+	
+	if (s->param_offset[s->lvl+1]-s->param_offset[s->lvl]==1)
+		return (res->len ? 0 : 1);
+
+	return select_any_params(res, s, msg);
+}
+

+ 8 - 1
select_core.h

@@ -90,10 +90,13 @@ SELECT_F(select_via_params_spec)
 
 SELECT_F(select_msgheader)
 SELECT_F(select_anyheader)
+SELECT_F(select_anyheader_params)
 
 SELECT_F(select_any_nameaddr)
 SELECT_F(select_nameaddr_name)
 SELECT_F(select_nameaddr_uri)
+SELECT_F(select_nameaddr_params)
+SELECT_F(select_any_params)
 	
 SELECT_F(select_any_uri)
 SELECT_F(select_uri_type)
@@ -187,10 +190,15 @@ static select_row_t select_core[] = {
 
 	{ select_any_nameaddr, SEL_PARAM_STR, STR_STATIC_INIT("name"), select_nameaddr_name, 0},
 	{ select_any_nameaddr, SEL_PARAM_STR, STR_STATIC_INIT("uri"), select_nameaddr_uri, 0},
+	{ select_any_nameaddr, SEL_PARAM_STR, STR_STATIC_INIT("params"), select_nameaddr_params, 0},
 	{ select_nameaddr_uri, SEL_PARAM_INT, STR_NULL, select_any_uri, NESTED},
+	{ select_nameaddr_params, SEL_PARAM_STR, STR_NULL, select_any_params, 0},
 
 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("msg"), select_msgheader, SEL_PARAM_EXPECTED},
 	{ select_msgheader, SEL_PARAM_STR, STR_NULL, select_anyheader, OPTIONAL | CONSUME_NEXT_INT | FIXUP_CALL},
+	{ select_anyheader, SEL_PARAM_STR, STR_STATIC_INIT("nameaddr"), select_any_nameaddr, NESTED | CONSUME_NEXT_STR},
+	{ select_anyheader, SEL_PARAM_STR, STR_STATIC_INIT("params"), select_anyheader_params, NESTED},
+	{ select_anyheader_params, SEL_PARAM_STR, STR_STATIC_INIT("params"), select_any_params, CONSUME_NEXT_STR},
 
 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("proxy_authorization"), select_auth, CONSUME_NEXT_STR | DIVERSION | SEL_AUTH_PROXY},
 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("authorization"), select_auth, CONSUME_NEXT_STR | DIVERSION | SEL_AUTH_WWW}, 
@@ -207,7 +215,6 @@ static select_row_t select_core[] = {
 	{ select_auth_username, SEL_PARAM_STR, STR_STATIC_INIT("user"), select_auth_username_comp, DIVERSION | SEL_AUTH_USER},
 	{ select_auth_username, SEL_PARAM_STR, STR_STATIC_INIT("domain"), select_auth_username_comp, DIVERSION | SEL_AUTH_DOMAIN},
 
-	{ select_anyheader, SEL_PARAM_STR, STR_STATIC_INIT("nameaddr"), select_any_nameaddr, NESTED | CONSUME_NEXT_STR},
 	{ NULL, SEL_PARAM_INT, STR_NULL, NULL, 0}
 };