Project: titanium
Issue TIMOB-20583: Android: TiHTTPClient.getAllResponseHeaders() throws NullPointerException on timeout
Being on 2G my http request will timeout and bringing up the following error message: {code:java} (TiHttpClient-3) [96625,96625] HTTP Error (java.net.SocketTimeoutException): java.net.SocketTimeoutException java.net.SocketTimeoutException java.net.PlainSocketImpl.read(PlainSocketImpl.java:484) java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:37) java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:237) com.android.okhttp.okio.Okio$2.read(Okio.java:135) com.android.okhttp.okio.AsyncTimeout$2.read(AsyncTimeout.java:211) com.android.okhttp.okio.RealBufferedSource.indexOf(RealBufferedSource.java:306) com.android.okhttp.okio.RealBufferedSource.indexOf(RealBufferedSource.java:300) com.android.okhttp.okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.java:196) com.android.okhttp.internal.http.HttpConnection.readResponse(HttpConnection.java:191) com.android.okhttp.internal.http.HttpTransport.readResponseHeaders(HttpTransport.java:80) com.android.okhttp.internal.http.HttpEngine.readNetworkResponse(HttpEngine.java:904) com.android.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:788) com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:463) com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:408) com.android.okhttp.internal.huc.HttpURLConnectionImpl.getHeaders(HttpURLConnectionImpl.java:170) com.android.okhttp.internal.huc.HttpURLConnectionImpl.getHeaderField(HttpURLConnectionImpl.java:212) java.net.URLConnection.getHeaderFieldInt(URLConnection.java:543) java.net.URLConnection.getContentLength(URLConnection.java:315) ti.modules.titanium.network.TiHTTPClient.handleResponse(TiHTTPClient.java:159) ti.modules.titanium.network.TiHTTPClient.access$1200(TiHTTPClient.java:85) ti.modules.titanium.network.TiHTTPClient$ClientRunnable.run(TiHTTPClient.java:1207) java.lang.Thread.run(Thread.java:818) java.lang.NullPointerException: Attempt to invoke interface method 'boolean java.util.Map.isEmpty()' on a null object reference ti.modules.titanium.network.TiHTTPClient.getAllResponseHeaders(TiHTTPClient.java:615) ti.modules.titanium.network.HTTPClientProxy.getAllResponseHeaders(HTTPClientProxy.java:99) org.appcelerator.kroll.runtime.v8.V8Object.nativeCallProperty(Native Method) org.appcelerator.kroll.runtime.v8.V8Object.callProperty(V8Object.java:73) org.appcelerator.kroll.KrollProxy.handleMessage(KrollProxy.java:1155) android.os.Handler.dispatchMessage(Handler.java:98) android.os.Looper.loop(Looper.java:168) org.appcelerator.kroll.KrollRuntime$KrollRuntimeThread.run(KrollRuntime.java:118) E/TiExceptionHandler(7403): (main) [59,96684] ----- Titanium Javascript Runtime Error ----- E/TiExceptionHandler(7403): (main) [0,96684] - In ti:/console.js:25,62 E/TiExceptionHandler(7403): (main) [0,96684] - Message: Uncaught Error: Attempt to invoke interface method 'boolean java.util.Map.isEmpty()' on a null object reference E/TiExceptionHandler(7403): (main) [1,96685] - Source:	( arg.hasOwnProperty('toString') ? arg.toString() : JSON.stringify(arg) ) {code} The problem is here: https://github.com/appcelerator/titanium_mobile/blob/dcd73f54156cdd0a9f40ae9a2339ccb68e8c216e/android/modules/network/src/java/ti/modules/titanium/network/TiHTTPClient.java#L615 responseHeaders is null so isEmpty() can't be called Test code: {code:java} var url = "http://my.server.com"; var client = Ti.Network.createHTTPClient({ onload : function(e) { Ti.API.info("Received text: " + this.responseText); alert('success'); }, onerror : function(e) { Ti.API.debug(e.error); alert('error'); }, timeout : 5000 }); client.open("GET", url); client.send(); {code} I've changed to 2G and went into a room with bad reception to force the timeout
Story points: 2