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
下面的代码片段是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。客户要求了解详细信息。
归档时间: |
|
查看次数: |
1457 次 |
最近记录: |