I’m using socket.io to initiate a cross-domain flash socket connection over SSL in Internet Explorer 9. When I initiate a connection, everything seems to work fine until I send the entire HTML web page of the client. If I never send this HTML over, the connection persists, and the connection works with sending smaller amounts of data. When I send the entire HTML page over, the socket.io logs show that it is cutting the sent HTML short, which is followed by info - transport end (undefined). I traced this error back to
if (i === 0){
if (chr != '\u0000')
this.error('Bad framing. Expected null byte as first frame');
else
continue;
}
in the default.js socket.io file on the server-side. It seems that the client side is breaking up this data for some reason, which is leading to malformed packets. It cannot be a TCP error because sending this amount of data works with regular websockets and JSONP.
I’m completely at a loss on how to debug this. Seems like it could possibly be some corner case Flash + SSL error. Any help would be greatly appreciated.
TL;DR: Try updating the SWF files and web_socket.js in your local socket.io client with the files from https://github.com/NextThought/web-socket-js
Long answer:
There seems to be a bug in distributed client versions of socket.io (up through at least 0.9.10): The version of the Flash SWF support files it distributes (originally forked from the same github repo the above mentioned repo was forked from) cannot send WebSocket frames of size greater than 16K – 8 bytes over SSL (16K being the SSL frame size, and 8 bytes being the WebSocket header size) due to a bug in the SSL implementation. This was an issue identified in the original version of the SSL code (at http://code.google.com/p/as3crypto/issues/detail?id=14), though the fix has not been merged either there or in either of the github repos at this writing.
The original github repo has now moved on to implement the final WebSocket spec, whereas the version distributed with socket.io is using a much older draft spec (which makes diagnosing this issue more difficult as the older spec does not include as much framing information).
The github repo referenced at the beginning contains updated SWF files incorporating the latest github changes and the SSL bug fix. It’s easy to incorporate into a local socket.io client build, and for us, it fixed the problem (testing in IE9 with Flash Player 11). It will only work if the WebSocket server you are connecting to supports the final WebSocket spec. There are some socket.io specific patches in the JavaScript portion of the fork distributed with socket.io to make it function inside node.js (I think); this repo doesn’t include those patches so it will probably only work in a web browser.