diff --git a/conf/xml_cdr.conf.xml b/conf/xml_cdr.conf.xml
index ee4c2de19b..ec21415165 100644
--- a/conf/xml_cdr.conf.xml
+++ b/conf/xml_cdr.conf.xml
@@ -15,7 +15,10 @@
-
+
+
+
+
diff --git a/src/include/switch_utils.h b/src/include/switch_utils.h
index 244965ea29..21a5fbc82a 100644
--- a/src/include/switch_utils.h
+++ b/src/include/switch_utils.h
@@ -55,6 +55,8 @@ SWITCH_BEGIN_EXTERN_C
#define switch_is_file_path(file) ((*file == '/') || strstr(file, SWITCH_URL_SEPARATOR))
#endif
+SWITCH_DECLARE(switch_status_t) switch_b64_encode(unsigned char *in, switch_size_t ilen, unsigned char *out, switch_size_t olen);
+
static inline switch_bool_t switch_is_digit_string(const char *s) {
while(s && *s) {
diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c
index 5b43c63487..d72ea7b938 100644
--- a/src/mod/endpoints/mod_sofia/sofia.c
+++ b/src/mod/endpoints/mod_sofia/sofia.c
@@ -341,6 +341,7 @@ void *SWITCH_THREAD_FUNC sofia_profile_thread_run(switch_thread_t *thread, void
nua_set_params(profile->nua,
NUTAG_APPL_METHOD("OPTIONS"),
NUTAG_APPL_METHOD("NOTIFY"),
+ NUTAG_APPL_METHOD("INFO"),
//NUTAG_EARLY_MEDIA(1),
NUTAG_AUTOANSWER(0),
NUTAG_AUTOALERT(0),
diff --git a/src/mod/xml_int/mod_xml_cdr/mod_xml_cdr.c b/src/mod/xml_int/mod_xml_cdr/mod_xml_cdr.c
index cd0f34b7c1..da77e950e4 100644
--- a/src/mod/xml_int/mod_xml_cdr/mod_xml_cdr.c
+++ b/src/mod/xml_int/mod_xml_cdr/mod_xml_cdr.c
@@ -43,6 +43,7 @@ static struct {
uint32_t retries;
uint32_t shutdown;
uint32_t ignore_cacert_check;
+ int encode;
} globals;
SWITCH_MODULE_LOAD_FUNCTION(mod_xml_cdr_load);
@@ -81,9 +82,6 @@ static switch_status_t my_on_hangup(switch_core_session_t *session)
goto error;
}
- /* do we log to the disk no matter what? */
- /* all previous functionality is retained */
-
if (!(logdir = switch_channel_get_variable(channel, "xml_cdr_base"))) {
logdir = globals.log_dir;
}
@@ -111,15 +109,23 @@ static switch_status_t my_on_hangup(switch_core_session_t *session)
/* try to post it to the web server */
if (!switch_strlen_zero(globals.url)) {
curl_handle = curl_easy_init();
+
+ if (globals.encode) {
+ switch_size_t need_bytes = strlen(xml_text) * 3;
- xml_text_escaped = curl_easy_escape(curl_handle, (const char*) xml_text, (int)strlen(xml_text));
-
- if (switch_strlen_zero(xml_text_escaped)) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Memory Error!\n");
- goto error;
- }
-
- if (!(curl_xml_text = switch_mprintf("cdr=%s", xml_text_escaped))) {
+ xml_text_escaped = malloc(need_bytes);
+ assert(xml_text_escaped);
+ memset(xml_text_escaped, 0, sizeof(xml_text_escaped));
+ if (globals.encode == 1) {
+ switch_url_encode(xml_text, xml_text_escaped, need_bytes - 1);
+ } else {
+ switch_b64_encode((unsigned char *)xml_text, need_bytes / 3, (unsigned char *)xml_text_escaped, need_bytes);
+ }
+ switch_safe_free(xml_text);
+ xml_text = xml_text_escaped;
+ }
+
+ if (!(curl_xml_text = switch_mprintf("cdr=%s", xml_text))) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Memory Error!\n");
goto error;
}
@@ -193,9 +199,8 @@ error:
curl_easy_cleanup(curl_handle);
}
switch_safe_free(curl_xml_text);
- switch_safe_free(xml_text_escaped);
- switch_safe_free(path);
switch_safe_free(xml_text);
+ switch_safe_free(path);
switch_xml_free(cdr);
return status;
@@ -241,6 +246,12 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_xml_cdr_load)
globals.url = strdup(val);
} else if (!strcasecmp(var, "delay")) {
globals.delay = (uint32_t) atoi(val);
+ } else if (!strcasecmp(var, "encode")) {
+ if (!strcasecmp(val, "base64")) {
+ globals.encode = 2;
+ } else {
+ globals.encode = switch_true(val);
+ }
} else if (!strcasecmp(var, "retries")) {
globals.retries = (uint32_t) atoi(val);
} else if (!strcasecmp(var, "log-dir")) {
@@ -286,7 +297,9 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_xml_cdr_load)
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "retries set but delay 0 setting to 5000ms\n");
globals.delay = 5000;
}
-
+
+ globals.retries++;
+
switch_xml_free(xml);
return status;
}
diff --git a/src/switch_utils.c b/src/switch_utils.c
index 71c841de49..0287eede17 100644
--- a/src/switch_utils.c
+++ b/src/switch_utils.c
@@ -34,6 +34,40 @@
#include
#endif
+static const char switch_b64_table[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+#define B64BUFFLEN 1024
+SWITCH_DECLARE(switch_status_t) switch_b64_encode(unsigned char *in, switch_size_t ilen, unsigned char *out, switch_size_t olen)
+{
+ int y = 0, bytes = 0;
+ size_t x = 0;
+ unsigned int b = 0,l = 0;
+
+ for(x = 0; x < ilen; x++) {
+ b = (b<<8) + in[x];
+ l += 8;
+ while (l >= 6) {
+ out[bytes++] = switch_b64_table[(b>>(l-=6))%64];
+ if(++y != 72) {
+ continue;
+ }
+ //out[bytes++] = '\n';
+ y=0;
+ }
+ }
+
+ if (l > 0) {
+ out[bytes++] = switch_b64_table[((b%16)<<(6-l))%64];
+ }
+ if (l != 0) {
+ while (l < 6) {
+ out[bytes++] = '=', l += 2;
+ }
+ }
+
+ return SWITCH_STATUS_SUCCESS;
+}
+
+
SWITCH_DECLARE(switch_status_t) switch_find_local_ip(char *buf, int len, int family)
{
switch_status_t status = SWITCH_STATUS_FALSE;