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:
- La sincronización bidireccional para las cookies entre HttpURLConnection (java.net.CookieManager) y WebView (android.webkit.CookieManager)
- URLConnection getContentLength () devuelve un valor negativo
- Diferencia entre okhttp y httpurlconnection?
- Pase las cookies de HttpURLConnection (java.net.CookieManager) a WebView (android.webkit.CookieManager)
- HttpURLConnection Post: El flujo de salida no tiene efecto?
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
- Android: Cómo iniciar sesión en la página web mediante programación, mediante HttpsURLConnection
- Android descargar pdf de url luego abrirlo con un lector de pdf
- GetHttpResponseCode () devuelve -1 en android 2.2
- ¿Qué devuelve el método getResponseMessage () de HttpURLConnection?
- Cómo agregar parámetros a HttpURLConnection mediante POST
- AndroidHttpClient versus HttpUrlConnection para API Nivel 9 y superior
- No se puede ejecutar un AlertDialog en un método doInbackground ()
- Android permite múltiples archivos de carga (Max 150 MB) a PHP Server
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.