如果没有Content-Length标头,如何理解响应已完全下载

时间:2019-01-18 04:37:11

标签: java http apache-httpcomponents

我正在尝试通过HTTP从外部服务器下载大文件。响应没有Content-Length标头,但有Transfer-Encoding: chunked

在我的Java程序中,我执行以下操作:

  1. 执行GET请求并获取响应的InputStream
  2. 从输入流中读取10 MB
  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();

谢谢!

0 个答案:

没有答案