http服务器不遵守Accept-Encoding:gzip,除非User-Agent是已知的浏览器

时间:2011-08-21 17:59:50

标签: android http gzip user-agent

在发出HTTP请求时,我设置了Accept-Encoding: gzip。但是,我注意到服务器实际上并没有压缩响应,除非User-Agent是“众所周知的”。我有以下用于演示此问题的Android代码,它使用我真棒的用户代理获取“http://www.google.com”,并检查响应是否已压缩:

    HttpParams params = new BasicHttpParams();
    HttpProtocolParams.setUserAgent(params, "MyApp/1.0 (Awesome)");

    DefaultHttpClient client = new DefaultHttpClient(params);       
    HttpGet request = new HttpGet("http://www.google.com");
    request.setHeader("Accept-Encoding", "gzip");

    HttpResponse response = client.execute(request);
    HttpEntity entity = response.getEntity();
    Header header = entity.getContentEncoding();
    boolean isCompressed = false;
    if (header != null) {
        HeaderElement[] codecs = header.getElements();
        for (int i = 0; i < codecs.length; i++) {
            if (codecs[i].getName().equalsIgnoreCase("gzip")) {
                isCompressed = true;
                break;
            }
        }
    }

    if (isCompressed)
        Log.i(TAG, "IT IS COMPRESSED");
    else
        Log.i(TAG, "IT IS NOT COMPRESSED");

运行此代码打印出“它没有被压缩”:(

但如果我将用户代理设置为"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0",则输出“IT IS COMPRESSED”。

我知道服务器的选择是否实际压缩,但为什么选择基于“User-Agent”?是否有任何其他标题选项我应该发送以诱使服务器压缩,而不管用户代理?

修改

我知道在修改Accept-Encoding标头的过程中没有代理/等,因为当我得到http://1.cgi.browserscope.net/cgi-bin/resource.cgi?headers=1时,我看到正确接收到Accept-Encoding标头

1 个答案:

答案 0 :(得分:2)

几乎可以肯定这样做是因为一些传统的用户代理通告了对GZIP的支持,然后无法正确解压缩内容。出于这个原因,已知一些服务器端框架只向已知不会遭受类似错误的客户端发送压缩响应。