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;