From 8cd06ca31567ea3e44c6c05436d4b11b6bd216c9 Mon Sep 17 00:00:00 2001 From: Andy Green Date: Fri, 1 Apr 2016 09:30:09 +0800 Subject: [PATCH] test server align rxbuf with permessage deflate rx buf size Add a test html button that will send 9KB of junk to confirm it https://github.com/warmcat/libwebsockets/issues/480 permessage-deflate now checks the protocol rx buffer size for being >=128, if not, permessage-deflate is disabled on that connection. If it is >=128 but less than the zlib decompress buffer size, the zlib decompress buffer size for that connection is reduced to the nearest power of two of the protocol rx buf size. To test this, dumb_increment is left violating the >= 128 rx buffer size and permessage-deflte can be seen to be disabled on his connections in the test html. Signed-off-by: Andy Green --- lib/client.c | 8 ++++++-- lib/extension-permessage-deflate.c | 28 ++++++++++++++++++++++++++++ lib/server-handshake.c | 20 +++++++++++++------- test-server/test-server.c | 8 ++++---- test-server/test.html | 11 +++++++++-- 5 files changed, 60 insertions(+), 15 deletions(-) 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) {