由于空指针异常导致Firebase崩溃

Ash*_*rma 16 android nullpointerexception websocket firebase

Firebase空指针异常.附上下面的堆栈跟踪

Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.String.toLowerCase(java.util.Locale)' on a null object reference
       at com.firebase.tubesock.WebSocketHandshake.verifyServerHandshakeHeaders(WebSocketHandshake.java:96)
       at com.firebase.tubesock.WebSocket.runReader(WebSocket.java:365)
       at com.firebase.tubesock.WebSocket.access$000(WebSocket.java:30)
       at com.firebase.tubesock.WebSocket$2.run(WebSocket.java:108)
       at java.lang.Thread.run(Thread.java:818)
Run Code Online (Sandbox Code Playgroud)

版本:2016年3月3日最新(2.5.2 +)

设备详细信息:LGE - 运行android 6.0和非Root的lgls770

Tak*_*aki 4

下面的代码片段是verifyServerhandshakeHeaders中方法的实现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");
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,如果服务器在打开握手的响应中不包含 Upgrade HTTP 标头(RFC 6455,4.打开握手),则此代码将抛出NullPointerException

此外,由于headers赋予该方法的实例是通过new HashMap<String, String>()( WebSocket.java:360) 创建的,因此从服务器发送的 HTTP 标头必须区分大小写,尽管 HTTP 规范规定“字段名称不区分大小写”(RFC 2616,4.2消息标头)。因此,例如,如果服务器以全大写字母(如 )发送 Upgrade HTTP 标头UPGRADE,则 TubeSock 会抛出异常NullPointerException,尽管服务器的行为是正确的。

headers实例应该由创建

new TreeMap<String, List<String>>(String.CASE_INSENSITIVE_ORDER)
Run Code Online (Sandbox Code Playgroud)

正如我在某个地方指出的那样。

尽管 RFC 6455 要求进行验证,但TubeSock 的 WebSocket 实现甚至不验证Sec-WebSocket-Accept标头。请参阅 RFC 6455, 4.1。客户要求了解详细信息。