]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
buffer websocket headers and body before sending to avoid fragmentation
authorAnthony Minessale <anthm@freeswitch.org>
Wed, 16 Jul 2014 20:07:49 +0000 (01:07 +0500)
committerAnthony Minessale <anthm@freeswitch.org>
Wed, 16 Jul 2014 20:07:57 +0000 (01:07 +0500)
libs/sofia-sip/.update
libs/sofia-sip/libsofia-sip-ua/tport/ws.c
libs/sofia-sip/libsofia-sip-ua/tport/ws.h
src/mod/endpoints/mod_verto/ws.c
src/mod/endpoints/mod_verto/ws.h

index 1ff6ae92de869603a0d6dee3ff8eb4143fec2a69..09ad6c7180598d6e92e812de0547d8fa858f4e63 100644 (file)
@@ -1 +1 @@
-Sat Jul 12 04:39:49 CDT 2014
+Thu Jul 17 01:07:28 CDT 2014
index 0ee867dba52adab50842ab65efb0debb3bfcc502..3b152e4fec1eec0f35c978d268c420c253fbd2ef 100644 (file)
@@ -369,6 +369,7 @@ ssize_t ws_raw_write(wsh_t *wsh, void *data, size_t bytes)
 {
        size_t r;
        int sanity = 2000;
+       int ssl_err = 0;
 
        if (wsh->ssl) {
                do {
@@ -376,8 +377,17 @@ ssize_t ws_raw_write(wsh_t *wsh, void *data, size_t bytes)
                        if (sanity < 2000) {
                                ms_sleep(1);
                        }
-               } while (--sanity > 0 && r == -1 && SSL_get_error(wsh->ssl, r) == SSL_ERROR_WANT_WRITE);
 
+                       if (r == -1) {
+                               ssl_err = SSL_get_error(wsh->ssl, r);
+                       }
+
+               } while (--sanity > 0 && r == -1 && ssl_err == SSL_ERROR_WANT_WRITE);
+
+               if (ssl_err) {
+                       r = ssl_err * -1;
+               }
+               
                return r;
        }
 
@@ -570,6 +580,12 @@ void ws_destroy(wsh_t *wsh)
        
        wsh->down = 2;
 
+       if (wsh->write_buffer) {
+               free(wsh->write_buffer);
+               wsh->write_buffer = NULL;
+               wsh->write_buffer_len = 0;
+       }
+
        if (wsh->ssl) {
                int code;
                do {
@@ -818,6 +834,8 @@ ssize_t ws_write_frame(wsh_t *wsh, ws_opcode_t oc, void *data, size_t bytes)
 {
        uint8_t hdr[14] = { 0 };
        size_t hlen = 2;
+       uint8_t *bp;
+       ssize_t raw_ret = 0;
 
        if (wsh->down) {
                return -1;
@@ -848,12 +866,25 @@ ssize_t ws_write_frame(wsh_t *wsh, ws_opcode_t oc, void *data, size_t bytes)
                *u64 = htonl(bytes);
        }
 
-       if (ws_raw_write(wsh, (void *) &hdr[0], hlen) != (ssize_t)hlen) {
-               return -1;
+       if (wsh->write_buffer_len < (hlen + bytes + 1)) {
+               void *tmp;
+
+               wsh->write_buffer_len = hlen + bytes + 1;
+               if ((tmp = realloc(wsh->write_buffer, wsh->write_buffer_len))) {
+                       wsh->write_buffer = tmp;
+               } else {
+                       abort();
+               }
        }
+       
+       bp = (uint8_t *) wsh->write_buffer;
+       memcpy(bp, (void *) &hdr[0], hlen);
+       memcpy(bp + hlen, data, bytes);
+       
+       raw_ret = ws_raw_write(wsh, bp, (hlen + bytes));
 
-       if (ws_raw_write(wsh, data, bytes) != (ssize_t)bytes) {
-               return -2;
+       if (raw_ret != (ssize_t) (hlen + bytes)) {
+               return raw_ret;
        }
        
        return bytes;
index 699779b515536c9d477761bbd9170a7453c8cb49..b4d30b47f2e1ba49eaae3ce8b73e7c228b3a237f 100644 (file)
@@ -89,6 +89,8 @@ typedef struct wsh_s {
        int secure_established;
        int logical_established;
        int x;
+       void *write_buffer;
+       size_t write_buffer_len;
 } wsh_t;
 
 ssize_t ws_send_buf(wsh_t *wsh, ws_opcode_t oc);
index 0ee867dba52adab50842ab65efb0debb3bfcc502..3b152e4fec1eec0f35c978d268c420c253fbd2ef 100644 (file)
@@ -369,6 +369,7 @@ ssize_t ws_raw_write(wsh_t *wsh, void *data, size_t bytes)
 {
        size_t r;
        int sanity = 2000;
+       int ssl_err = 0;
 
        if (wsh->ssl) {
                do {
@@ -376,8 +377,17 @@ ssize_t ws_raw_write(wsh_t *wsh, void *data, size_t bytes)
                        if (sanity < 2000) {
                                ms_sleep(1);
                        }
-               } while (--sanity > 0 && r == -1 && SSL_get_error(wsh->ssl, r) == SSL_ERROR_WANT_WRITE);
 
+                       if (r == -1) {
+                               ssl_err = SSL_get_error(wsh->ssl, r);
+                       }
+
+               } while (--sanity > 0 && r == -1 && ssl_err == SSL_ERROR_WANT_WRITE);
+
+               if (ssl_err) {
+                       r = ssl_err * -1;
+               }
+               
                return r;
        }
 
@@ -570,6 +580,12 @@ void ws_destroy(wsh_t *wsh)
        
        wsh->down = 2;
 
+       if (wsh->write_buffer) {
+               free(wsh->write_buffer);
+               wsh->write_buffer = NULL;
+               wsh->write_buffer_len = 0;
+       }
+
        if (wsh->ssl) {
                int code;
                do {
@@ -818,6 +834,8 @@ ssize_t ws_write_frame(wsh_t *wsh, ws_opcode_t oc, void *data, size_t bytes)
 {
        uint8_t hdr[14] = { 0 };
        size_t hlen = 2;
+       uint8_t *bp;
+       ssize_t raw_ret = 0;
 
        if (wsh->down) {
                return -1;
@@ -848,12 +866,25 @@ ssize_t ws_write_frame(wsh_t *wsh, ws_opcode_t oc, void *data, size_t bytes)
                *u64 = htonl(bytes);
        }
 
-       if (ws_raw_write(wsh, (void *) &hdr[0], hlen) != (ssize_t)hlen) {
-               return -1;
+       if (wsh->write_buffer_len < (hlen + bytes + 1)) {
+               void *tmp;
+
+               wsh->write_buffer_len = hlen + bytes + 1;
+               if ((tmp = realloc(wsh->write_buffer, wsh->write_buffer_len))) {
+                       wsh->write_buffer = tmp;
+               } else {
+                       abort();
+               }
        }
+       
+       bp = (uint8_t *) wsh->write_buffer;
+       memcpy(bp, (void *) &hdr[0], hlen);
+       memcpy(bp + hlen, data, bytes);
+       
+       raw_ret = ws_raw_write(wsh, bp, (hlen + bytes));
 
-       if (ws_raw_write(wsh, data, bytes) != (ssize_t)bytes) {
-               return -2;
+       if (raw_ret != (ssize_t) (hlen + bytes)) {
+               return raw_ret;
        }
        
        return bytes;
index 699779b515536c9d477761bbd9170a7453c8cb49..b4d30b47f2e1ba49eaae3ce8b73e7c228b3a237f 100644 (file)
@@ -89,6 +89,8 @@ typedef struct wsh_s {
        int secure_established;
        int logical_established;
        int x;
+       void *write_buffer;
+       size_t write_buffer_len;
 } wsh_t;
 
 ssize_t ws_send_buf(wsh_t *wsh, ws_opcode_t oc);