Uploaded image for project: 'HttpComponents HttpClient'
  1. HttpComponents HttpClient
  2. HTTPCLIENT-1690

ZipException occurs when content-encoding-header is set for 304-response

    XMLWordPrintableJSON

Details

    Description

      Test scenario

      • Setup http server
      • Execute Request twice
      • First response
        • Status: 200
        • Cache-Control: public
        • ETag: 123
        • Body: some text
      • Second response
        • Status: 304
        • Content-Encoding: gzip
      • Effect: java.util.zip.ZipException: Not in GZIP format
      • Expected: Cached response

      JUnit-Test

      • Dependencies: junit 4.11, commons-io 2.4, com.github.tomakehurst:wiremock 1.57
        import com.github.tomakehurst.wiremock.junit.WireMockRule;
        import org.apache.commons.io.IOUtils;
        import org.apache.http.client.methods.CloseableHttpResponse;
        import org.apache.http.client.methods.HttpGet;
        import org.apache.http.impl.client.CloseableHttpClient;
        import org.apache.http.impl.client.HttpClientBuilder;
        import org.apache.http.impl.client.cache.CacheConfig;
        import org.apache.http.impl.client.cache.CachingHttpClientBuilder;
        import org.junit.Assert;
        import org.junit.Rule;
        import org.junit.Test;
        
        import java.io.IOException;
        
        import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
        import static com.github.tomakehurst.wiremock.client.WireMock.equalTo;
        import static com.github.tomakehurst.wiremock.client.WireMock.get;
        import static com.github.tomakehurst.wiremock.client.WireMock.stubFor;
        import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;
        
        public class GZipCachingHttpClientBuilderTest  {
        
          private static final String TEST_BODY = "Sometext";
        
          @Rule
          public WireMockRule wireMockRule = new WireMockRule(0);
        
          @Test
          public void testGzipError() throws Exception {
        
            stubFor(get(urlEqualTo("/my/resource"))
                .willReturn(aResponse()
                        .withStatus(200)
                        .withHeader("Cache-Control", "public")
                        .withHeader("ETag", "123")
                        .withBody(TEST_BODY)
        
                ));
        
        
            stubFor(get(urlEqualTo("/my/resource"))
                .withHeader("If-None-Match", equalTo("123"))
                .willReturn(aResponse()
                        .withHeader("Content-Encoding", "gzip")
                        .withStatus(304)
                ));
        
        
            CacheConfig.Builder cfgBuilder = CacheConfig.custom();
            CacheConfig cfg = cfgBuilder.setMaxCacheEntries(1024).build();
            HttpClientBuilder bld = CachingHttpClientBuilder.create().setCacheConfig(cfg);
        
            CloseableHttpClient client = bld.build();
        
            executeRequest(client);
            executeRequest(client); // second request causes Exception :-(
          }
        
        
          private void executeRequest(CloseableHttpClient client) throws IOException {
            int port = wireMockRule.port();
            CloseableHttpResponse resp = client.execute(new HttpGet("http://localhost:"+port+"/my/resource"));
            Assert.assertEquals(TEST_BODY, IOUtils.toString(resp.getEntity().getContent()));
          }
        
        }
        

      Attachments

        Activity

          People

            Unassigned Unassigned
            johannes.gruber Johannes Gruber
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: