OkHttp java.net.ProtocolException: непредвиденная строка состояния: nullHTTP/1.1 200 OK после ответа 204 NO-CONTENT с использованием того же соединения

Мне нужно выполнить последовательность вызовов, используя одно и то же соединение (okhttpclient соответствует моим потребностям), и один из них возвращает код состояния 204 (без тела), но после успешного "вызова 204":

java.net.ProtocolException: Unexpected status line: nullHTTP/1.1 200 OK
at okhttp3.internal.http.StatusLine.parse(StatusLine.java:69)
at okhttp3.internal.http.Http1xStream.readResponse(Http1xStream.java:184)
at okhttp3.internal.http.Http1xStream.readResponseHeaders(Http1xStream.java:125)
at okhttp3.internal.http.HttpEngine.readNetworkResponse(HttpEngine.java:775)
at okhttp3.internal.http.HttpEngine.access$200(HttpEngine.java:86)
at okhttp3.internal.http.HttpEngine$NetworkInterceptorChain.proceed(HttpEngine.java:760)
at okhttp3.internal.http.HttpEngine.readResponse(HttpEngine.java:613)
at okhttp3.RealCall.getResponse(RealCall.java:244)
at okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java:201)
at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:163)
at okhttp3.RealCall.execute(RealCall.java:57)
at it.test.Main.main(Main.java:48)

При использовании заголовка запроса «Соединение: закрыть» (поэтому повторное использование соединения) проблема не возникает.

Это рабочий основной отчет о проблеме. Он использует okHttp v3.3.0 и okio v1.8.0.

public static void main(String[] args) {
try {
    String url200 = "http://www.cmsservice.provahosting.it/index.php?option=com_cmsmanager&key=ca25131a2f77fb2b80d82e63412fdc13&debug=1&cmd=status";
    String url204 = "http://www.cmsservice.provahosting.it/index.php?option=com_cmsmanager&key=ca25131a2f77fb2b80d82e63412fdc13&debug=1&cmd=getUpdates";

    OkHttpClient client = new OkHttpClient.Builder()
            .connectTimeout(20, TimeUnit.SECONDS)
            .readTimeout(20, TimeUnit.SECONDS).build();

    //First request
    Request request = new Request.Builder()
            .url(url200)/*.addHeader("Connection", "close")*/
            .build();

    Response response = client.newCall(request).execute();
    System.out.println(response.code()+">>>>" + response.body().string().getBytes().length + "<<<<");
    response.body().close();

    //Second request
    Request request2 = new Request.Builder()
            .url(url204)/*.addHeader("Connection", "close")*/
            .build();
    response = client.newCall(request2).execute();
    System.out.println(response.code()+">>>>" + response.body().string().getBytes().length + "<<<<");
    response.body().close();

    //Third request
    Request request3 = new Request.Builder()
            .url(url200)/*.addHeader("Connection", "close")*/
            .build();
    response = client.newCall(request3).execute();
    System.out.println(response.code()+">>>>" + response.body().string().getBytes().length + "<<<<");
    response.body().close();

} catch (Exception e) {
    e.printStackTrace();
}

Может ли кто-нибудь помочь мне понять, что мне не хватает или это ошибка?


person CarloS    schedule 25.05.2016    source источник


Ответы (1)


Похоже, ваш веб-сервер утверждает, что предыдущий ответ не имеет тела, но затем пишет тело из четырех символов «null». Сообщите о проблеме специалистам по обслуживанию веб-сервера, и они должны ее исправить.

person Jesse Wilson    schedule 26.05.2016
comment
Спасибо за ваш ответ. но исполняемый код над телом ответа запроса 204 пуст (0 байт), поэтому я не понимаю, откуда взялся нуль... Предоставляет ли клиент okhttp тело длины 0 по умолчанию для 204? Или он действительно смотрит на стрим? - person CarloS; 26.05.2016
comment
С помощью анализатора пакетов (wireshark) я вижу ноль... так что вы правы :). Tnx снова - person CarloS; 26.05.2016