HttpURLConnection从不使用gzip

时间:2014-10-12 06:17:53

标签: java android http

我正在开发一款应用程序,它应该(相当精确地)衡量网页的大小。

我现在正在努力的是我需要知道网站上特定文件的大小。我有一个URL数组,我尝试获取其标题以获取Content-Length,但是一些文件返回-1,因为它们是分块的。如果它们返回-1,我会尝试下载它们以获得它们的大小。

这就是问题所在 - 我发现我总是得到文件的未压缩版本。

示例文件 - http://www.google-analytics.com/analytics.js

当我在Chrome中打开它时,标题会显示:

但是,当我使用HttpURLConnection下载它时,它的大小为25421字节,当我检查Content-Encoding标头时,它总是为空。

connection = (HttpURLConnection)(new URL(url)).openConnection();
connection.setRequestProperty("Accept-Encoding", "gzip");
connection.connect();
int contentLength = connection.getContentLength();

if (contentLength == -1 && connection != null) {
  InputStream input = connection.getInputStream();
  byte[] buffer = new byte[4096];
  int count = 0, len;
  while ((len = input.read(buffer)) > 0) {
    count += len;
  }
  contentLength = count;
}

所以问题是,我用我的应用程序下载了一个网页,并说它有(比方说)400kB。但是当我使用某种工具(如http://tools.pingdom.com/fpt/)下载它时,大小要小得多,比如100kB,因为大多数脚本都是gzip压缩的,这意味着传输速度较低。 我知道300kB并不是那么多,但是当你使用移动传输时,每个kB都很重要,我希望我的应用程序是精确的。

你能指出我哪里弄错了,或者我怎么能解决这个问题? 谢谢

2 个答案:

答案 0 :(得分:1)

您的HttpURLConnection设置代码对我来说是正确的。您可以尝试将User-Agent设置为标准浏览器,也许服务器试图比它应该更加智能。如果做不到这一点,请通过调试代理(如Fiddler或Burp)运行流量,以查看网络级别的情况。

答案 1 :(得分:0)

如果您使用的是iJetty,则必须首先启用gzip压缩

您必须启用GzipFilter才能使Jetty返回压缩内容。看看如何做到这一点:http://blog.max.berger.name/2010/01/jetty-7-gzip-filter.html

您还可以使用gzip init参数使Jetty搜索压缩内容。这意味着如果请求文件file.txt,Jetty将监视名为file.txt.gz的文件并返回该文件。