|
|
|
@ -99,6 +99,11 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
|
|
|
|
|
<para>Include header information in the result
|
|
|
|
|
(boolean)</para>
|
|
|
|
|
</enum>
|
|
|
|
|
<enum name="httpheader">
|
|
|
|
|
<para>Add HTTP header. Multiple calls add multiple headers.
|
|
|
|
|
Setting of any header will remove the default
|
|
|
|
|
"Content-Type application/x-www-form-urlencoded"</para>
|
|
|
|
|
</enum>
|
|
|
|
|
<enum name="httptimeout">
|
|
|
|
|
<para>For HTTP(S) URIs, number of seconds to wait for a
|
|
|
|
|
server response</para>
|
|
|
|
@ -159,7 +164,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
|
|
|
|
|
</syntax>
|
|
|
|
|
<description>
|
|
|
|
|
<para>Options may be set globally or per channel. Per-channel
|
|
|
|
|
settings will override global settings.</para>
|
|
|
|
|
settings will override global settings. Only HTTP headers are added instead of overriding</para>
|
|
|
|
|
</description>
|
|
|
|
|
<see-also>
|
|
|
|
|
<ref type="function">CURL</ref>
|
|
|
|
@ -221,6 +226,9 @@ static int parse_curlopt_key(const char *name, CURLoption *key, enum optiontype
|
|
|
|
|
if (!strcasecmp(name, "header")) {
|
|
|
|
|
*key = CURLOPT_HEADER;
|
|
|
|
|
*ot = OT_BOOLEAN;
|
|
|
|
|
} else if (!strcasecmp(name, "httpheader")) {
|
|
|
|
|
*key = CURLOPT_HTTPHEADER;
|
|
|
|
|
*ot = OT_STRING;
|
|
|
|
|
} else if (!strcasecmp(name, "proxy")) {
|
|
|
|
|
*key = CURLOPT_PROXY;
|
|
|
|
|
*ot = OT_STRING;
|
|
|
|
@ -390,16 +398,18 @@ yuck:
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Remove any existing entry */
|
|
|
|
|
/* Remove any existing entry, only http headers are left */
|
|
|
|
|
AST_LIST_LOCK(list);
|
|
|
|
|
AST_LIST_TRAVERSE_SAFE_BEGIN(list, cur, list) {
|
|
|
|
|
if (cur->key == new->key) {
|
|
|
|
|
AST_LIST_REMOVE_CURRENT(list);
|
|
|
|
|
free(cur);
|
|
|
|
|
break;
|
|
|
|
|
if (new->key != CURLOPT_HTTPHEADER) {
|
|
|
|
|
AST_LIST_TRAVERSE_SAFE_BEGIN(list, cur, list) {
|
|
|
|
|
if (cur->key == new->key) {
|
|
|
|
|
AST_LIST_REMOVE_CURRENT(list);
|
|
|
|
|
free(cur);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
AST_LIST_TRAVERSE_SAFE_END
|
|
|
|
|
}
|
|
|
|
|
AST_LIST_TRAVERSE_SAFE_END
|
|
|
|
|
|
|
|
|
|
/* Insert new entry */
|
|
|
|
|
ast_debug(1, "Inserting entry %p with key %d and value %p\n", new, new->key, new->value);
|
|
|
|
@ -605,6 +615,7 @@ static int acf_curl_helper(struct ast_channel *chan, const char *cmd, char *info
|
|
|
|
|
);
|
|
|
|
|
CURL **curl;
|
|
|
|
|
struct curl_settings *cur;
|
|
|
|
|
struct curl_slist *headers = NULL;
|
|
|
|
|
struct ast_datastore *store = NULL;
|
|
|
|
|
int hashcompat = 0;
|
|
|
|
|
AST_LIST_HEAD(global_curl_info, curl_settings) *list = NULL;
|
|
|
|
@ -650,6 +661,8 @@ static int acf_curl_helper(struct ast_channel *chan, const char *cmd, char *info
|
|
|
|
|
AST_LIST_TRAVERSE(&global_curl_info, cur, list) {
|
|
|
|
|
if (cur->key == CURLOPT_SPECIAL_HASHCOMPAT) {
|
|
|
|
|
hashcompat = (long) cur->value;
|
|
|
|
|
} else if (cur->key == CURLOPT_HTTPHEADER) {
|
|
|
|
|
headers = curl_slist_append(headers, (char*) cur->value);
|
|
|
|
|
} else {
|
|
|
|
|
curl_easy_setopt(*curl, cur->key, cur->value);
|
|
|
|
|
}
|
|
|
|
@ -666,6 +679,8 @@ static int acf_curl_helper(struct ast_channel *chan, const char *cmd, char *info
|
|
|
|
|
AST_LIST_TRAVERSE(list, cur, list) {
|
|
|
|
|
if (cur->key == CURLOPT_SPECIAL_HASHCOMPAT) {
|
|
|
|
|
hashcompat = (long) cur->value;
|
|
|
|
|
} else if (cur->key == CURLOPT_HTTPHEADER) {
|
|
|
|
|
headers = curl_slist_append(headers, (char*) cur->value);
|
|
|
|
|
} else {
|
|
|
|
|
curl_easy_setopt(*curl, cur->key, cur->value);
|
|
|
|
|
}
|
|
|
|
@ -681,6 +696,10 @@ static int acf_curl_helper(struct ast_channel *chan, const char *cmd, char *info
|
|
|
|
|
curl_easy_setopt(*curl, CURLOPT_POSTFIELDS, args.postdata);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (headers) {
|
|
|
|
|
curl_easy_setopt(*curl, CURLOPT_HTTPHEADER, headers);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Temporarily assign a buffer for curl to write errors to. */
|
|
|
|
|
curl_errbuf[0] = curl_errbuf[CURL_ERROR_SIZE] = '\0';
|
|
|
|
|
curl_easy_setopt(*curl, CURLOPT_ERRORBUFFER, curl_errbuf);
|
|
|
|
@ -698,6 +717,7 @@ static int acf_curl_helper(struct ast_channel *chan, const char *cmd, char *info
|
|
|
|
|
if (store) {
|
|
|
|
|
AST_LIST_UNLOCK(list);
|
|
|
|
|
}
|
|
|
|
|
curl_slist_free_all(headers);
|
|
|
|
|
|
|
|
|
|
if (args.postdata) {
|
|
|
|
|
curl_easy_setopt(*curl, CURLOPT_POST, 0);
|
|
|
|
@ -781,6 +801,7 @@ static struct ast_custom_function acf_curlopt = {
|
|
|
|
|
" ftptext - For FTP, force a text transfer (boolean)\n"
|
|
|
|
|
" ftptimeout - For FTP, the server response timeout\n"
|
|
|
|
|
" header - Retrieve header information (boolean)\n"
|
|
|
|
|
" httpheader - Add new custom http header (string)\n"
|
|
|
|
|
" httptimeout - Number of seconds to wait for HTTP response\n"
|
|
|
|
|
" maxredirs - Maximum number of redirects to follow\n"
|
|
|
|
|
" proxy - Hostname or IP to use as a proxy\n"
|
|
|
|
|