diff options
author | rizzo <rizzo@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-05-20 17:48:43 +0000 |
---|---|---|
committer | rizzo <rizzo@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-05-20 17:48:43 +0000 |
commit | 7fffc70e0c6ae73556b0e87edcc44842fe41e783 (patch) | |
tree | 012a5aa424bf400e1afbc389961c15bcdf1daebf /main/http.c | |
parent | 3120e6e452d23226fe3ae1eb945e6fcb4ab37c2e (diff) |
Document the possible presence of multiple variables with the
same name in http queries, which might confuse the manager.
Replace calls to ast_uri_decode() with a local function that also
replaces '+' with ' ', as this is the normal encoding for
spaces in http requests.
This allows passing cli commands to the manager through the
http interface.
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@117295 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'main/http.c')
-rw-r--r-- | main/http.c | 34 |
1 files changed, 27 insertions, 7 deletions
diff --git a/main/http.c b/main/http.c index 7dc46a3bc..5ab4d27ca 100644 --- a/main/http.c +++ b/main/http.c @@ -370,6 +370,20 @@ void ast_http_uri_unlink_all_with_key(const char *key) AST_RWLIST_TRAVERSE_SAFE_END } +/* + * Decode special characters in http uri. + * We have ast_uri_decode to handle %XX sequences, but spaces + * are encoded as a '+' so we need to replace them beforehand. + */ +static void http_decode(char *s) +{ + for (;*s; s++) { + if (*s == '+') + *s = ' '; + } + ast_uri_decode(s); +} + static struct ast_str *handle_uri(struct ast_tcptls_session_instance *ser, char *uri, enum ast_http_method method, int *status, char **title, int *contentlength, struct ast_variable **cookies, struct ast_variable *headers, unsigned int *static_content) @@ -387,18 +401,22 @@ static struct ast_str *handle_uri(struct ast_tcptls_session_instance *ser, char if (method == AST_HTTP_GET) { strsep(¶ms, "?"); - /* Extract arguments from the request and store them in variables. */ + /* Extract arguments from the request and store them in variables. + * Note that a request can have multiple arguments with the same + * name, and we store them all in the list of variables. + * It is up to the application to handle multiple values. + */ if (params) { char *var, *val; while ((val = strsep(¶ms, "&"))) { var = strsep(&val, "="); if (val) { - ast_uri_decode(val); + http_decode(val); } else { val = ""; } - ast_uri_decode(var); + http_decode(var); if ((v = ast_variable_new(var, val, ""))) { if (vars) { prev->next = v; @@ -412,9 +430,11 @@ static struct ast_str *handle_uri(struct ast_tcptls_session_instance *ser, char } /* - * Append the cookies to the variables (the only reason to have them - * at the end is to avoid another pass of the cookies list to find - * the tail). + * Append the cookies to the list of variables. + * This saves a pass in the cookies list, but has the side effect + * that a variable might mask a cookie with the same name if the + * application stops at the first match. + * Note that this is the same behaviour as $_REQUEST variables in PHP. */ if (prev) { prev->next = *cookies; @@ -423,7 +443,7 @@ static struct ast_str *handle_uri(struct ast_tcptls_session_instance *ser, char } *cookies = NULL; - ast_uri_decode(uri); + http_decode(uri); AST_RWLIST_RDLOCK(&uri_redirects); AST_RWLIST_TRAVERSE(&uri_redirects, redirect, entry) { |