diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/support/SpringEncoder.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/support/SpringEncoder.java index df43302f..39351ded 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/support/SpringEncoder.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/support/SpringEncoder.java @@ -28,6 +28,7 @@ import org.springframework.boot.autoconfigure.web.HttpMessageConverters; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpOutputMessage; import org.springframework.http.MediaType; +import org.springframework.http.converter.ByteArrayHttpMessageConverter; import org.springframework.http.converter.HttpMessageConverter; import feign.RequestTemplate; @@ -95,8 +96,12 @@ public class SpringEncoder implements Encoder { // with the modified headers request.headers(getHeaders(outputMessage.getHeaders())); - request.body(outputMessage.getOutputStream().toByteArray(), - Charset.forName("UTF-8")); // TODO: set charset + // do not use charset for binary data + if (messageConverter instanceof ByteArrayHttpMessageConverter) { + request.body(outputMessage.getOutputStream().toByteArray(), null); + } else { + request.body(outputMessage.getOutputStream().toByteArray(), Charset.forName("UTF-8")); + } return; } } diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/support/SpringEncoderTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/support/SpringEncoderTests.java index 0bf281c8..e7da6d03 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/support/SpringEncoderTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/support/SpringEncoderTests.java @@ -2,10 +2,12 @@ package org.springframework.cloud.netflix.feign.support; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.Matchers.nullValue; import static org.junit.Assert.assertThat; import java.io.IOException; import java.lang.reflect.Type; +import java.nio.charset.Charset; import java.util.Collection; import org.junit.Test; @@ -63,8 +65,22 @@ public class SpringEncoderTests { String header = contentTypeHeader.iterator().next(); assertThat("content type header is wrong", header, is("application/mytype")); + + assertThat("request charset is null", request.charset(), is(notNullValue())); + assertThat("request charset is wrong", request.charset(), is(Charset.forName("UTF-8"))); } + @Test + public void testBinaryData() { + SpringEncoder encoder = this.context.getInstance("foo", SpringEncoder.class); + assertThat(encoder, is(notNullValue())); + RequestTemplate request = new RequestTemplate(); + + encoder.encode("hi".getBytes(), null, request); + + assertThat("request charset is not null", request.charset(), is(nullValue())); + } + class MediaTypeMatcher extends ArgumentMatcher { private MediaType mediaType; @@ -129,7 +145,10 @@ public class SpringEncoderTests { @Override public boolean canWrite(Class clazz, MediaType mediaType) { - return true; + if (clazz == String.class) { + return true; + } + return false; } @Override