Author: dlee Date: Wed Feb 25 14:47:39 2015 New Revision: 432238 URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=432238 Log: Increase WebSocket frame size and improve large read handling
Some WebSocket applications, like [chan_respoke][], require a larger frame size than the default 8k; this patch bumps the default to 16k. This patch also fixes some problems exacerbated by large frames. The sanity counter was decremented on every fread attempt in ws_safe_read(), regardless of whether data was read from the socket or not. For large frames, this could result in loss of sanity prior to reading the entire frame. (16k frame / 1448 bytes per segment = 12 segments). This patch changes the sanity counter so that it only decrements when fread() doesn't read any bytes. This more closely matches the original intention of ws_safe_read(), given that the error message is "Websocket seems unresponsive". This patch also properly logs EOF conditions, so disconnects are no longer confused with unresponsive connections. [chan_respoke]: https://github.com/respoke/chan_respoke Review: https://reviewboard.asterisk.org/r/4431/ ........ Merged revisions 432236 from http://svn.asterisk.org/svn/asterisk/branches/11 ........ Merged revisions 432237 from http://svn.asterisk.org/svn/asterisk/branches/13 Modified: trunk/ (props changed) trunk/res/res_http_websocket.c Propchange: trunk/ ------------------------------------------------------------------------------ Binary property 'branch-13-merged' - no diff available. Modified: trunk/res/res_http_websocket.c URL: http://svnview.digium.com/svn/asterisk/trunk/res/res_http_websocket.c?view=diff&rev=432238&r1=432237&r2=432238 ============================================================================== --- trunk/res/res_http_websocket.c (original) +++ trunk/res/res_http_websocket.c Wed Feb 25 14:47:39 2015 @@ -52,7 +52,7 @@ #define MAX_PROTOCOL_BUCKETS 7 /*! \brief Size of the pre-determined buffer for WebSocket frames */ -#define MAXIMUM_FRAME_SIZE 8192 +#define MAXIMUM_FRAME_SIZE 16384 /*! \brief Default reconstruction size for multi-frame payload reconstruction. If exceeded the next frame will start a * payload. @@ -413,18 +413,35 @@ */ static inline int ws_safe_read(struct ast_websocket *session, char *buf, int len, enum ast_websocket_opcode *opcode) { - int sanity; size_t rlen; int xlen = len; char *rbuf = buf; - for (sanity = 10; sanity; sanity--) { + int sanity = 10; + + for (;;) { clearerr(session->f); rlen = fread(rbuf, 1, xlen, session->f); - if (!rlen && ferror(session->f) && errno != EAGAIN) { - ast_log(LOG_ERROR, "Error reading from web socket: %s\n", strerror(errno)); - *opcode = AST_WEBSOCKET_OPCODE_CLOSE; - session->closing = 1; - return -1; + if (!rlen) { + if (feof(session->f)) { + ast_log(LOG_WARNING, "Web socket closed abruptly\n"); + *opcode = AST_WEBSOCKET_OPCODE_CLOSE; + session->closing = 1; + return -1; + } + + if (ferror(session->f) && errno != EAGAIN) { + ast_log(LOG_ERROR, "Error reading from web socket: %s\n", strerror(errno)); + *opcode = AST_WEBSOCKET_OPCODE_CLOSE; + session->closing = 1; + return -1; + } + + if (!--sanity) { + ast_log(LOG_WARNING, "Websocket seems unresponsive, disconnecting ...\n"); + *opcode = AST_WEBSOCKET_OPCODE_CLOSE; + session->closing = 1; + return -1; + } } xlen = xlen - rlen; rbuf = rbuf + rlen; @@ -437,12 +454,6 @@ session->closing = 1; return -1; } - } - if (!sanity) { - ast_log(LOG_WARNING, "Websocket seems unresponsive, disconnecting ...\n"); - *opcode = AST_WEBSOCKET_OPCODE_CLOSE; - session->closing = 1; - return -1; } return 0; } -- _____________________________________________________________________ -- 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