Prechádzať zdrojové kódy

uri.params.XXXX now acceped and returns value of that parameter, or empty string flag if param without value is present.
fixed param_offset and lvl values at the time of FIXUP_CALL

Michal Matyska 19 rokov pred
rodič
commit
1ee35cdcef
3 zmenil súbory, kde vykonal 45 pridanie a 16 odobranie
  1. 30 13
      select.c
  2. 14 2
      select_core.c
  3. 1 1
      select_core.h

+ 30 - 13
select.c

@@ -86,18 +86,34 @@ int w_parse_select(char**p, select_t* sel)
 		sel->n++;
 		if (*(*p)=='[') {
 			(*p)++; 
-			name.s=(*p);
-			if (*(*p)=='-') (*p)++;
-			while (isdigit(*(*p))) (*p)++;
-			name.len=(*p)-name.s;
-			if (*(*p)!=']') {
-				ERR("parse_select: invalid index, no closing ]\n");
-				goto error;
-			};
-			(*p)++;
-			sel->params[sel->n].type=SEL_PARAM_INT;
-			sel->params[sel->n].v.i=atoi(name.s);
-			DBG("parse_select: part %d: [%d]\n", sel->n, sel->params[sel->n].v.i);
+			if (*(*p)=='"') {
+				(*p)++;	
+				name.s=(*p);
+				while (*(*p)!='"') (*p)++;
+				name.len=(*p)-name.s;
+				(*p)++;
+				if (*(*p)!=']') {
+					ERR("parse_select: invalid string index, no closing ]\n");
+					goto error;
+				};
+				(*p)++;
+				sel->params[sel->n].type=SEL_PARAM_STR;
+				sel->params[sel->n].v.s=name;
+				DBG("parse_select: part %d: [\"%.*s\"]\n", sel->n, sel->params[sel->n].v.s.len, sel->params[sel->n].v.s.s);
+			} else {
+				name.s=(*p);
+				if (*(*p)=='-') (*p)++;
+				while (isdigit(*(*p))) (*p)++;
+				name.len=(*p)-name.s;
+				if (*(*p)!=']') {
+					ERR("parse_select: invalid index, no closing ]\n");
+					goto error;
+				};
+				(*p)++;
+				sel->params[sel->n].type=SEL_PARAM_INT;
+				sel->params[sel->n].v.i=atoi(name.s);
+				DBG("parse_select: part %d: [%d]\n", sel->n, sel->params[sel->n].v.i);
+			}
 			sel->n++;
 		}
 		if (*(*p)!='.') break;
@@ -246,7 +262,6 @@ int resolve_select(select_t* s)
 
 		if (t->table[table_idx].flags & NESTED) {
 			if (nested < MAX_NESTED_CALLS-1) { /* need space for final function */
-				s->lvl = nested;
 				s->f[nested++] = f;
 				s->param_offset[nested] = param_idx;
 			} else {
@@ -258,6 +273,8 @@ int resolve_select(select_t* s)
 		}
 
 		if (t->table[table_idx].flags & FIXUP_CALL) {
+			s->lvl = nested;
+			s->param_offset[nested+1] = param_idx;
 			if (t->table[table_idx].new_f(NULL, s, NULL)<0) goto not_found;
 		}
 

+ 14 - 2
select_core.c

@@ -652,6 +652,17 @@ int select_uri_params(str* res, select_t* s, struct sip_msg* msg)
 	param_hooks_t h;
 	param_t *p, *list=NULL;
 	str* wanted;
+	int i;
+
+	if (!msg || !res) {
+		if (s->param_offset[s->lvl+1]-s->param_offset[s->lvl]==1) return 0;
+		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;
+		for (i=0; i<wanted->len; i++) 
+			if (wanted->s[i]=='_') 
+				wanted->s[i]='-';
+		return 0;
+	}
 	
 	if (parse_uri(res->s, res->len, &uri)<0)
 		return -1;
@@ -662,11 +673,12 @@ int select_uri_params(str* res, select_t* s, struct sip_msg* msg)
 	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;
 	
-	for (p = list; p->next; p=p->next) {
+	for (p = list; p; p=p->next) {
 		if ((p->name.len==wanted->len) && 
-			 !strncmp(p->name.s, wanted->s,wanted->len)) {
+			 !strncasecmp(p->name.s, wanted->s,wanted->len)) {
 			*res=p->body;
 			free_params(list);
 			return (res->len ? 0 : 1);

+ 1 - 1
select_core.h

@@ -168,7 +168,7 @@ static select_row_t select_core[] = {
 	{ select_any_uri, SEL_PARAM_STR, STR_STATIC_INIT("pwd"), select_uri_pwd, 0},
 	{ select_any_uri, SEL_PARAM_STR, STR_STATIC_INIT("host"), select_uri_host, 0},
 	{ select_any_uri, SEL_PARAM_STR, STR_STATIC_INIT("port"), select_uri_port, 0},
-	{ select_any_uri, SEL_PARAM_STR, STR_STATIC_INIT("params"), select_uri_params, CONSUME_NEXT_STR | OPTIONAL},
+	{ select_any_uri, SEL_PARAM_STR, STR_STATIC_INIT("params"), select_uri_params, CONSUME_NEXT_STR | OPTIONAL | FIXUP_CALL },
 	{ select_any_uri, SEL_PARAM_STR, STR_STATIC_INIT("hostport"), select_uri_hostport, 0},
 
 	{ NULL, SEL_PARAM_STR, STR_STATIC_INIT("event"), select_event, 0},