diff options
| author | Lukas Fleischer <lfleischer@lfos.de> | 2016-09-29 08:38:45 +0200 | 
|---|---|---|
| committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2016-10-01 21:19:38 +0200 | 
| commit | 927b0ae30c84fbfce877e35415681dce6eba0229 (patch) | |
| tree | be0b56a1b2ecf4bcc767bd927c779c62e38fed2b | |
| parent | ui-tree: remove a fixed size buffer (diff) | |
| download | cgit-927b0ae30c84fbfce877e35415681dce6eba0229.tar.gz cgit-927b0ae30c84fbfce877e35415681dce6eba0229.tar.bz2 cgit-927b0ae30c84fbfce877e35415681dce6eba0229.zip | |
Simplify http_parse_querystring()
Instead of reimplementing URL parameter parsing from scratch, use
url_decode_parameter_name() and url_decode_parameter_value() which are
already provided by Git.
Also, change the return type of http_parse_querystring() to void since
its only caller already ignores the return value.
Signed-off-by: Lukas Fleischer <lfleischer@lfos.de>
| -rw-r--r-- | html.c | 66 | ||||
| -rw-r--r-- | html.h | 2 | 
2 files changed, 11 insertions, 57 deletions
| @@ -8,6 +8,7 @@  #include "cgit.h"  #include "html.h" +#include "url.h"  /* Percent-encoding of each character, except: a-zA-Z0-9!$()*,./:;@- */  static const char* url_escape_table[256] = { @@ -337,64 +338,17 @@ int html_include(const char *filename)  	return 0;  } -static int hextoint(char c) +void http_parse_querystring(const char *txt, void (*fn)(const char *name, const char *value))  { -	if (c >= 'a' && c <= 'f') -		return 10 + c - 'a'; -	else if (c >= 'A' && c <= 'F') -		return 10 + c - 'A'; -	else if (c >= '0' && c <= '9') -		return c - '0'; -	else -		return -1; -} - -static char *convert_query_hexchar(char *txt) -{ -	int d1, d2, n; -	n = strlen(txt); -	if (n < 3) { -		*txt = '\0'; -		return txt-1; -	} -	d1 = hextoint(*(txt + 1)); -	d2 = hextoint(*(txt + 2)); -	if (d1 < 0 || d2 < 0) { -		memmove(txt, txt + 3, n - 2); -		return txt-1; -	} else { -		*txt = d1 * 16 + d2; -		memmove(txt + 1, txt + 3, n - 2); -		return txt; -	} -} - -int http_parse_querystring(const char *txt_, void (*fn)(const char *name, const char *value)) -{ -	char *o, *t, *txt, *value = NULL, c; - -	if (!txt_) -		return 0; +	const char *t = txt; -	o = t = txt = xstrdup(txt_); -	while ((c=*t) != '\0') { -		if (c == '=') { -			*t = '\0'; -			value = t + 1; -		} else if (c == '+') { -			*t = ' '; -		} else if (c == '%') { -			t = convert_query_hexchar(t); -		} else if (c == '&') { -			*t = '\0'; -			(*fn)(txt, value); -			txt = t + 1; -			value = NULL; +	while (t && *t) { +		char *name = url_decode_parameter_name(&t); +		if (*name) { +			char *value = url_decode_parameter_value(&t); +			fn(name, value); +			free(value);  		} -		t++; +		free(name);  	} -	if (t != txt) -		(*fn)(txt, value); -	free(o); -	return 0;  } @@ -32,6 +32,6 @@ extern void html_link_close(void);  extern void html_fileperm(unsigned short mode);  extern int html_include(const char *filename); -extern int http_parse_querystring(const char *txt, void (*fn)(const char *name, const char *value)); +extern void http_parse_querystring(const char *txt, void (*fn)(const char *name, const char *value));  #endif /* HTML_H */ | 
