[asterisk-commits] rizzo: trunk r117295 - /trunk/main/http.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Tue May 20 12:48:44 CDT 2008


Author: rizzo
Date: Tue May 20 12:48:43 2008
New Revision: 117295

URL: http://svn.digium.com/view/asterisk?view=rev&rev=117295
Log:
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.


Modified:
    trunk/main/http.c

Modified: trunk/main/http.c
URL: http://svn.digium.com/view/asterisk/trunk/main/http.c?view=diff&rev=117295&r1=117294&r2=117295
==============================================================================
--- trunk/main/http.c (original)
+++ trunk/main/http.c Tue May 20 12:48:43 2008
@@ -370,6 +370,20 @@
 	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 @@
 	if (method == AST_HTTP_GET) {
 		strsep(&params, "?");
 		
-		/* 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(&params, "&"))) {
 				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 @@
 	}
 
 	/*
-	 * 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 @@
 	}
 	*cookies = NULL;
 
-	ast_uri_decode(uri);
+	http_decode(uri);
 
 	AST_RWLIST_RDLOCK(&uri_redirects);
 	AST_RWLIST_TRAVERSE(&uri_redirects, redirect, entry) {




More information about the asterisk-commits mailing list