Я пытаюсь загрузить большой файл с внешнего сервера через HTTP. Ответ не имеет заголовка Content-Length
, но имеет Transfer-Encoding: chunked
.
В моей Java-программе я делаю следующее:
- Выполнить запрос GET и получить InputStream ответа
- Чтение 10 МБ из входного потока
- Сон в течение 100 секунд
- Продолжить чтение ответа (и на самом деле данных больше, возможно, из разных буферов - приложения, ОС и т. Д.)
Программа завершается без каких-либо исключений. Однако я знаю, что он не загрузил весь файл, потому что без спящего размер ответа был бы намного больше.
Я понимаю, что сервер не может ждать меня бесконечно, но есть ли способ для клиента понять, был ли полностью загружен ответ или нет?
Я использую apache httpcomponents: httpclient v4.5.6.
var client = HttpClients.custom()
.disableContentCompression()
.build();
HttpGet request = createRequest();
var response = client.execute(request);
var is = response.getEntity().getContent();
int count = 0;
var os = new FileOutputStream("/tmp/test.gz");
byte[] buffer = new byte[512];
int read = is.read(buffer);
while (read >= 0) {
os.write(buffer, 0, read);
read = is.read(buffer);
count++;
if (count == 10_000) {
Thread.sleep(100_000);
}
}
is.close();
os.close();
Спасибо!