diff --git a/core/src/main/java/feign/DefaultClient.java b/core/src/main/java/feign/DefaultClient.java index d8e02fb4ad..0ab6bf10ae 100644 --- a/core/src/main/java/feign/DefaultClient.java +++ b/core/src/main/java/feign/DefaultClient.java @@ -218,7 +218,9 @@ else if (field.equals(ACCEPT_ENCODING)) { } } - if (body == null && request.httpMethod().isWithBody()) { + if (body == null + && request.httpMethod().isWithBody() + && !request.headers().containsKey(CONTENT_LENGTH)) { // To use this Header, set 'sun.net.http.allowRestrictedHeaders' property true. connection.addRequestProperty("Content-Length", "0"); } diff --git a/core/src/test/java/feign/client/DefaultClientTest.java b/core/src/test/java/feign/client/DefaultClientTest.java index c61b1b0a4d..6f84acee9d 100644 --- a/core/src/test/java/feign/client/DefaultClientTest.java +++ b/core/src/test/java/feign/client/DefaultClientTest.java @@ -24,6 +24,8 @@ import feign.DefaultClient; import feign.Feign; import feign.Feign.Builder; +import feign.Headers; +import feign.RequestLine; import feign.RetryableException; import feign.assertj.MockWebServerAssertions; import java.io.IOException; @@ -101,6 +103,25 @@ public void noRequestBodyForPostWithAllowRestrictedHeaders() throws Exception { .hasHeaders(entry("Content-Length", Collections.singletonList("0"))); } + @Test + @EnabledIfSystemProperty(named = "sun.net.http.allowRestrictedHeaders", matches = "true") + public void contentLengthHeaderIsNotDuplicatedForBodylessRequest() throws Exception { + server.enqueue(new MockResponse()); + + ContentLengthInterface api = + newBuilder().target(ContentLengthInterface.class, "http://localhost:" + server.getPort()); + + api.postEmpty(); + + assertThat(server.takeRequest().getHeaders().values("Content-Length")).containsExactly("0"); + } + + interface ContentLengthInterface { + @RequestLine("POST /") + @Headers("Content-Length: 0") + void postEmpty(); + } + @Test @Override public void noResponseBodyForPut() throws Exception {