нормально http только для тайм-аута, когда данные не были отправлены или получены в течение некоторого времени - PullRequest
0 голосов
/ 19 марта 2020

Можно ли настроить okhttp на тайм-аут только в том случае, если в течение последних X секунд не происходило ни чтения, ни записи.

У меня есть случай, когда я sh загружу большой файл или скачаю файл. Однако, большой файл, если время ожидания чтения / записи меньше, чем общее время, необходимое для загрузки / загрузки.

Например:

read timeout = 5 seconds
write timeout = 5 seconds
We upload 100MB every second, and the file to upload is 2GB so it takes 20 seconds to upload.

Это приводит к чтению время ожидания истекает при ожидании чтения, даже если на сервер все еще отправляются байты.

Можно ли выбрасывать исключения тайм-аута, когда ничего не было передано в течение 5 секунд, таким образом, исключение выдается, когда загрузка останавливается.

Вот пример клиента:

OkHttpClient client = new OkHttpClient();
client = client.newBuilder()
    .readTimeout(Duration.ofSeconds(1))
    .writeTimeout(Duration.ofSeconds(1000000))
    .sslSocketFactory(/** conscrypt and trust store set */)
    .hostnameVerifier(/** my host name verifier */)
    .build();


Request request = new Request.Builder()
      .url(serverRoot)
      .put(RequestBody.create(new byte[SlowUploadTestServlet.MB_TO_SEND*1024*1024]))
      .build();

try (Response response = client.newCall(request).execute()) {
    System.out.println(response.body().string());
}

и ответ:

Caused by: java.net.SocketTimeoutException: timeout
    at okio.SocketAsyncTimeout.newTimeoutException(Okio.kt:149)
    at okio.AsyncTimeout.access$newTimeoutException(AsyncTimeout.kt:162)
    at okio.AsyncTimeout$source$1.read(AsyncTimeout.kt:340)
    at okio.RealBufferedSource.indexOf(RealBufferedSource.kt:449)
    at okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.kt:333)
    at okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.kt:105)
    at okhttp3.internal.http1.Http1ExchangeCodec$ChunkedSource.readChunkSize(Http1ExchangeCodec.kt:444)
    at okhttp3.internal.http1.Http1ExchangeCodec$ChunkedSource.read(Http1ExchangeCodec.kt:426)
    at okhttp3.internal.connection.Exchange$ResponseBodySource.read(Exchange.kt:276)
    at okio.Buffer.writeAll(Buffer.kt:1655)
    at okio.RealBufferedSource.readString(RealBufferedSource.kt:95)
    at okhttp3.ResponseBody.string(ResponseBody.kt:187)
    at com.funnelback.api.core.DefaultRestTimeoutIT.lambda$12(DefaultRestTimeoutIT.java:276)
    ... 25 more
Caused by: java.net.SocketException: socket is closed
    at org.conscrypt.ConscryptFileDescriptorSocket$SSLInputStream.read(ConscryptFileDescriptorSocket.java:552)
    at okio.InputStreamSource.read(Okio.kt:93)
    at okio.AsyncTimeout$source$1.read(AsyncTimeout.kt:129)
    ... 35 more
...