]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-10552 #resolve
authorSeven Du <dujinfang@x-y-t.cn>
Fri, 28 Jul 2017 02:10:23 +0000 (10:10 +0800)
committerSeven Du <dujinfang@x-y-t.cn>
Fri, 28 Jul 2017 02:11:06 +0000 (10:11 +0800)
src/mod/applications/mod_curl/mod_curl.c

index 72996d52b989c828eb96013bb923d2143012914f..1ad435e2c2e1f47e832a1fc6f483b4f5f0700314 100644 (file)
@@ -50,10 +50,11 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_curl_load);
  */
 SWITCH_MODULE_DEFINITION(mod_curl, mod_curl_load, mod_curl_shutdown, NULL);
 
-static char *SYNTAX = "curl url [headers|json|content-type <mime-type>|connect-timeout <seconds>|timeout <seconds>] [get|head|post|delete|put [data]]";
+static char *SYNTAX = "curl url [headers|json|content-type <mime-type>|connect-timeout <seconds>|timeout <seconds>|append_headers <header_name:header_value>[|append_headers <header_name:header_value>]] [get|head|post|delete|put [data]]";
 
 #define HTTP_SENDFILE_ACK_EVENT "curl_sendfile::ack"
 #define HTTP_SENDFILE_RESPONSE_SIZE 32768
+#define HTTP_MAX_APPEND_HEADERS 10
 
 static struct {
        switch_memory_pool_t *pool;
@@ -160,7 +161,7 @@ static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream)
        return ncur;
 }
 
-static http_data_t *do_lookup_url(switch_memory_pool_t *pool, const char *url, const char *method, const char *data, const char *content_type, curl_options_t *options)
+static http_data_t *do_lookup_url(switch_memory_pool_t *pool, const char *url, const char *method, const char *data, const char *content_type, char *append_headers[], curl_options_t *options)
 {
        switch_CURL *curl_handle = NULL;
        long httpRes = 0;
@@ -197,6 +198,16 @@ static http_data_t *do_lookup_url(switch_memory_pool_t *pool, const char *url, c
                switch_curl_easy_setopt(curl_handle, CURLOPT_SSL_VERIFYPEER, 0);
                switch_curl_easy_setopt(curl_handle, CURLOPT_SSL_VERIFYHOST, 0);
        }
+
+       if (append_headers) {
+               int ah_index = 0;
+               while(append_headers[ah_index] && *append_headers[ah_index]) {
+                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "CURL append_header_%d: %s\n", ah_index, append_headers[ah_index]);
+                       headers = switch_curl_slist_append(headers, append_headers[ah_index]);
+                       ah_index++;
+               }
+       }
+
        if (!strcasecmp(method, "head")) {
                switch_curl_easy_setopt(curl_handle, CURLOPT_NOBODY, 1);
        } else if (!strcasecmp(method, "post")) {
@@ -205,7 +216,6 @@ static http_data_t *do_lookup_url(switch_memory_pool_t *pool, const char *url, c
                if (content_type) {
                        char *ct = switch_mprintf("Content-Type: %s", content_type);
                        headers = switch_curl_slist_append(headers, ct);
-                       switch_curl_easy_setopt(curl_handle, CURLOPT_HTTPHEADER, headers);
                        switch_safe_free(ct);
                }
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Post data: %s\n", data);
@@ -216,7 +226,6 @@ static http_data_t *do_lookup_url(switch_memory_pool_t *pool, const char *url, c
                if (content_type) {
                        char *ct = switch_mprintf("Content-Type: %s", content_type);
                        headers = switch_curl_slist_append(headers, ct);
-                       switch_curl_easy_setopt(curl_handle, CURLOPT_HTTPHEADER, headers);
                        switch_safe_free(ct);
                }
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "DELETE data: %s\n", data);
@@ -231,13 +240,17 @@ static http_data_t *do_lookup_url(switch_memory_pool_t *pool, const char *url, c
                        char *ct = switch_mprintf("Content-Type: %s", content_type);
                        headers = switch_curl_slist_append(headers, ct);
                        headers = switch_curl_slist_append(headers, "Expect:");
-                       switch_curl_easy_setopt(curl_handle, CURLOPT_HTTPHEADER, headers);
                        switch_safe_free(ct);
                }
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "PUT data: %s\n", data);
        } else {
                switch_curl_easy_setopt(curl_handle, CURLOPT_HTTPGET, 1);
        }
+
+       if (headers) {
+               switch_curl_easy_setopt(curl_handle, CURLOPT_HTTPHEADER, headers);
+       }
+
        switch_curl_easy_setopt(curl_handle, CURLOPT_FOLLOWLOCATION, 1);
        switch_curl_easy_setopt(curl_handle, CURLOPT_MAXREDIRS, 15);
        switch_curl_easy_setopt(curl_handle, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
@@ -787,6 +800,8 @@ SWITCH_STANDARD_APP(curl_app_function)
        int i = 0;
        curl_options_t options = { 0 };
        const char *curl_timeout;
+       char *append_headers[HTTP_MAX_APPEND_HEADERS + 1] = { 0 };
+       int ah_index = 0;
 
        if (!(mydata = switch_core_session_strdup(session, data))) {
                return;
@@ -826,7 +841,9 @@ SWITCH_STANDARD_APP(curl_app_function)
                                method = "put";
                                if (++i < argc) {
                                        postdata = switch_core_strdup(pool, argv[i]);
+                                       printf("DDDD [%s]\n", postdata);
                                        switch_url_decode(postdata);
+                                       printf("DDDD [%s]\n", postdata);
                                } else {
                                        postdata = "";
                                }
@@ -834,6 +851,11 @@ SWITCH_STANDARD_APP(curl_app_function)
                                if (++i < argc) {
                                        content_type = switch_core_strdup(pool, argv[i]);
                                }
+                       } else if (!strcasecmp("append_headers", argv[i])) {
+                               if (++i < argc) {
+                                       if (ah_index == HTTP_MAX_APPEND_HEADERS) continue;
+                                       append_headers[ah_index++] = argv[i];
+                               }
                        }
                }
        }
@@ -847,7 +869,8 @@ SWITCH_STANDARD_APP(curl_app_function)
        if (curl_timeout) options.timeout = atoi(curl_timeout);
 
 
-       http_data = do_lookup_url(pool, url, method, postdata, content_type, &options);
+       http_data = do_lookup_url(pool, url, method, postdata, content_type, append_headers, &options);
+
        if (do_json) {
                switch_channel_set_variable(channel, "curl_response_data", print_json(pool, http_data));
        } else {
@@ -897,6 +920,8 @@ SWITCH_STANDARD_API(curl_function)
        switch_curl_slist_t *slist = NULL;
        http_data_t *http_data = NULL;
        int i = 0;
+       char *append_headers[HTTP_MAX_APPEND_HEADERS + 1] = { 0 };
+       int ah_index = 0;
 
        switch_memory_pool_t *pool = NULL;
        curl_options_t options = { 0 };
@@ -974,10 +999,15 @@ SWITCH_STANDARD_API(curl_function)
                                                switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_WARNING, "Invalid timeout!\n");
                                        }
                                }
+                       } else if (!strcasecmp("append_headers", argv[i])) {
+                               if (++i < argc) {
+                                       if (ah_index == HTTP_MAX_APPEND_HEADERS) continue;
+                                       append_headers[ah_index++] = argv[i];
+                               }
                        }
                }
 
-               http_data = do_lookup_url(pool, url, method, postdata, content_type, &options);
+               http_data = do_lookup_url(pool, url, method, postdata, content_type, append_headers, &options);
                if (do_json) {
                        stream->write_function(stream, "%s", print_json(pool, http_data));
                } else {