]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
make encoding optional none, base64 or url encoding
authorAnthony Minessale <anthony.minessale@gmail.com>
Sat, 6 Oct 2007 00:30:04 +0000 (00:30 +0000)
committerAnthony Minessale <anthony.minessale@gmail.com>
Sat, 6 Oct 2007 00:30:04 +0000 (00:30 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@5823 d0543943-73ff-0310-b7d9-9358b9ac24b2

conf/xml_cdr.conf.xml
src/include/switch_utils.h
src/mod/endpoints/mod_sofia/sofia.c
src/mod/xml_int/mod_xml_cdr/mod_xml_cdr.c
src/switch_utils.c

index ee4c2de19ba6f7620d6eed7454e8afdb038c2a25..ec214151656b146675dcad2721bc4abb66b57010 100644 (file)
     <!-- optional: if not present we do not log every record to disk -->\r
     <!-- either an absolute path, a relative path assuming ${prefix}/logs or a blank value will default to ${prefix}/logs/xml_cdr -->\r
     <param name="log-dir" value=""/>\r
-\r
+    \r
+    <!-- encode the post data may be 'true' for url encoding, 'false' for no encoding or 'base64' for base64 encoding -->\r
+    <!--<param name="encode" value="true"/>-->\r
+    \r
     <!-- optional: full path to the error log dir for failed web posts if not specified its the same as log-dir -->\r
     <!-- either an absolute path, a relative path assuming ${prefix}/logs or a blank or omitted value will default to ${prefix}/logs/xml_cdr -->\r
     <!-- <param name="err-log-dir" value="/tmp"/> -->\r
index 244965ea2981e8f0dbbe7e1f073d7778f5e0ced4..21a5fbc82a05c3fbb4ef583c468d0a818e3ae50c 100644 (file)
@@ -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) {
index 5b43c634877569f7d4ca2097886969e087571645..d72ea7b9380596235e3634e258838af6d0684ae1 100644 (file)
@@ -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),
index cd0f34b7c1976d6160cd79c2ce5e8d2898ec1da2..da77e950e45dd906bbe1c0394d4d974b20c2f04a 100644 (file)
@@ -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();
-
-                       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))) {
+                       
+                       if (globals.encode) {
+                               switch_size_t need_bytes = strlen(xml_text) * 3;
+
+                               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;
 }
index 71c841de499bdc510e13c52a812b7205ecab1236..0287eede1782ceadb8c1ee65c06753e94bd4c08f 100644 (file)
 #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;