[svn-commits] dlee: trunk r432238 - in /trunk: ./ res/res_http_websocket.c
SVN commits to the Digium repositories
svn-commits at lists.digium.com
Wed Feb 25 14:47:40 CST 2015
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;
}
More information about the svn-commits
mailing list