Skip to content

RestTemplate cannot handle GZIP response since 4.1.3 [SPR-12712] #17309

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
spring-projects-issues opened this issue Feb 12, 2015 · 1 comment
Closed
Assignees
Labels
in: web Issues in web modules (web, webmvc, webflux, websocket) status: duplicate A duplicate of another issue
Milestone

Comments

@spring-projects-issues
Copy link
Collaborator

spring-projects-issues commented Feb 12, 2015

Moosh Ben opened SPR-12712 and commented

We are using RestTemplate in our project with HttpClient.
Calling an API that returns a Gzipped response stopped working after upgrading to 4.1.3 (also not working in 4.1.4) .

RestTemplate creation:

RestTemplate rt = new RestTemplate();
		
List<HttpMessageConverter<?>> messageConverters = new ArrayList<>();

Jaxb2RootElementHttpMessageConverter xmlConverter = new Jaxb2RootElementHttpMessageConverter();
List<MediaType> mediaTypes = new ArrayList<MediaType>();
mediaTypes.add(MediaType.APPLICATION_XML);
mediaTypes.add(MediaType.TEXT_XML);
xmlConverter.setSupportedMediaTypes(mediaTypes);
messageConverters.add(xmlConverter);

MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
mediaTypes = new ArrayList<MediaType>();
mediaTypes.add(MediaType.APPLICATION_JSON);

// Only valid for qualys
mediaTypes.add(MediaType.TEXT_HTML);
jsonConverter.setSupportedMediaTypes(mediaTypes);
messageConverters.add(jsonConverter);

messageConverters.add(new StringHttpMessageConverter(Charset.forName( "UTF-8")));
messageConverters.add(new FormHttpMessageConverter());

MultiPartMessageConverter multipartConverter = new MultiPartMessageConverter();
mediaTypes = new ArrayList<MediaType>();
mediaTypes.add(new MediaType("multipart", "mixed"));

multipartConverter.setSupportedMediaTypes(mediaTypes);
messageConverters.add(multipartConverter);

rt.setMessageConverters(messageConverters);
rt.setRequestFactory(new HttpComponentsClientHttpRequestFactory(httpClientFactory.getHttpClient()));

return rt;

Trace log of request and response (check the last line that prints the response of the exchange call):

2015-02-12 12:47:39,500 DEBUG RestTemplate             :78   - Created POST request for "https://1.1.1.1/test"
2015-02-12 12:47:39,500 DEBUG RestTemplate             :696  - Setting request Accept header to [application/json, text/html, text/plain, */*]
2015-02-12 12:47:39,547 DEBUG RestTemplate             :769  - Writing [{name=[value]}] as "application/x-www-form-urlencoded" using [org.springframework.http.converter.FormHttpMessageConverter@4f836d9]
2015-02-12 12:47:39,579 DEBUG RequestAddCookies        :122  - CookieSpec selected: default
2015-02-12 12:47:39,579 DEBUG RequestAddCookies        :151  - Unsupported cookie policy: default
2015-02-12 12:47:39,579 DEBUG RequestAuthCache         :76   - Auth cache not set in the context
2015-02-12 12:47:39,579 DEBUG tpClientConnectionManager:249  - Connection request: [route: {s}->https://1.1.1.1][total kept alive: 0; route allocated: 0 of 20; total allocated: 0 of 200]
2015-02-12 12:47:39,625 DEBUG tpClientConnectionManager:282  - Connection leased: [id: 0][route: {s}->https://1.1.1.1][total kept alive: 0; route allocated: 1 of 20; total allocated: 1 of 200]
2015-02-12 12:47:39,625 DEBUG MainClientExec           :234  - Opening connection {s}->https://1.1.1.1
2015-02-12 12:47:39,641 DEBUG pClientConnectionOperator:131  - Connecting to /1.1.1.1
2015-02-12 12:47:39,641 DEBUG SLConnectionSocketFactory:336  - Connecting socket to /1.1.1.1 with timeout 0
2015-02-12 12:47:40,109 DEBUG SLConnectionSocketFactory:389  - Enabled protocols: [TLSv1, TLSv1.1, TLSv1.2]
2015-02-12 12:47:40,109 DEBUG SLConnectionSocketFactory:390  - Enabled cipher suites:[TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256, TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, TLS_DHE_DSS_WITH_AES_128_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDH_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_DSS_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA, TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, TLS_ECDHE_RSA_WITH_RC4_128_SHA, SSL_RSA_WITH_RC4_128_SHA, TLS_ECDH_ECDSA_WITH_RC4_128_SHA, TLS_ECDH_RSA_WITH_RC4_128_SHA, SSL_RSA_WITH_RC4_128_MD5, TLS_EMPTY_RENEGOTIATION_INFO_SCSV]
2015-02-12 12:47:40,109 DEBUG SLConnectionSocketFactory:394  - Starting handshake
2015-02-12 12:47:40,312 DEBUG SLConnectionSocketFactory:424  - Secure session established
2015-02-12 12:47:40,312 DEBUG SLConnectionSocketFactory:425  -  negotiated protocol: TLSv1
2015-02-12 12:47:40,312 DEBUG SLConnectionSocketFactory:426  -  negotiated cipher suite: TLS_RSA_WITH_AES_128_CBC_SHA
2015-02-12 12:47:40,312 DEBUG SLConnectionSocketFactory:434  -  peer principal: CN=Test, ST=NY, C=US, L=New York, OU=My Server, O=My Users United
2015-02-12 12:47:40,312 DEBUG SLConnectionSocketFactory:447  -  issuer principal: CN=My Certification Authority (5c858e74), ST=NY, C=US, L=New York, OU=My Certification Authority (5c858e74), O=My Users United
2015-02-12 12:47:40,312 DEBUG pClientConnectionOperator:138  - Connection established 192.168.3.182:51715<->1.1.1.1
2015-02-12 12:47:40,312 DEBUG MainClientExec           :255  - Executing request POST /test HTTP/1.1
2015-02-12 12:47:40,312 DEBUG MainClientExec           :260  - Target auth state: UNCHALLENGED
2015-02-12 12:47:40,312 DEBUG MainClientExec           :266  - Proxy auth state: UNCHALLENGED
2015-02-12 12:47:40,327 DEBUG headers                  :124  - http-outgoing-0 >> POST /test HTTP/1.1
2015-02-12 12:47:40,327 DEBUG headers                  :127  - http-outgoing-0 >> Accept: application/json, text/html, text/plain, */*
2015-02-12 12:47:40,327 DEBUG headers                  :127  - http-outgoing-0 >> Content-Type: application/x-www-form-urlencoded
2015-02-12 12:47:40,327 DEBUG headers                  :127  - http-outgoing-0 >> Cookie: token=00e645824aa40ffb1c0819017d0a3dffdc64c3d5ae86d0f5
2015-02-12 12:47:40,327 DEBUG headers                  :127  - http-outgoing-0 >> Content-Length: 88
2015-02-12 12:47:40,327 DEBUG headers                  :127  - http-outgoing-0 >> Host: 1.1.1.1
2015-02-12 12:47:40,327 DEBUG headers                  :127  - http-outgoing-0 >> Connection: Keep-Alive
2015-02-12 12:47:40,327 DEBUG headers                  :127  - http-outgoing-0 >> User-Agent: Apache-HttpClient/4.4 (Java 1.5 minimum; Java/1.8.0_31)
2015-02-12 12:47:40,327 DEBUG headers                  :127  - http-outgoing-0 >> Accept-Encoding: gzip,deflate
2015-02-12 12:47:40,327 DEBUG wire                     :72   - http-outgoing-0 >> "POST /test HTTP/1.1[\r][\n]"
2015-02-12 12:47:40,327 DEBUG wire                     :72   - http-outgoing-0 >> "Accept: application/json, text/html, text/plain, */*[\r][\n]"
2015-02-12 12:47:40,327 DEBUG wire                     :72   - http-outgoing-0 >> "Content-Type: application/x-www-form-urlencoded[\r][\n]"
2015-02-12 12:47:40,327 DEBUG wire                     :72   - http-outgoing-0 >> "Cookie: token=00e645824aa40ffb1c0819017d0a3dffdc64c3d5ae86d0f5[\r][\n]"
2015-02-12 12:47:40,327 DEBUG wire                     :72   - http-outgoing-0 >> "Content-Length: 88[\r][\n]"
2015-02-12 12:47:40,327 DEBUG wire                     :72   - http-outgoing-0 >> "Host: 1.1.1.1[\r][\n]"
2015-02-12 12:47:40,327 DEBUG wire                     :72   - http-outgoing-0 >> "Connection: Keep-Alive[\r][\n]"
2015-02-12 12:47:40,327 DEBUG wire                     :72   - http-outgoing-0 >> "User-Agent: Apache-HttpClient/4.4 (Java 1.5 minimum; Java/1.8.0_31)[\r][\n]"
2015-02-12 12:47:40,327 DEBUG wire                     :72   - http-outgoing-0 >> "Accept-Encoding: gzip,deflate[\r][\n]"
2015-02-12 12:47:40,327 DEBUG wire                     :72   - http-outgoing-0 >> "[\r][\n]"
2015-02-12 12:47:40,327 DEBUG wire                     :86   - http-outgoing-0 >> "name=value"
2015-02-12 12:47:40,327 DEBUG wire                     :72   - http-outgoing-0 << "HTTP/1.1 200 OK[\r][\n]"
2015-02-12 12:47:40,343 DEBUG wire                     :72   - http-outgoing-0 << "Date: Thu, 12 Feb 2015 10:47:40 GMT[\r][\n]"
2015-02-12 12:47:40,343 DEBUG wire                     :72   - http-outgoing-0 << "Server: MyWWW[\r][\n]"
2015-02-12 12:47:40,343 DEBUG wire                     :72   - http-outgoing-0 << "Connection: close[\r][\n]"
2015-02-12 12:47:40,343 DEBUG wire                     :72   - http-outgoing-0 << "Expires: Thu, 12 Feb 2015 10:47:40 GMT[\r][\n]"
2015-02-12 12:47:40,343 DEBUG wire                     :72   - http-outgoing-0 << "Content-Length: 122[\r][\n]"
2015-02-12 12:47:40,343 DEBUG wire                     :72   - http-outgoing-0 << "Content-Type: text/xml[\r][\n]"
2015-02-12 12:47:40,343 DEBUG wire                     :72   - http-outgoing-0 << "Content-Encoding: gzip[\r][\n]"
2015-02-12 12:47:40,343 DEBUG wire                     :72   - http-outgoing-0 << "X-Frame-Options: DENY[\r][\n]"
2015-02-12 12:47:40,343 DEBUG wire                     :72   - http-outgoing-0 << "Cache-Control: [\r][\n]"
2015-02-12 12:47:40,343 DEBUG wire                     :72   - http-outgoing-0 << "Expires: 0[\r][\n]"
2015-02-12 12:47:40,343 DEBUG wire                     :72   - http-outgoing-0 << "Pragma: [\r][\n]"
2015-02-12 12:47:40,343 DEBUG wire                     :72   - http-outgoing-0 << "[\r][\n]"
2015-02-12 12:47:40,343 DEBUG wire                     :72   - http-outgoing-0 << "[0x1f][0x8b][0x8][0x0][0x0][0x0][0x0][0x0][0x0][0x3][0xb3][0xb1][0xaf][0xc8][0xcd]Q(K-*[0xce][0xcc][0xcf][0xb3]U2[0xd4]3PRH[0xcd]K[0xce]O[0xc9][0xcc]K[0xb7]U[\n]"
2015-02-12 12:47:40,343 DEBUG wire                     :72   - http-outgoing-0 << "[\r]q[0xd3][0xb5]P[0xb2][0xb7][0xe3][0xb2])J-[0xc8][0xa9][0x4][0xd2][0xc5][0xa9][0x85]v6[0xfa] [0x12][0xc8].I,)-[0xb6][0xf3][0xf7][0x6][\n]"
2015-02-12 12:47:40,343 DEBUG wire                     :86   - http-outgoing-0 << "@[0x98]\6[0xc9][0xf9]y%[0xa9]y%[0xc5]v6[0x5]9[0xa5][0xe9][0x99]y>[0x99][0xc5]%@[\r]H[0x1c].[0x1b]}[0xb8]" [0x1b]b0[0x0][0x9e]'[0xc0][0xa8][0x87][0x0][0x0][0x0]"
2015-02-12 12:47:40,343 DEBUG headers                  :113  - http-outgoing-0 << HTTP/1.1 200 OK
2015-02-12 12:47:40,343 DEBUG headers                  :116  - http-outgoing-0 << Date: Thu, 12 Feb 2015 10:47:40 GMT
2015-02-12 12:47:40,343 DEBUG headers                  :116  - http-outgoing-0 << Server: MyWWW
2015-02-12 12:47:40,343 DEBUG headers                  :116  - http-outgoing-0 << Connection: close
2015-02-12 12:47:40,343 DEBUG headers                  :116  - http-outgoing-0 << Expires: Thu, 12 Feb 2015 10:47:40 GMT
2015-02-12 12:47:40,343 DEBUG headers                  :116  - http-outgoing-0 << Content-Length: 122
2015-02-12 12:47:40,343 DEBUG headers                  :116  - http-outgoing-0 << Content-Type: text/xml
2015-02-12 12:47:40,343 DEBUG headers                  :116  - http-outgoing-0 << Content-Encoding: gzip
2015-02-12 12:47:40,343 DEBUG headers                  :116  - http-outgoing-0 << X-Frame-Options: DENY
2015-02-12 12:47:40,359 DEBUG headers                  :116  - http-outgoing-0 << Cache-Control: 
2015-02-12 12:47:40,359 DEBUG headers                  :116  - http-outgoing-0 << Expires: 0
2015-02-12 12:47:40,359 DEBUG headers                  :116  - http-outgoing-0 << Pragma: 
2015-02-12 12:47:40,359 DEBUG ResponseProcessCookies   :76   - Cookie spec not specified in HTTP context
2015-02-12 12:47:40,374 DEBUG RestTemplate             :596  - POST request for "https://1.1.1.1/test" resulted in 200 (OK)
2015-02-12 12:47:40,390 DEBUG nagedHttpClientConnection:87   - http-outgoing-0: Shutdown connection
2015-02-12 12:47:40,390 DEBUG MainClientExec           :128  - Connection discarded
2015-02-12 12:47:40,390 DEBUG nagedHttpClientConnection:79   - http-outgoing-0: Close connection
2015-02-12 12:47:40,390 DEBUG tpClientConnectionManager:320  - Connection released: [id: 0][route: {s}->https://1.1.1.1][total kept alive: 0; route allocated: 0 of 20; total allocated: 0 of 200]
2015-02-12 12:48:12,022 INFO  TestTask                 :67   - Response: null

Affects: 4.1.3, 4.1.4

Issue Links:

@spring-projects-issues
Copy link
Collaborator Author

spring-projects-issues commented Feb 13, 2015

Brian Clozel commented

Hi Moosh Ben

This has been resolved as part of #12671; this is not related to the response being gzipped, but rather because the response has a "Connection: close" HTTP header.

This is already fixed for the next version, 4.1.5.

Thanks for the detailed report!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
in: web Issues in web modules (web, webmvc, webflux, websocket) status: duplicate A duplicate of another issue
Projects
None yet
Development

No branches or pull requests

2 participants