mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-29 18:19:30 +00:00
ari: Add application/x-www-form-urlencoded parameter support
ARI POST calls only accept parameters via the URL's query string. While this works, it's atypical for HTTP API's in general, and specifically frowned upon with RESTful API's. This patch adds parsing for application/x-www-form-urlencoded request bodies if they are sent in with the request. Any variables parsed this way are prepended to the variable list supplied by the query string. (closes issue ASTERISK-22743) Review: https://reviewboard.asterisk.org/r/2986/ git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/12@402555 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
21
main/http.c
21
main/http.c
@@ -616,9 +616,13 @@ struct ast_variable *ast_http_get_post_vars(
|
||||
{
|
||||
int content_length = 0;
|
||||
struct ast_variable *v, *post_vars=NULL, *prev = NULL;
|
||||
char *buf, *var, *val;
|
||||
char *var, *val;
|
||||
RAII_VAR(char *, buf, NULL, ast_free_ptr);
|
||||
int res;
|
||||
|
||||
/* Use errno to distinguish errors from no params */
|
||||
errno = 0;
|
||||
|
||||
for (v = headers; v; v = v->next) {
|
||||
if (!strcasecmp(v->name, "Content-Type")) {
|
||||
if (strcasecmp(v->value, "application/x-www-form-urlencoded")) {
|
||||
@@ -640,22 +644,25 @@ struct ast_variable *ast_http_get_post_vars(
|
||||
}
|
||||
|
||||
if (content_length > MAX_POST_CONTENT - 1) {
|
||||
ast_log(LOG_WARNING, "Excessively long HTTP content. %d is greater than our max of %d\n",
|
||||
content_length, MAX_POST_CONTENT);
|
||||
ast_http_send(ser, AST_HTTP_POST, 413, "Request Entity Too Large", NULL, NULL, 0, 0);
|
||||
ast_log(LOG_WARNING,
|
||||
"Excessively long HTTP content. (%d > %d)\n",
|
||||
content_length, MAX_POST_CONTENT);
|
||||
errno = EFBIG;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
buf = ast_malloc(content_length + 1);
|
||||
if (!buf) {
|
||||
/* malloc sets errno to ENOMEM */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
res = fread(buf, 1, content_length, ser->f);
|
||||
if (res < content_length) {
|
||||
/* Error, distinguishable by ferror() or feof(), but neither
|
||||
* is good. */
|
||||
goto done;
|
||||
* is good. Treat either one as I/O error */
|
||||
errno = EIO;
|
||||
return NULL;
|
||||
}
|
||||
buf[content_length] = '\0';
|
||||
|
||||
@@ -677,8 +684,6 @@ struct ast_variable *ast_http_get_post_vars(
|
||||
}
|
||||
}
|
||||
|
||||
done:
|
||||
ast_free(buf);
|
||||
return post_vars;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user