make encoding optional none, base64 or url encoding
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@5823 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
parent
d484959bc9
commit
7962945c39
|
@ -15,7 +15,10 @@
|
|||
<!-- optional: if not present we do not log every record to disk -->
|
||||
<!-- either an absolute path, a relative path assuming ${prefix}/logs or a blank value will default to ${prefix}/logs/xml_cdr -->
|
||||
<param name="log-dir" value=""/>
|
||||
|
||||
|
||||
<!-- encode the post data may be 'true' for url encoding, 'false' for no encoding or 'base64' for base64 encoding -->
|
||||
<!--<param name="encode" value="true"/>-->
|
||||
|
||||
<!-- optional: full path to the error log dir for failed web posts if not specified its the same as log-dir -->
|
||||
<!-- either an absolute path, a relative path assuming ${prefix}/logs or a blank or omitted value will default to ${prefix}/logs/xml_cdr -->
|
||||
<!-- <param name="err-log-dir" value="/tmp"/> -->
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -34,6 +34,40 @@
|
|||
#include <arpa/inet.h>
|
||||
#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;
|
||||
|
|
Loading…
Reference in New Issue