Java.io.IOException: El desafío de autenticación recibido es nulo en ICS 4.0.3

Estoy intentando cerrar la sesión del servidor. Pero devuelve el código de respuesta "0" con esta excepción. Estoy usando el verbo GET para hacer esto.

LogCat

10-17 14:54:13.261: W/System.err(868): java.io.IOException: Received authentication challenge is null 10-17 14:54:13.284: W/System.err(868): at libcore.net.http.HttpURLConnectionImpl.processAuthHeader(HttpURLConnectionImpl.java:397) 10-17 14:54:13.284: W/System.err(868): at libcore.net.http.HttpURLConnectionImpl.processResponseHeaders(HttpURLConnectionImpl.java:345) 10-17 14:54:13.304: W/System.err(868): at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:276) 10-17 14:54:13.324: W/System.err(868): at libcore.net.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:479) 10-17 14:54:13.324: W/System.err(868): at com.remote.synchronizer.haris.CustomHttpClient.executeGet(CustomHttpClient.java:131) 10-17 14:54:13.354: W/System.err(868): at com.remote.synchronizer.haris.OptionsActivity$1$3$1.run(OptionsActivity.java:87) 10-17 14:54:13.364: W/System.err(868): at android.os.Handler.handleCallback(Handler.java:605) 10-17 14:54:13.384: W/System.err(868): at android.os.Handler.dispatchMessage(Handler.java:92) 10-17 14:54:13.384: W/System.err(868): at android.os.Looper.loop(Looper.java:137) 10-17 14:54:13.404: W/System.err(868): at android.app.ActivityThread.main(ActivityThread.java:4424) 10-17 14:54:13.424: W/System.err(868): at java.lang.reflect.Method.invokeNative(Native Method) 10-17 14:54:13.424: W/System.err(868): at java.lang.reflect.Method.invoke(Method.java:511) 10-17 14:54:13.454: W/System.err(868): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 10-17 14:54:13.474: W/System.err(868): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 10-17 14:54:13.474: W/System.err(868): at dalvik.system.NativeStart.main(Native Method) 10-17 14:54:13.484: E/HTTP Response(868): java.io.IOException: Received authentication challenge is null 

CustomHttpClient.java

 public class CustomHttpClient { static HttpClient client = new DefaultHttpClient(); static HttpURLConnection connection = null; public static int executePost(String url, String postParameters) { int response=0; OutputStream output = null; try { connection = (HttpURLConnection)new URL(url).openConnection(); System.setProperty("http.keepAlive", "false"); connection.setDoOutput(true); connection.setRequestMethod("POST"); connection.setRequestProperty("Accept-Charset", "UTF-8"); connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8"); connection.connect(); output = connection.getOutputStream(); output.write(postParameters.getBytes("UTF-8")); response=connection.getResponseCode(); } catch(Exception e) { e.printStackTrace(); Log.e("HTTP Response", e.toString()); } finally { if(connection != null) { // connection.disconnect(); if (output != null) try { output.close(); } catch (IOException logOrIgnore) {} } } return response; } public static int executeGet(String url) { int response=0; //HttpURLConnection connection = null; try { connection = (HttpURLConnection) new URL(url).openConnection(); System.setProperty("http.keepAlive", "false"); //connection.setRequestProperty("Accept-Charset", "UTF-8"); connection.setDoInput(true); connection.setRequestMethod("GET"); connection.connect(); response=connection.getResponseCode(); } catch(Exception e) { e.printStackTrace(); Log.e("HTTP Response", e.toString()); } finally { if(connection != null) { // connection.disconnect(); } } return response; } } 

Antes de esto estoy usando DefaultHTTPClient en Gingerbird 2.3 su funcionamiento perfectamente pero en ICS DefaultHTTPClient no está funcionando así que necesito utilizar HttpURLConnection. El verbo POST está funcionando bien.

Puede obtener el código de respuesta después de una excepción si llama a .getResponseCode () por segunda vez en el objeto de conexión. Esto se debe a que la primera vez que llama .getResponseCode () se establece un estado interno que permite que .getResponseCode () devuelva sin lanzar una excepción.

Ejemplo:

 HttpURLConnection connection = ...; try { // Will throw IOException if server responds with 401. connection.getResponseCode(); } catch (IOException e) { // Will return 401, because now connection has the correct internal state. int responsecode = connection.getResponseCode(); } 

También he respondido a esta pregunta aquí: https://stackoverflow.com/a/15972969/816017

HttpURLConnection.getResponseCode() throws java.io.IOException: Received authentication challenge is null cuando encuentra el encabezado HTTP 401 malformado. ¿ WWW-Authenticate encabezados WWW-Authenticate y Content-Length del servidor además del encabezado HTTP/1.1 401 Unauthorized ? Consulte IOException: "El desafío de autenticación recibido es nulo" (Apache Harmony / Android)

Si no puede realizar cambios en el servidor, puede detectar la excepción (gracias https://stackoverflow.com/a/10904318/262462 )

 try { response=connection.getResponseCode(); } catch (java.io.IOException e) { if (e.getMessage().contains("authentication challenge")) { response = HttpsURLConnection.HTTP_UNAUTHORIZED; } else { throw e; } } 

Este error ocurre porque el servidor envía un 401 (no autorizado) pero no da una "WWW-Authenticate", que es una pista para el cliente qué hacer a continuación. El encabezado "WWW-Authenticate" le dice al cliente qué tipo de autenticación es necesaria ( Basic o Digest ). Esto no suele ser muy útil en los clientes http sin cabeza, pero eso es cómo se define el estándar. El error se produce porque el lib intenta analizar el encabezado "WWW-Authenticate" pero no puede.

Posibles soluciones si puede cambiar el servidor:

  • Agregue una falsa "WWW-Authenticate" encabezado como: WWW-Authenticate: Basic realm="fake" . Esta es una mera solución no es una solución, pero debería funcionar y el cliente http está satisfecho.
  • Utilice el código de estado HTTP 403 lugar de 401 . Es semántico no es lo mismo y por lo general cuando se trabaja con login 401 es una respuesta correcta ( ver aquí para una discusión detallada ), pero es lo suficientemente cerca.

Posibles soluciones si no puede cambiar el servidor:

Como @ErikZ escribió en su mensaje que podría utilizar un try & catch

 HttpURLConnection connection = ...; try { // Will throw IOException if server responds with 401. connection.getResponseCode(); } catch (IOException e) { // Will return 401, because now connection has the correct internal state. int responsecode = connection.getResponseCode(); } 

También he publicado esto aquí: java.io.IOException: No se encontraron desafíos de autenticación

  • Emita las direcciones de streaming para Google Maps API v2 Android
  • Android: intentando obtener datos de youtube api
  • IOException: "El desafío de autenticación recibido es nulo" (Apache Harmony / Android)
  • Evitar llamadas de método CONNECT no solicitadas desde HttpURLConnection
  • okHTTP utilizado internamente en dispositivos Android> 4.4 cuando se utiliza HttpUrlConnection?
  • Error android, httpurlconnection
  • Necesita un ejemplo de HttpResponseCache en Android
  • HttpURLConnection getResponseCode () deos no devuelve si no hay conexión a Internet
  • HTC Un error? Partes del encabezado HTTP que aparecen en URLConnection InputStream
  • Java HttpURLConnection VS Android HttpURLConnection
  • Error de NetworkOnMainThreadException en jellybean
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.