Android HttpsUrlConnection eofexception

Tengo un problema donde mi HttpsURLConnection lanzará una EOFException cuando intento leer cualquier entrada. El código funciona para algunas llamadas de red, pero falla en otras. Si intento y leo algo de la conexión, falla con el error mencionado.

Ejemplo:

urlConnect.getResponseCode() // will throw error urlConnect.getResponseMessage() // will throw error BufferedInputStream in = new BufferedInputStream(urlConnect.getInputStream()); //will throw error 

Aquí está el seguimiento de la pila para cada uno:

obtener una respuesta:

 03-14 09:49:18.547: W/System.err(6270): java.io.EOFException 03-14 09:49:18.547: W/System.err(6270): at libcore.io.Streams.readAsciiLine(Streams.java:203) 03-14 09:49:18.547: W/System.err(6270): at libcore.net.http.HttpEngine.readResponseHeaders(HttpEngine.java:573) 03-14 09:49:18.547: W/System.err(6270): at libcore.net.http.HttpEngine.readResponse(HttpEngine.java:821) 03-14 09:49:18.547: W/System.err(6270): at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:283) 03-14 09:49:18.547: W/System.err(6270): at libcore.net.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:495) 03-14 09:49:18.547: W/System.err(6270): at libcore.net.http.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:134) 

BufferedInputStream:

 03-14 09:39:14.077: W/System.err(5935): java.io.EOFException 03-14 09:39:14.077: W/System.err(5935): at libcore.io.Streams.readAsciiLine(Streams.java:203) 03-14 09:39:14.077: W/System.err(5935): at libcore.net.http.HttpEngine.readResponseHeaders(HttpEngine.java:573) 03-14 09:39:14.077: W/System.err(5935): at libcore.net.http.HttpEngine.readResponse(HttpEngine.java:821) 03-14 09:39:14.077: W/System.err(5935): at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:283) 03-14 09:50:46.547: W/System.err(6476): at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:177) 03-14 09:50:46.547: W/System.err(6476): at libcore.net.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:271) 

Gracias por cualquier ayuda,

Almiar

EDIT Yo encontré mi respuesta:

Esta no fue una respuesta bien documentada. Aparece en algunas de las versiones más recientes de android, hay un error con las conexiones de url recicladas. Para solucionar esto (aunque puede haber algunos problemas de rendimiento), necesitaba agregar:

 if (Build.VERSION.SDK != null && Build.VERSION.SDK_INT > 13) { urlConnect.setRequestProperty("Connection", "close"); } 

¡Gracias!

Almiar

Alguien me pidió que respondiera a mi propia pregunta en vez de editarla. Así que aquí está la respuesta otra vez.

Esta no fue una respuesta bien documentada. Aparece en algunas de las versiones más recientes de android, hay un error con las conexiones de url recicladas. Para solucionar esto (aunque puede haber algunos problemas de rendimiento), necesitaba agregar:

 if (Build.VERSION.SDK != null && Build.VERSION.SDK_INT > 13) { urlConnect.setRequestProperty("Connection", "close"); } 

Usted no especifica su servidor, por lo que potencialmente es una costumbre que usted ha implementado usted mismo. Es posible que sus respuestas no son completamente correctas por la especificación HTTP.

Mi servidor estaba usando python SimpleHTTPServer y estaba asumiendo equivocadamente todo lo que necesitaba hacer para indicar el éxito fue el siguiente:

 self.send_response(200) 

Que envía la línea de encabezado de respuesta inicial, un servidor y un encabezado de fecha, pero deja la secuencia en el estado en el que puede enviar encabezados adicionales también. HTTP requiere una nueva línea adicional después de los encabezados para indicar que han finalizado. Parece que si esta nueva línea no está presente cuando intenta obtener el cuerpo de resultados InputStream o código de respuesta, etc con HttpURLConnection entonces arroja la EOFException (que es realmente razonable, pensando en ello). Algunos clientes HTTP aceptaron la respuesta corta y reportaron el código de resultado de éxito que me llevaron a apuntar injustamente el dedo a HttpURLConnection.

He cambiado mi servidor para hacer esto en su lugar (añadiendo Content-Length para una buena medida):

 self.send_response(200) self.send_header("Content-Length", "0") self.end_headers() 

No más EOFException con ese código. Es posible que las soluciones "Connection: close" desencadenen algún comportamiento en ciertos servidores que podrían funcionar en torno a esto (por ejemplo, asegurando que la respuesta es válida antes del cierre) pero que no era el caso con el python SimpleHTTPServer y la causa raíz resultó ser mi culpa.

NB: Hay algunos errores en Android pre-Froyo (2.2) en relación con mantener las conexiones vivas, pero no creo que haya suficiente información en esta pregunta para afirmar que hay errores de Android en las nuevas versiones.

En primer lugar, compruebe si su URL contiene una nueva línea inesperada ('\ n' o '\ r \ n'), si lo hace, recibirá EOFException al leer la respuesta. La nueva línea troncará los paquetes HTTP y el servidor piensa que el cliente tiene más datos que enviar, por lo que no hay respuesta. Cada intento de leer respuesta obtendrá EOF inmediatamente.

Después de asegurarse de que su solicitud es válida, a continuación, intente soluciones proporcionadas por otros chicos.

Utilizo NetHttpTransport de google-api-java-client así que no era realmente aparente cómo fijar el RequestProperty, cambié para utilizar ApacheHttpTransport y el problema ha desaparecido.

  • Deteniendo reintentos silenciosos en HttpURLConnection
  • Error de NetworkOnMainThreadException en jellybean
  • Código de respuesta inesperado para CONNECT: 400
  • HTC Un error? Partes del encabezado HTTP que aparecen en URLConnection InputStream
  • Inconsistente HttpUrlConnection comportamientos en Android - cómo depurar?
  • Android descargar problemas de archivo binario
  • Obtener java.net.SocketTimeoutException: La conexión se agotó en android
  • HTTPURLConnection - POST multipart / form-data con archivo grande con FixedLengthStreamingMode
  • Longitud de chunk predeterminada de Android HttpURLConnection.setChunkedStreamingMode ()?
  • HttpURLConnection.getResponseCode () devuelve -1 en segunda invocación
  • Android FileNotFound Exception - No se puede getInputStream desde la URL de la imagen que no tiene formato de archivo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.