Walczyłem z tym problemem przez ostatnie 3 dni. W końcu nam się udało to doprowadzić do stanu używalności. Nasza implementacja serwera jest naszym własnym pomysłem, mamy napisanego moda do Apache dzięki któremu możemy otwierać połączenie na porcie 80 i robić inne potrzebne nam rzeczy, ale kilka wniosków może przyda się także innym:
Okazało się, że w przypadku odsyłania handshake dla WSS Apache doklejał do tego nagłówek 200 oraz uznawał że połączenie jest "chunked". Żeby to ominąć musieliśmy wyłączyć dla tego połączenia filtry http_in, content_length, http_header, chunk. Po zrobieniu tego mogliśmy się już połączyć z serwerem, klient odbierał dane z serwera, ale serwer miał problemy z zdekodowaniem danych od klienta. Po debugowaniu co takiego dosyła nam klient okazało się, że czytamy ze streama tylko jeden bajt nagłówków zamiast oczekiwanych dwóch (na pierwszym bajcie zapisane jest czy websocket przesyła dane w jednym pakiecie, czy też są one zdefragmentowane oraz jaki jest typ danych, na drugim powinna być ilość bajtów danych w pakiecie). Problemu nie było w przypadku połączenia przez WS nagłówki zawsze dochodziły w całości, prawdopodobnie fragmentacja powstaje w niższej warstwie TCP/IP z powodu narzutu jaki generuje SSL. Wystarczyło otoczyć funkcję czytającą ze streama odpowiednią pętlą while i czekać aż do streama dojdą wszystkie nagłówki z websocketa.
Tak więc jeśli chodzi o sam format handshake to jest on bez zmian. Jeśli połączenie jest nawiązane, a nic nie dociera to zacząłbym od wypisania sobie co takiego odbiera funkcja czytająca ze streama, jeżeli jest to tylko \x81 to oznacza to że nagłówki z websocketa napływają, ale są zdefragmentowane. Jeśli dosyłacie dane tekstowe, a dochodzi coś co nie zaczyna się od \x81 lub \x01 to znaczy że to raczej nie jest połączenie z websocket. Przykłady jak powinien wyglądać pakiet można znaleźć w RFC:
http://tools.ietf.org/html/rfc6455#section-5.7