1

Linebreaks ("\n" or "\r") are been stripped out from gzip response body, when using response compression configuration (as below) in Spring Cloud Open Feign. There are no errors raised. Linebreaks are just been replace by an empty string "". The response has the correct "content-encoding: gzip" header, and a well formed gzipped body content.

Does someone has a clue? It seems a issue for me as I opened here spring-cloud-openfeign/issue400

feign.compression.response.enabled: true
feign.compression.response.useGzipDecoder: true

# Same behaviour using Apache Http as client
feign.httpclient.enabled: true

SpringCloudFeignClient.java

package springcloudfeigngzip;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

@FeignClient(name = "SpringCloudFeignClient", url = "http://localhost:8082")
public interface SpringCloudFeignClient {
    @GetMapping(value = "/gzip")
    String getGzippedString();     
}

ApplicationTest.java:

package springcloudfeigngzip;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.cloud.contract.wiremock.AutoConfigureWireMock;
import static com.github.tomakehurst.wiremock.client.WireMock.*;
import static org.junit.jupiter.api.Assertions.assertEquals;

@SpringBootTest
@AutoConfigureWireMock(port = 8082)
class ApplicationTest {
    @Autowired
    private SpringCloudFeignClient springCloudFeignClient;

    @Test
    void success_GzipOneLine() {
        stubFor(get(urlEqualTo("/gzip")).withHeader("Accept-Encoding", containing("gzip"))
                .willReturn(aResponse().withStatus(200).withBody("lineone")));
    
        String response = springCloudFeignClient.getGzippedString();
        assertEquals("lineone", response); //success
    }

    @Test
    void fail_GzipLineBreak() {
        stubFor(get(urlEqualTo("/gzip")).withHeader("Accept-Encoding", containing("gzip"))
                .willReturn(aResponse().withStatus(200).withBody("lineone\nlinetwo")));
    
        String response = springCloudFeignClient.getGzippedString();
        assertEquals("lineone\nlinetwo", response); //fail!
    }
}

bootstrap.yml:

feign:
  compression:
    response:
      enabled: true
      useGzipDecoder: true

Versions:

org.springframework.boot: 2.3.3.RELEASE
org.springframework.cloud: Hoxton.SR8

Full project here: https://github.com/spring-cloud/spring-cloud-openfeign/files/5147346/spring-cloud-feign-gzip.zip

0 Answers0