diff --git a/CHANGELOG.md b/CHANGELOG.md index d09b251e0a..4c2629bbb4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +### Version 8.10 +* OkHttpClient sends an empty POST body to conform with okhttp 2.4+ + ### Version 8.9 * Skips error handling when return type is `Response` diff --git a/core/src/test/java/feign/client/DefaultClientTest.java b/core/src/test/java/feign/client/DefaultClientTest.java index f0d2246369..c59a9afbc6 100644 --- a/core/src/test/java/feign/client/DefaultClientTest.java +++ b/core/src/test/java/feign/client/DefaultClientTest.java @@ -183,6 +183,16 @@ protected void log(String configKey, String format, Object... args) { api.post("foo"); } + @Test + public void noResponseBody() { + server.enqueue(new MockResponse()); + + TestInterface api = Feign.builder() + .target(TestInterface.class, "http://localhost:" + server.getPort()); + + api.noPostBody(); + } + interface TestInterface { @RequestLine("POST /?foo=bar&foo=baz&qux=") @@ -196,5 +206,8 @@ interface TestInterface { @RequestLine("PATCH /") @Headers("Accept: text/plain") String patch(); + + @RequestLine("POST") + String noPostBody(); } } diff --git a/httpclient/src/test/java/feign/httpclient/ApacheHttpClientTest.java b/httpclient/src/test/java/feign/httpclient/ApacheHttpClientTest.java index c91ce3cc52..d9040003d6 100644 --- a/httpclient/src/test/java/feign/httpclient/ApacheHttpClientTest.java +++ b/httpclient/src/test/java/feign/httpclient/ApacheHttpClientTest.java @@ -23,6 +23,7 @@ import feign.Logger; import feign.RequestLine; import feign.Response; + import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; @@ -132,6 +133,17 @@ protected void log(String configKey, String format, Object... args) { api.post("foo"); } + @Test + public void noResponseBody() { + server.enqueue(new MockResponse()); + + TestInterface api = Feign.builder() + .client(new ApacheHttpClient()) + .target(TestInterface.class, "http://localhost:" + server.getPort()); + + api.noPostBody(); + } + interface TestInterface { @RequestLine("POST /?foo=bar&foo=baz&qux=") @@ -145,5 +157,8 @@ interface TestInterface { @RequestLine("PATCH /") @Headers("Accept: text/plain") String patch(); + + @RequestLine("POST") + String noPostBody(); } } diff --git a/okhttp/src/main/java/feign/okhttp/OkHttpClient.java b/okhttp/src/main/java/feign/okhttp/OkHttpClient.java index da3da5f738..2e6abc9aec 100644 --- a/okhttp/src/main/java/feign/okhttp/OkHttpClient.java +++ b/okhttp/src/main/java/feign/okhttp/OkHttpClient.java @@ -25,6 +25,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.Reader; +import java.util.Arrays; import java.util.Collection; import java.util.Map; import java.util.concurrent.TimeUnit; @@ -77,7 +78,14 @@ static Request toOkHttpRequest(feign.Request input) { requestBuilder.addHeader("Accept", "*/*"); } - RequestBody body = input.body() != null ? RequestBody.create(mediaType, input.body()) : null; + byte[] inputBody = input.body(); + if ("POST".equals(input.method()) && inputBody == null) { + // write an empty BODY to conform with okhttp 2.4.0+ + // http://johnfeng.github.io/blog/2015/06/30/okhttp-updates-post-wouldnt-be-allowed-to-have-null-body/ + inputBody = new byte[0]; + } + + RequestBody body = inputBody != null ? RequestBody.create(mediaType, inputBody) : null; requestBuilder.method(input.method(), body); return requestBuilder.build(); } diff --git a/okhttp/src/test/java/feign/okhttp/OkHttpClientTest.java b/okhttp/src/test/java/feign/okhttp/OkHttpClientTest.java index bf43d088b6..0bbd2f165d 100644 --- a/okhttp/src/test/java/feign/okhttp/OkHttpClientTest.java +++ b/okhttp/src/test/java/feign/okhttp/OkHttpClientTest.java @@ -134,6 +134,17 @@ protected void log(String configKey, String format, Object... args) { api.post("foo"); } + @Test + public void noResponseBody() { + server.enqueue(new MockResponse()); + + TestInterface api = Feign.builder() + .client(new OkHttpClient()) + .target(TestInterface.class, "http://localhost:" + server.getPort()); + + api.noPostBody(); + } + interface TestInterface { @RequestLine("POST /?foo=bar&foo=baz&qux=") @@ -147,5 +158,8 @@ interface TestInterface { @RequestLine("PATCH /") @Headers("Accept: text/plain") String patch(String body); + + @RequestLine("POST") + String noPostBody(); } }