Il codice snippet di seguito è l'implementazione del metodo verifyServerhandshakeHeaders
trovato in WebSocketHandshake.java
.
public void verifyServerHandshakeHeaders(HashMap<String, String> headers) {
if (!headers.get("Upgrade").toLowerCase(Locale.US).equals("websocket")) {
throw new WebSocketException("connection failed: missing header field in server handshake: Upgrade");
} else if (!headers.get("Connection").toLowerCase(Locale.US).equals("upgrade")) {
throw new WebSocketException("connection failed: missing header field in server handshake: Connection");
}
}
Come si può vedere, se il server non include un header HTTP aggiornamento nella risposta della stretta di mano apertura (RFC 6455, 4. Opening Handshake), questo codice getta NullPointerException
.
Inoltre, perché l'istanza headers
dato a questo metodo è stato creato da new HashMap<String, String>()
(WebSocket.java :360
), intestazioni HTTP inviati dal server devono essere maiuscole e minuscole, anche se le specifiche HTTP dice "I nomi dei campi sono case-insensitive " (RFC 2616, 4.2 Message Headers). Pertanto, ad esempio, se un server invia un'intestazione HTTP di aggiornamento in tutte le lettere maiuscole come UPGRADE
, TubeSock genera NullPointerException
anche se il comportamento del server è corretto.
headers
istanza deve essere creato da
new TreeMap<String, List<String>>(String.CASE_INSENSITIVE_ORDER)
come ho sottolineato in un determinato luogo.
L'implementazione WebSocket di TubeSock non verifica nemmeno l'intestazione Sec-WebSocket-Accept
sebbene la verifica sia richiesta da RFC 6455. Vedere RFC 6455, 4.1. Client Requirements per i dettagli.
fonte
2016-05-04 18:25:42
Questo succede in modo coerente? Sei dietro un proxy? Ciò sembra verificarsi quando le intestazioni HTTP corrette per l'aggiornamento a una connessione WebSocket non sono impostate. – jonnydee
Ho aggiunto Firebase solo ieri e ho fatto l'aggiornamento. Si è schiantato per 1 utente quasi 12 volte. –
La traccia dello stack è sempre la stessa? Avete più informazioni rispetto a questa traccia dello stack? In tal caso, puoi condividerlo (o contattare [email protected] per condividerlo)? –