Skip to content

Commit f09a72d

Browse files
skrzeptovelo
andauthored
Only allow a single content-type header to be applied while using googlehttpclient (#1737)
* Only allow a single content-type header to be applied while using google client * Run code formatter * Run formatter again via cmd line Co-authored-by: Marvin Froeder <velo@users.noreply.github.com>
1 parent 6fe951c commit f09a72d

File tree

2 files changed

+31
-1
lines changed

2 files changed

+31
-1
lines changed

googlehttpclient/src/main/java/feign/googlehttpclient/GoogleHttpClient.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,12 @@ private final HttpRequest convertRequest(final Request inputRequest,
8787
// Setup headers
8888
final HttpHeaders headers = new HttpHeaders();
8989
for (final Map.Entry<String, Collection<String>> header : inputRequest.headers().entrySet()) {
90-
headers.set(header.getKey(), header.getValue());
90+
// We already set the Content-Type header via ByteArrayContent
91+
// Content-Type is defined as a singleton field
92+
// https://www.rfc-editor.org/rfc/rfc9110.html#section-8.3-7
93+
if (!header.getKey().equals("Content-Type")) {
94+
headers.set(header.getKey(), header.getValue());
95+
}
9196
}
9297
// Some servers don't do well with no Accept header
9398
if (inputRequest.headers().get("Accept") == null) {

googlehttpclient/src/test/java/feign/googlehttpclient/GoogleHttpClientTest.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,16 @@
1515

1616
import feign.Feign;
1717
import feign.Feign.Builder;
18+
import feign.Response;
19+
import feign.Util;
20+
import feign.assertj.MockWebServerAssertions;
1821
import feign.client.AbstractClientTest;
22+
import okhttp3.mockwebserver.MockResponse;
23+
import org.junit.Test;
24+
import java.util.Collections;
25+
import static feign.Util.UTF_8;
26+
import static org.assertj.core.api.Assertions.entry;
27+
import static org.junit.Assert.assertEquals;
1928
import static org.junit.Assume.assumeFalse;
2029

2130
public class GoogleHttpClientTest extends AbstractClientTest {
@@ -55,4 +64,20 @@ public void canExceptCaseInsensitiveHeader() throws Exception {
5564
assumeFalse("Google HTTP client client do not support gzip compression", false);
5665
}
5766

67+
@Test
68+
public void testContentTypeHeaderGetsAddedOnce() throws Exception {
69+
server.enqueue(new MockResponse()
70+
.setBody("AAAAAAAA"));
71+
TestInterface api = newBuilder()
72+
.target(TestInterface.class, "http://localhost:" + server.getPort());
73+
74+
Response response = api.postWithContentType("foo", "text/plain");
75+
// Response length should not be null
76+
assertEquals("AAAAAAAA", Util.toString(response.body().asReader(UTF_8)));
77+
78+
MockWebServerAssertions.assertThat(server.takeRequest())
79+
.hasHeaders(entry("Content-Type", Collections.singletonList("text/plain")),
80+
entry("Content-Length", Collections.singletonList("3")))
81+
.hasMethod("POST");
82+
}
5883
}

0 commit comments

Comments
 (0)