xref: /plan9/sys/src/libhttpd/query.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
180ee5cbfSDavid du Colombier #include <u.h>
280ee5cbfSDavid du Colombier #include <libc.h>
380ee5cbfSDavid du Colombier #include <httpd.h>
480ee5cbfSDavid du Colombier 
580ee5cbfSDavid du Colombier /*
680ee5cbfSDavid du Colombier  * parse a search string of the form
780ee5cbfSDavid du Colombier  * tag=val&tag1=val1...
880ee5cbfSDavid du Colombier  */
980ee5cbfSDavid du Colombier HSPairs*
hparsequery(HConnect * c,char * search)1080ee5cbfSDavid du Colombier hparsequery(HConnect *c, char *search)
1180ee5cbfSDavid du Colombier {
1280ee5cbfSDavid du Colombier 	HSPairs *q;
1380ee5cbfSDavid du Colombier 	char *tag, *val, *s;
1480ee5cbfSDavid du Colombier 
1580ee5cbfSDavid du Colombier 	while((s = strchr(search, '?')) != nil)
1680ee5cbfSDavid du Colombier 		search = s + 1;
17*9a747e4fSDavid du Colombier 	s = search;
18*9a747e4fSDavid du Colombier 	while((s = strchr(s, '+')) != nil)
19*9a747e4fSDavid du Colombier 		*s++ = ' ';
2080ee5cbfSDavid du Colombier 	q = nil;
2180ee5cbfSDavid du Colombier 	while(*search){
2280ee5cbfSDavid du Colombier 		tag = search;
2380ee5cbfSDavid du Colombier 		while(*search != '='){
2480ee5cbfSDavid du Colombier 			if(*search == '\0')
2580ee5cbfSDavid du Colombier 				return q;
2680ee5cbfSDavid du Colombier 			search++;
2780ee5cbfSDavid du Colombier 		}
2880ee5cbfSDavid du Colombier 		*search++ = 0;
2980ee5cbfSDavid du Colombier 		val = search;
3080ee5cbfSDavid du Colombier 		while(*search != '&'){
3180ee5cbfSDavid du Colombier 			if(*search == '\0')
3280ee5cbfSDavid du Colombier 				return hmkspairs(c, hurlunesc(c, tag), hurlunesc(c, val), q);
3380ee5cbfSDavid du Colombier 			search++;
3480ee5cbfSDavid du Colombier 		}
3580ee5cbfSDavid du Colombier 		*search++ = '\0';
3680ee5cbfSDavid du Colombier 		q = hmkspairs(c, hurlunesc(c, tag), hurlunesc(c, val), q);
3780ee5cbfSDavid du Colombier 	}
3880ee5cbfSDavid du Colombier 	return q;
3980ee5cbfSDavid du Colombier }
40