OkHttpClient зависает после получения 202 при выполнении последующего запроса - PullRequest
0 голосов
/ 29 апреля 2020

Я пытаюсь сделать «возобновляемый» PUT-запрос на загрузку файла в бэкэнд с помощью OkHttpClient. Вот рабочий процесс:

Разделите файл на 5 МБ. Для каждого куска загрузите его в бэкэнд. Успешная загрузка фрагмента обозначена 202, за исключением последнего фрагмента, который возвращает 200.

Вот код, который работает с URLConnection:

val sessionUuid = UUID.randomUUID()
var readSoFar = 0
var connection: HttpsURLConnection? = null
file.forEachBlock(CHUNK_SIZE, action = { buffer, bytesRead ->

    val contentRange = "bytes $readSoFar-${readSoFar + bytesRead - 1}/${file.length()}"
    val url = URL(token.url)
    connection = url.openConnection() as HttpsURLConnection
    connection.doOutput = true
    connection.addRequestProperty("Content-Range", contentRange)
    connection.addRequestProperty("Session-Id", sessionUuid.toString())
    token.fields.entries.forEach { (key, value) -> connection.addRequestProperty(key, value) }
    connection.requestMethod = "PUT"
    connection.connect()
    connection.outputStream.write(buffer, 0, bytesRead)
    status = connection.responseCode
    readSoFar += bytesRead
}

И для файла 14 МБ мы получаем 202, 202 и 200 из бэкэнда.

Вот код, использующий OkHttpClient:

val sessionUuid = UUID.randomUUID()
var readSoFar = 0
file.forEachBlock(CHUNK_SIZE, action = { buffer, bytesRead ->
    val contentRange = "bytes $readSoFar-${readSoFar + bytesRead - 1}/${file.length()}"

    val requestBuilder = Request
        .Builder()
        .url(token.url)
        .method("PUT", RequestBody.create(null, buffer))
        .addHeader("Content-Range", contentRange)
        .addHeader("Session-Id", sessionUuid.toString())

    token.fields.entries.forEach { (key, value) -> requestBuilder.addHeader(key, value) }

    val response = okHttpClient.newCall(requestBuilder.build()).execute()
    status = response.code
    response.close()
    readSoFar += bytesRead
}

Первый блок успешно загружен с 202. Второй блок зависает, и запрос заканчивается бросая SocketTimeoutException каждый раз.

Есть идеи, почему висит второй запрос, сделанный с OkHttpClient? Я пытался увеличить все таймауты до 6 минут, но запрос по-прежнему не go.

...