]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-7117 #comment revert bf5210bf72d6c4b0d9b599a5a07ee59a9c947436 and implement it...
authorAnthony Minessale <anthm@freeswitch.org>
Wed, 7 Jan 2015 17:17:31 +0000 (11:17 -0600)
committerAnthony Minessale <anthm@freeswitch.org>
Wed, 7 Jan 2015 23:17:28 +0000 (17:17 -0600)
libs/sofia-sip/libsofia-sip-ua/tport/ws.c
src/mod/endpoints/mod_verto/mod_verto.c
src/mod/endpoints/mod_verto/ws.c

index db2e39e5ab58cc60b745db476c0b43f92a509a5a..e990f7f815565a49bd4d68db6451fa5ac011b064 100644 (file)
@@ -311,7 +311,10 @@ int ws_handshake(wsh_t *wsh)
                         proto_buf);
        respond[511] = 0;
 
-       ws_raw_write(wsh, respond, strlen(respond));
+       if (ws_raw_write(wsh, respond, strlen(respond)) != strlen(respond)) {
+               goto err;
+       }
+
        wsh->handshake = 1;
 
        return 0;
@@ -403,10 +406,16 @@ ssize_t ws_raw_write(wsh_t *wsh, void *data, size_t bytes)
        ssize_t r;
        int sanity = 2000;
        int ssl_err = 0;
+       ssize_t wrote = 0;
 
        if (wsh->ssl) {
                do {
-                       r = SSL_write(wsh->ssl, data, bytes);
+                       r = SSL_write(wsh->ssl, (void *)((unsigned char *)data + wrote), bytes - wrote);
+
+                       if (r > 0) {
+                               wrote += r;
+                       }
+
                        if (sanity < 2000) {
                                ms_sleep(1);
                        }
@@ -415,7 +424,7 @@ ssize_t ws_raw_write(wsh_t *wsh, void *data, size_t bytes)
                                ssl_err = SSL_get_error(wsh->ssl, r);
                        }
 
-               } while (--sanity > 0 && r == -1 && ssl_err == SSL_ERROR_WANT_WRITE);
+               } while (--sanity > 0 && ((r == -1 && ssl_err == SSL_ERROR_WANT_WRITE) || (wsh->block && wrote < bytes)));
 
                if (ssl_err) {
                        r = ssl_err * -1;
@@ -425,12 +434,18 @@ ssize_t ws_raw_write(wsh_t *wsh, void *data, size_t bytes)
        }
 
        do {
-               r = send(wsh->sock, data, bytes, 0);
+               r = send(wsh->sock, (void *)((unsigned char *)data + wrote), bytes - wrote, 0);
+               
+               if (r > 0) {
+                       wrote += r;
+               }
+
                if (sanity < 2000) {
                        ms_sleep(1);
                }
-       } while (--sanity > 0 && r == -1 && xp_is_blocking(xp_errno()));
-
+               
+       } while (--sanity > 0 && ((r == -1 && xp_is_blocking(xp_errno())) || (wsh->block && wrote < bytes)));
+       
        //if (r<0) {
                //printf("wRITE FAIL: %s\n", strerror(errno));
        //}
index 20d21357742e5568a3ee9bf64509d8b18dcaed90..55411371c61632642412dfe8a2c1f5e4bc0be936 100644 (file)
@@ -1480,9 +1480,6 @@ static void http_static_handler(switch_http_request_t *request, verto_vhost_t *v
 
                for (;;) {
                        switch_status_t status;
-                       ssize_t written = 0;
-                       ssize_t ret = 0;
-                       int sanity = 3;
 
                        flen = sizeof(chunk);
                        status = switch_file_read(fd, chunk, &flen);
@@ -1491,17 +1488,7 @@ static void http_static_handler(switch_http_request_t *request, verto_vhost_t *v
                                break;
                        }
 
-again:
-                       ret = ws_raw_write(&jsock->ws, chunk + written, flen);
-                       if (ret == -1) {
-                               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "error write %" SWITCH_SIZE_T_FMT " bytes!\n", flen);
-                               ws_close(&jsock->ws, WS_NONE);
-                       } else if (ret > 0 && ret < flen && sanity > 0) {
-                               switch_yield(1000);
-                               flen -= ret;
-                               written += ret;
-                               goto again;
-                       }
+                       ws_raw_write(&jsock->ws, chunk, flen);
                }
                switch_file_close(fd);
        } else {
index db2e39e5ab58cc60b745db476c0b43f92a509a5a..e990f7f815565a49bd4d68db6451fa5ac011b064 100644 (file)
@@ -311,7 +311,10 @@ int ws_handshake(wsh_t *wsh)
                         proto_buf);
        respond[511] = 0;
 
-       ws_raw_write(wsh, respond, strlen(respond));
+       if (ws_raw_write(wsh, respond, strlen(respond)) != strlen(respond)) {
+               goto err;
+       }
+
        wsh->handshake = 1;
 
        return 0;
@@ -403,10 +406,16 @@ ssize_t ws_raw_write(wsh_t *wsh, void *data, size_t bytes)
        ssize_t r;
        int sanity = 2000;
        int ssl_err = 0;
+       ssize_t wrote = 0;
 
        if (wsh->ssl) {
                do {
-                       r = SSL_write(wsh->ssl, data, bytes);
+                       r = SSL_write(wsh->ssl, (void *)((unsigned char *)data + wrote), bytes - wrote);
+
+                       if (r > 0) {
+                               wrote += r;
+                       }
+
                        if (sanity < 2000) {
                                ms_sleep(1);
                        }
@@ -415,7 +424,7 @@ ssize_t ws_raw_write(wsh_t *wsh, void *data, size_t bytes)
                                ssl_err = SSL_get_error(wsh->ssl, r);
                        }
 
-               } while (--sanity > 0 && r == -1 && ssl_err == SSL_ERROR_WANT_WRITE);
+               } while (--sanity > 0 && ((r == -1 && ssl_err == SSL_ERROR_WANT_WRITE) || (wsh->block && wrote < bytes)));
 
                if (ssl_err) {
                        r = ssl_err * -1;
@@ -425,12 +434,18 @@ ssize_t ws_raw_write(wsh_t *wsh, void *data, size_t bytes)
        }
 
        do {
-               r = send(wsh->sock, data, bytes, 0);
+               r = send(wsh->sock, (void *)((unsigned char *)data + wrote), bytes - wrote, 0);
+               
+               if (r > 0) {
+                       wrote += r;
+               }
+
                if (sanity < 2000) {
                        ms_sleep(1);
                }
-       } while (--sanity > 0 && r == -1 && xp_is_blocking(xp_errno()));
-
+               
+       } while (--sanity > 0 && ((r == -1 && xp_is_blocking(xp_errno())) || (wsh->block && wrote < bytes)));
+       
        //if (r<0) {
                //printf("wRITE FAIL: %s\n", strerror(errno));
        //}