diff --git a/lib/client.c b/lib/client.c index 1ba809b9..b4cd3361 100644 --- a/lib/client.c +++ b/lib/client.c @@ -707,10 +707,14 @@ check_extensions: /* allow him to construct his ext instance */ - ext->callback(lws_get_context(wsi), ext, wsi, + if (ext->callback(lws_get_context(wsi), ext, wsi, LWS_EXT_CB_CLIENT_CONSTRUCT, (void *)&wsi->act_ext_user[wsi->count_act_ext], - (void *)&opts, 0); + (void *)&opts, 0)) { + lwsl_notice(" ext %s failed construction\n", ext_name); + ext++; + continue; + } /* * allow the user code to override ext defaults if it diff --git a/lib/extension-permessage-deflate.c b/lib/extension-permessage-deflate.c index 6ae348a6..439120af 100644 --- a/lib/extension-permessage-deflate.c +++ b/lib/extension-permessage-deflate.c @@ -75,6 +75,17 @@ lws_extension_callback_pm_deflate(struct lws_context *context, case LWS_EXT_CB_CLIENT_CONSTRUCT: case LWS_EXT_CB_CONSTRUCT: + + n = LWS_MAX_SOCKET_IO_BUF; + if (wsi->protocol->rx_buffer_size) + n = wsi->protocol->rx_buffer_size; + + if (n < 128) { + lwsl_err(" permessage-deflate requires the protocol (%s) to have an RX buffer >= 128\n", + wsi->protocol->name); + return -1; + } + /* fill in **user */ priv = lws_zalloc(sizeof(*priv)); *((void **)user) = priv; @@ -102,6 +113,23 @@ lws_extension_callback_pm_deflate(struct lws_context *context, priv->args[PMD_TX_BUF_PWR2] = 10; /* ie, 1024 */ priv->args[PMD_COMP_LEVEL] = 1; priv->args[PMD_MEM_LEVEL] = 8; + + /* cap the RX buf at the nearest power of 2 to protocol rx buf */ + + n = LWS_MAX_SOCKET_IO_BUF; + if (wsi->protocol->rx_buffer_size) + n = wsi->protocol->rx_buffer_size; + + extra = 7; + while (n >= 1 << (extra + 1)) + extra++; + + if (extra < priv->args[PMD_RX_BUF_PWR2]) { + priv->args[PMD_RX_BUF_PWR2] = extra; + lwsl_err(" Capping pmd rx to %d\n", 1 << extra); + } + lwsl_err(" ok\n"); + break; case LWS_EXT_CB_DESTROY: diff --git a/lib/server-handshake.c b/lib/server-handshake.c index 5f525852..fd126a75 100644 --- a/lib/server-handshake.c +++ b/lib/server-handshake.c @@ -123,11 +123,6 @@ lws_extension_server_handshake(struct lws *wsi, char **p) /* apply it */ - if (ext_count) - *(*p)++ = ','; - else - LWS_CPYAPP(*p, "\x0d\x0aSec-WebSocket-Extensions: "); - *p += sprintf(*p, "%s", ext_name); ext_count++; /* instantiate the extension on this conn */ @@ -136,10 +131,21 @@ lws_extension_server_handshake(struct lws *wsi, char **p) /* allow him to construct his context */ - ext->callback(lws_get_context(wsi), ext, wsi, + if (ext->callback(lws_get_context(wsi), ext, wsi, LWS_EXT_CB_CONSTRUCT, (void *)&wsi->act_ext_user[wsi->count_act_ext], - NULL, 0); + NULL, 0)) { + lwsl_notice("ext %s failed construction\n", ext_name); + ext_count--; + ext++; + continue; + } + + if (ext_count > 1) + *(*p)++ = ','; + else + LWS_CPYAPP(*p, "\x0d\x0aSec-WebSocket-Extensions: "); + *p += sprintf(*p, "%s", ext_name); wsi->count_act_ext++; lwsl_parser("count_act_ext <- %d\n", wsi->count_act_ext); diff --git a/test-server/test-server.c b/test-server/test-server.c index 09f70464..8fabc825 100644 --- a/test-server/test-server.c +++ b/test-server/test-server.c @@ -89,25 +89,25 @@ static struct lws_protocols protocols[] = { "dumb-increment-protocol", callback_dumb_increment, sizeof(struct per_session_data__dumb_increment), - 10, + 10, /* rx buf size must be >= permessage-deflate rx size */ }, { "lws-mirror-protocol", callback_lws_mirror, sizeof(struct per_session_data__lws_mirror), - 128, + 128, /* rx buf size must be >= permessage-deflate rx size */ }, { "lws-echogen", callback_lws_echogen, sizeof(struct per_session_data__echogen), - 128, + 128, /* rx buf size must be >= permessage-deflate rx size */ }, { "lws-status", callback_lws_status, sizeof(struct per_session_data__lws_status), - 128, + 128, /* rx buf size must be >= permessage-deflate rx size */ }, { NULL, NULL, 0, 0 } /* terminator */ }; diff --git a/test-server/test.html b/test-server/test.html index eff2ba19..450a296b 100644 --- a/test-server/test.html +++ b/test-server/test.html @@ -127,6 +127,7 @@ to zero just this connection's number.
+ @@ -477,7 +478,7 @@ document.getElementById("number").textContent = get_appropriate_ws_url(); document.getElementById("s_statustd").style.backgroundColor = "#40ff40"; document.getElementById("s_status").innerHTML = " websocket connection opened
" + - san(socket_di.extensions); + san(socket_status.extensions); } socket_status.onmessage =function got_packet(msg) { @@ -514,6 +515,12 @@ function reset() { socket_di.send("reset\n"); } + +function junk() { + for(var word = ''; word.length < 9000; word += 'a'){} + socket_di.send(word); +} + var socket_ot; function ot_open() { @@ -579,7 +586,7 @@ function ot_req_close() { document.getElementById("wslm_statustd").style.backgroundColor = "#40ff40"; document.getElementById("wslm_status").innerHTML = " websocket connection opened
" + - san(socket_di.extensions); + san(socket_lm.extensions); } socket_lm.onmessage =function got_packet(msg) {