Я пытаюсь сделать «возобновляемый» 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.