google-chromewebsocketjetty

bug when websocket receive more than 2^15 bytes on chrome: Received a frame that sets compressed bit while another decompression is ongoing


I tried to passed a JSON via websocket to a html GUI. When size is upper than 32768 bytes, chrome raises this exception:

WebSocket connection to 'ws://localhost:8089/events/' failed: Received a frame that sets compressed bit while another decompression is ongoing

on the line where WebSocket is instantiated :

this._websocket = new WebSocket(url);

However it work fine on firefox. I used jetty 9.1.3 on server side and I tried with chrome 33 and 34 beta.

I forget to precise that if I send length message superior than 32768 bytes, on chrome's network debugging tools, it show 32768 bytes length instead of real message length.

Any ideas ?


Solution

  • This might be a bug in Jetty.

    permessage-deflate requires the compression bit be set on the first frame of a fragmented message - and only on that.

    It might be that Jetty fragments outgoing message to 32k fragments, and sets the compression bit on all frames. If so, that's a bug.

    I have just tested current Chrome 33 using Autobahn|Testsuite: everything works as expected .. including messages with 128k.

    You can test Jetty using above testsuite. It'll catch the bug if there is one.