Author: kharwell
Date: Wed Feb 11 11:52:35 2015
New Revision: 431697

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=431697
Log:
res_http_websocket: websocket write timeout fails to fully disconnect

When writing to a websocket if a timeout occurred the underlying socket did not
get closed/disconnected. This patch makes sure the websocket gets disconnected
on a write timeout. Also a notice is logged stating that the websocket was
disconnected.

ASTERISK-24701 #close
Reported by: Matt Jordan
Review: https://reviewboard.asterisk.org/r/4412/
........

Merged revisions 431669 from http://svn.asterisk.org/svn/asterisk/branches/11
........

Merged revisions 431670 from http://svn.asterisk.org/svn/asterisk/branches/13

Modified:
    certified/branches/13.1/   (props changed)
    certified/branches/13.1/res/ari/ari_websockets.c
    certified/branches/13.1/res/res_http_websocket.c

Propchange: certified/branches/13.1/
------------------------------------------------------------------------------
Binary property 'branch-13-merged' - no diff available.

Modified: certified/branches/13.1/res/ari/ari_websockets.c
URL: 
http://svnview.digium.com/svn/asterisk/certified/branches/13.1/res/ari/ari_websockets.c?view=diff&rev=431697&r1=431696&r2=431697
==============================================================================
--- certified/branches/13.1/res/ari/ari_websockets.c (original)
+++ certified/branches/13.1/res/ari/ari_websockets.c Wed Feb 11 11:52:35 2015
@@ -100,6 +100,10 @@
 {
        RAII_VAR(struct ast_json *, message, NULL, ast_json_unref);
 
+       if (ast_websocket_fd(session->ws_session) < 0) {
+               return NULL;
+       }
+
        while (!message) {
                int res;
                char *payload;
@@ -127,7 +131,7 @@
 
                switch (opcode) {
                case AST_WEBSOCKET_OPCODE_CLOSE:
-                       ast_debug(1, "WebSocket closed by peer\n");
+                       ast_debug(1, "WebSocket closed\n");
                        return NULL;
                case AST_WEBSOCKET_OPCODE_TEXT:
                        message = ast_json_load_buf(payload, payload_len, NULL);
@@ -173,8 +177,12 @@
        }
 
        ast_debug(3, "Examining ARI event: \n%s\n", str);
-       return ast_websocket_write(session->ws_session,
-               AST_WEBSOCKET_OPCODE_TEXT, str, strlen(str));
+       if (ast_websocket_write(session->ws_session,
+                               AST_WEBSOCKET_OPCODE_TEXT, str, strlen(str))) {
+               ast_log(LOG_NOTICE, "Problem occurred during websocket write, 
websocket closed\n");
+               return -1;
+       }
+       return 0;
 }
 
 void ari_handle_websocket(struct ast_websocket_server *ws_server,

Modified: certified/branches/13.1/res/res_http_websocket.c
URL: 
http://svnview.digium.com/svn/asterisk/certified/branches/13.1/res/res_http_websocket.c?view=diff&rev=431697&r1=431696&r2=431697
==============================================================================
--- certified/branches/13.1/res/res_http_websocket.c (original)
+++ certified/branches/13.1/res/res_http_websocket.c Wed Feb 11 11:52:35 2015
@@ -307,11 +307,15 @@
        }
        if (ast_careful_fwrite(session->f, session->fd, frame, header_size, 
session->timeout)) {
                ao2_unlock(session);
+               /* 1011 - server terminating connection due to not being able 
to fulfill the request */
+               ast_websocket_close(session, 1011);
                return -1;
        }
 
        if (ast_careful_fwrite(session->f, session->fd, payload, actual_length, 
session->timeout)) {
                ao2_unlock(session);
+               /* 1011 - server terminating connection due to not being able 
to fulfill the request */
+               ast_websocket_close(session, 1011);
                return -1;
        }
        fflush(session->f);


-- 
_____________________________________________________________________
-- Bandwidth and Colocation Provided by http://www.api-digital.com --

svn-commits mailing list
To UNSUBSCRIBE or update options visit:
   http://lists.digium.com/mailman/listinfo/svn-commits

Reply via email to