OpenFeign / feign

Feign makes writing java http clients easier
Apache License 2.0
9.37k stars 1.91k forks source link

java.lang.IllegalArgumentException: Deflate Content-Encoding is not supported by feign-hc5 #2460

Open beifuyiqiedeqilin opened 4 weeks ago

beifuyiqiedeqilin commented 4 weeks ago

When we upgraded to spring-boot-dependencies-3.3.0, we also upgrade the spring-cloud according to https://spring.io/blog/2024/05/31/spring-cloud-2023-0-2-oss-and-2022-0-7-enterprise-have-been-released, Then my service met error "Caused by: java.lang.IllegalArgumentException: Deflate Content-Encoding is not supported by feign-hc5"

Here is some finding of troubleshooting:

As we set spring.cloud.openfeign.compression.request.enabled=true, so the FeignContentGzipEncodingInterceptor(spring-cloud-openfeign-core-4.1.2) is enabled too

public class FeignContentGzipEncodingInterceptor extends BaseRequestInterceptor {
    @Override
    public void apply(RequestTemplate template) {
        if (requiresCompression(template)) {
        addHeader(template, HttpEncoding.CONTENT_ENCODING_HEADER, HttpEncoding.GZIP_ENCODING,
                    HttpEncoding.DEFLATE_ENCODING);
    }
    }
}

If the compression condition matched, it will add fixed header(Content-Encoding: gzip,deflate), but after the PR https://github.com/OpenFeign/feign/pull/2247, it will throw IllegalArgumentException once 'deflate' exists in header 'Content-Encoding'

if (headerName.equalsIgnoreCase(Util.CONTENT_ENCODING)) {
        isGzip = headerEntry.getValue().stream().anyMatch(Util.ENCODING_GZIP::equalsIgnoreCase);
        boolean isDeflate =
            headerEntry.getValue().stream().anyMatch(Util.ENCODING_DEFLATE::equalsIgnoreCase);
        if (isDeflate) {
          // DeflateCompressingEntity not available in hc5 yet
          throw new IllegalArgumentException(
              "Deflate Content-Encoding is not supported by feign-hc5");
        }
      }

I think it is incompatible change, @fbus or term, Please take a look on it