Как понять, что ответ полностью загружен, если нет заголовка Content-Length - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь загрузить большой файл с внешнего сервера через HTTP. Ответ не имеет заголовка Content-Length, но имеет Transfer-Encoding: chunked.

В моей Java-программе я делаю следующее:

  1. Выполнить запрос GET и получить InputStream ответа
  2. Чтение 10 МБ из входного потока
  3. Сон в течение 100 секунд
  4. Продолжить чтение ответа (и на самом деле данных больше, возможно, из разных буферов - приложения, ОС и т. Д.)

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

Я понимаю, что сервер не может ждать меня бесконечно, но есть ли способ для клиента понять, был ли полностью загружен ответ или нет?

Я использую 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();

Спасибо!

...