Firefox 15 Bug im Websocket Code

Das schlimme ist ja: Jetzt wo ich den ganzen Tag arbeiten muss habe ich jede Menge Sachen gelernt, über die ich gerne bloggen würde – nur ich habe leider keine Zeit dafür 🙁

Zumindest eine Sache kann ich jetzt aber wirklich mal bloggen: Firefox 15 (und auch 15.0.1) hat einen Bug im Websocket Code, der mir viel Ärger gebracht hat:

Eine neues Feature in FF 15 ist es, Verbindungen schon zu öffnen, bevor komplett klar ist, ob man sie braucht. Das sollte das Laden von Websites beschleunigen. Das ganze nennt sich dann „speculative connect“, auch wenn ich nirgendwo Infos darüber gefunden habe.

Nun habe ich für meine Firma etwas gebastelt, bei dem eine Verbindung über WebSockets zu einem „richtigen“ Server hergestellt wurde. Normalerweise kann man über WebSockets keine „richtigen“ TCP-Sockets ansprechen, doch es gibt ja Websockify, ein kleines Programm das auf dem Zielrechner läuft, dort eine Websocket-Verbindung annimmt und dort auf eine TCP-Verbindung weiterleitet. Ein nettes Programm, und meine Idee klappt auch wunderbar damit mit alle Browsern (außer dem IE 9…).

Bis es jemand mit Firefox 15 probierte. Keine Verbindung möglich. Wie sich nach langer Suche (mit großartiger Unterstützung der Firefox und Websockify Entwickler) rausstellte , lag es tatsächlich am „spekulative connect“, in Verbindung mit ein paar anderen unglücklichen Umständen. Das erste Problem war, das Websockify auf Windows lief, und dort nur in einem Thread, wodurch es nicht mehr als eine Verbindung gleichzeitig annehmen konnte (war ja eigentlich auch nicht nötig). Jetzt hat der Browser den Befehl bekommen eine Websocketverbindung zu Websockify zu öffnen. Firefox 15 hat nun erst „auf Verdacht“ eine aufgemacht, und dann weiter nachgesehen. Dann hat Firefox gemerkt, dass es eine Websocketverbindung war, und er die alte „vorläufige“ Verbindung doch nicht gebrauchen konnte. Doch Websockify hatte die Verbindung schon angenommen und hat erst nach drei Sekunden (Timeout) gemerkt, dass die Verbindung nicht mehr benutzt wurde. Inzwischen hatte Firefox schon eine neue Verbindung aufgemacht, doch Websockify musste erst das Timeout von den drei Sekunden abwarten, bevor es sich der neuen Verbindung zuwenden konnte, weil es ja Single-Threaded auf Windows lief.

Inzwischen war aber eine anderes Timout rum: Im JavaScript Code war eine Timeout von nur zwei Sekunden eingebaut. In der Zeit hatte Websockify aber die „richtige“ Verbindung nicht annehmen können, und so gab es gar keine Verbindung.

Schlussendlich half es dann den JavaScript Timeout auf 10 Sekunden hoch zu setzen, und in Firefox 16 wird der Bug dann auch behoben sein, dann gibt es kein speculative connect mehr für Websocket Verbindungen.

Fazit: Blöder Verkettung mehrerer Umstände, zusammen mit einem Bug in Firefox. (Juhu, mein erster Bug in einer „großen“ Software!) Wenns also mit Firefox 15 und Websockify mal klemmt, jetzt wisst ihr warum 😀

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.