Android HttpsUrlConnection eofexception

у меня проблема, когда мой HttpsURLConnection бросит EOFException, когда я попытаюсь прочитать любой ввод. Код работает для некоторых сетевых вызовов, но терпит неудачу на других. Если я попытаюсь прочитать что-либо из соединения, это не удастся с вышеупомянутой ошибкой.

пример:

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

вот трассировка стека для каждого:

getResponse:

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)

Спасибо за любые помогите,

Рик

редактировать Я нашел ответ:--5-->

это не был хорошо документированный ответ. Он появляется в некоторых из новых версий android, есть ошибка с переработанными подключениями url. Чтобы исправить это (хотя могут быть некоторые проблемы с производительностью), мне нужно добавить:

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

спасибо!

Рик

4 ответов


кто-то попросил меня ответить на мой собственный вопрос вместо редактирования. Итак, вот снова ответ.

это не был хорошо документированный ответ. Он появляется в некоторых из новых версий android, есть ошибка с переработанными подключениями url. Чтобы исправить это (хотя могут быть некоторые проблемы с производительностью), мне нужно добавить:

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

вы не указываете свой сервер, поэтому потенциально он является пользовательским, который вы реализовали самостоятельно. Возможно, ваши ответы не совсем корректны по спецификации HTTP.

мой сервер использовал python SimpleHTTPServer, и я ошибочно предполагал, что все, что мне нужно было сделать, чтобы указать на успех, было следующим:

self.send_response(200)

который отправляет начальную строку заголовка ответа, сервер и заголовок даты, но оставляет поток в состоянии, в котором вы можете отправить дополнительные и заголовки тоже. HTTP требует дополнительной новой строки после заголовков, чтобы указать, что они закончены. Кажется, если эта новая строка отсутствует, когда вы пытаетесь получить тело результата InputStream или код ответа и т. д. С HttpURLConnection, то он бросает EOFException (что на самом деле разумно, думая об этом). Некоторые HTTP-клиенты приняли короткий ответ и сообщили об успешном коде результата, который привел ко мне, возможно, несправедливо указывая пальцем на HttpURLConnection.

I вместо этого изменил мой сервер (добавив длину содержимого для хорошей меры):

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

больше нет EOFException с этим кодом. Возможно, решения "Connection: close" запускают некоторое поведение на определенных серверах, которые могут работать вокруг этого (например, гарантируя, что ответ действителен до закрытия), но это не было в случае с python SimpleHTTPServer, и основной причиной оказалась моя ошибка.

NB: на Android pre-Froyo (2.2) есть некоторые ошибки, связанные с keep-alive соединения, но я не думаю, что в этом вопросе достаточно информации, чтобы утверждать, что есть ошибки Android в новых версиях.


во-первых, проверьте, содержит ли Ваш URL-адрес неожиданную новую строку ('\n' или '\r\n'), если это так, вы получите EOFException при чтении ответа. Новая строка будет передавать HTTP-пакеты, и сервер считает, что у клиента больше данных для отправки, поэтому ответа нет. Каждая попытка прочитать ответ получит EOF немедленно.

после убедитесь, что ваш запрос действителен, а затем попробуйте решения, предоставленные другими парнями.


Я использую NetHttpTransport из google-api-java-client поэтому было не совсем очевидно, как установить RequestProperty, я переключился на использование ApacheHttpTransport, и проблема исчезла.