diff --git a/conf/vanilla/autoload_configs/curl.conf.xml b/conf/vanilla/autoload_configs/curl.conf.xml
new file mode 100644
index 0000000000..eff3c6b9ac
--- /dev/null
+++ b/conf/vanilla/autoload_configs/curl.conf.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/src/mod/applications/mod_curl/conf/autoload_configs/curl.conf.xml b/src/mod/applications/mod_curl/conf/autoload_configs/curl.conf.xml
new file mode 100644
index 0000000000..eff3c6b9ac
--- /dev/null
+++ b/src/mod/applications/mod_curl/conf/autoload_configs/curl.conf.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/src/mod/applications/mod_curl/mod_curl.c b/src/mod/applications/mod_curl/mod_curl.c
index 2438490432..e82502cb6c 100644
--- a/src/mod/applications/mod_curl/mod_curl.c
+++ b/src/mod/applications/mod_curl/mod_curl.c
@@ -55,11 +55,20 @@ static char *SYNTAX = "curl url [headers|json|content-type |connect-t
#define HTTP_SENDFILE_ACK_EVENT "curl_sendfile::ack"
#define HTTP_SENDFILE_RESPONSE_SIZE 32768
#define HTTP_MAX_APPEND_HEADERS 10
+#define HTTP_DEFAULT_MAX_BYTES 64000
static struct {
switch_memory_pool_t *pool;
+ switch_event_node_t *node;
+ int max_bytes;
} globals;
+static switch_xml_config_item_t instructions[] = {
+ /* parameter name type reloadable pointer default value options structure */
+ SWITCH_CONFIG_ITEM("max-bytes", SWITCH_CONFIG_INT, CONFIG_RELOADABLE, &globals.max_bytes, (void *) HTTP_DEFAULT_MAX_BYTES, NULL,NULL, NULL),
+ SWITCH_CONFIG_ITEM_END()
+};
+
typedef enum {
CSO_NONE = (1 << 0),
CSO_EVENT = (1 << 1),
@@ -173,7 +182,7 @@ static http_data_t *do_lookup_url(switch_memory_pool_t *pool, const char *url, c
memset(http_data, 0, sizeof(http_data_t));
http_data->pool = pool;
- http_data->max_bytes = 64000;
+ http_data->max_bytes = globals.max_bytes;
SWITCH_STANDARD_STREAM(http_data->stream);
if (!method) {
@@ -1037,24 +1046,44 @@ SWITCH_STANDARD_API(curl_function)
return status;
}
+static void do_config(switch_bool_t reload)
+{
+ globals.max_bytes = HTTP_DEFAULT_MAX_BYTES;
+
+ switch_xml_config_parse_module_settings("curl.conf", reload, instructions);
+}
+
+static void event_handler(switch_event_t *event)
+{
+ do_config(SWITCH_TRUE);
+}
+
/* Macro expands to: switch_status_t mod_cidlookup_load(switch_loadable_module_interface_t **module_interface, switch_memory_pool_t *pool) */
SWITCH_MODULE_LOAD_FUNCTION(mod_curl_load)
{
switch_api_interface_t *api_interface;
switch_application_interface_t *app_interface;
+ memset(&globals, 0, sizeof(globals));
+
if (switch_event_reserve_subclass(HTTP_SENDFILE_ACK_EVENT) != SWITCH_STATUS_SUCCESS) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't register subclass %s!\n", HTTP_SENDFILE_ACK_EVENT);
return SWITCH_STATUS_TERM;
}
+ if ((switch_event_bind_removable(modname, SWITCH_EVENT_RELOADXML, NULL, event_handler, NULL, &globals.node) != SWITCH_STATUS_SUCCESS)) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't bind event!\n");
+ switch_event_free_subclass(HTTP_SENDFILE_ACK_EVENT);
+ return SWITCH_STATUS_TERM;
+ }
+
/* connect my internal structure to the blank pointer passed to me */
*module_interface = switch_loadable_module_create_module_interface(pool, modname);
- memset(&globals, 0, sizeof(globals));
-
globals.pool = pool;
+ do_config(SWITCH_FALSE);
+
SWITCH_ADD_API(api_interface, "curl", "curl API", curl_function, SYNTAX);
SWITCH_ADD_APP(app_interface, "curl", "Perform a http request", "Perform a http request",
curl_app_function, SYNTAX, SAF_SUPPORT_NOMEDIA | SAF_ROUTING_EXEC);
@@ -1074,6 +1103,10 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_curl_shutdown)
switch_event_free_subclass(HTTP_SENDFILE_ACK_EVENT);
+ switch_xml_config_cleanup(instructions);
+
+ switch_event_unbind(&globals.node);
+
/* Cleanup dynamically allocated config settings */
return SWITCH_STATUS_SUCCESS;
}