From df0bfb415c332f24bca4e2e25e8fba5a7f7c0126 Mon Sep 17 00:00:00 2001 From: hutiefang Date: Thu, 25 Jun 2026 01:23:47 +0800 Subject: [PATCH] fix: avoid duplicate content length header Signed-off-by: hutiefang --- core/src/main/java/feign/DefaultClient.java | 1 - core/src/test/java/feign/ClientTest.java | 37 +++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/feign/DefaultClient.java b/core/src/main/java/feign/DefaultClient.java index d8e02fb4ad..86b9a3e1a4 100644 --- a/core/src/main/java/feign/DefaultClient.java +++ b/core/src/main/java/feign/DefaultClient.java @@ -170,7 +170,6 @@ HttpURLConnection convertAndSend(Request request, Options options) throws IOExce if (field.equals(CONTENT_LENGTH)) { if (!gzipEncodedRequest && !deflateEncodedRequest) { contentLength = Integer.valueOf(value); - connection.addRequestProperty(field, value); } } // Avoid add "Accept-encoding" twice or more when "compression" option is enabled diff --git a/core/src/test/java/feign/ClientTest.java b/core/src/test/java/feign/ClientTest.java index cdfe54d292..7791bb1004 100644 --- a/core/src/test/java/feign/ClientTest.java +++ b/core/src/test/java/feign/ClientTest.java @@ -17,12 +17,19 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; +import static org.mockito.Mockito.anyString; +import static org.mockito.Mockito.eq; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import java.io.ByteArrayOutputStream; import java.io.IOException; import java.net.HttpURLConnection; +import java.net.URL; import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.util.*; import org.junit.jupiter.api.Test; import org.mockito.ArgumentMatchers; @@ -100,4 +107,34 @@ void testConvertAndSendWithContentLength() throws IOException { */ assertNull(requestProperties.get(Util.CONTENT_LENGTH)); } + + @Test + void testConvertAndSendDoesNotAddContentLengthHeaderForBody() throws IOException { + Map> headers = new LinkedHashMap<>(); + headers.put(Util.CONTENT_LENGTH, Collections.singletonList("3")); + + HttpURLConnection connection = mock(HttpURLConnection.class); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + when(connection.getOutputStream()).thenReturn(output); + DefaultClient defaultClient = + new DefaultClient(null, null) { + @Override + public HttpURLConnection getConnection(URL url) { + return connection; + } + }; + Request request = + Request.create( + Request.HttpMethod.POST, + "http://example.com", + headers, + "foo".getBytes(StandardCharsets.UTF_8), + StandardCharsets.UTF_8, + mock(RequestTemplate.class)); + + defaultClient.convertAndSend(request, mock(Request.Options.class)); + + verify(connection, never()).addRequestProperty(eq(Util.CONTENT_LENGTH), anyString()); + assertEquals("foo", new String(output.toByteArray(), StandardCharsets.UTF_8)); + } }