This is an automated email from the ASF dual-hosted git repository. liubao pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-java-chassis.git
commit 7a3a5de99d9fbec21938d700e578a02ca9fc03a4 Author: wujimin <[email protected]> AuthorDate: Sat Apr 21 21:48:05 2018 +0800 [SCB-486] fix bug: when receiving half response, and no more data coming, at last will timeout and close connection, but invocation will not finished --- .../rest/client/http/RestClientInvocation.java | 5 +++++ .../rest/client/http/TestRestClientInvocation.java | 23 ++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/transports/transport-rest/transport-rest-client/src/main/java/org/apache/servicecomb/transport/rest/client/http/RestClientInvocation.java b/transports/transport-rest/transport-rest-client/src/main/java/org/apache/servicecomb/transport/rest/client/http/RestClientInvocation.java index df56c98..1468ade 100644 --- a/transports/transport-rest/transport-rest-client/src/main/java/org/apache/servicecomb/transport/rest/client/http/RestClientInvocation.java +++ b/transports/transport-rest/transport-rest-client/src/main/java/org/apache/servicecomb/transport/rest/client/http/RestClientInvocation.java @@ -149,6 +149,11 @@ public class RestClientInvocation { protected void handleResponse(HttpClientResponse httpClientResponse) { this.clientResponse = httpClientResponse; + httpClientResponse.exceptionHandler(e -> { + LOGGER.error("Failed to receive response from {}.", httpClientResponse.netSocket().remoteAddress(), e); + asyncResp.fail(invocation.getInvocationType(), e); + }); + clientResponse.bodyHandler(responseBuf -> { processResponseBody(responseBuf); }); diff --git a/transports/transport-rest/transport-rest-client/src/test/java/org/apache/servicecomb/transport/rest/client/http/TestRestClientInvocation.java b/transports/transport-rest/transport-rest-client/src/test/java/org/apache/servicecomb/transport/rest/client/http/TestRestClientInvocation.java index 5b5f4a1..0f20853 100644 --- a/transports/transport-rest/transport-rest-client/src/test/java/org/apache/servicecomb/transport/rest/client/http/TestRestClientInvocation.java +++ b/transports/transport-rest/transport-rest-client/src/test/java/org/apache/servicecomb/transport/rest/client/http/TestRestClientInvocation.java @@ -58,6 +58,8 @@ import io.vertx.core.http.HttpClientRequest; import io.vertx.core.http.HttpClientResponse; import io.vertx.core.http.HttpMethod; import io.vertx.core.http.RequestOptions; +import io.vertx.core.net.NetSocket; +import io.vertx.core.net.SocketAddress; import mockit.Deencapsulation; import mockit.Mock; import mockit.MockUp; @@ -209,6 +211,27 @@ public class TestRestClientInvocation { Assert.assertSame(buf, response.getResult()); } + @SuppressWarnings("unchecked") + @Test + public void handleResponse_responseException() { + HttpClientResponse httpClientResponse = mock(HttpClientResponse.class); + + NetSocket netSocket = mock(NetSocket.class); + when(httpClientResponse.netSocket()).thenReturn(netSocket); + when(netSocket.remoteAddress()).thenReturn(mock(SocketAddress.class)); + + doAnswer(a -> { + exceptionHandler = (Handler<Throwable>) a.getArguments()[0]; + return httpClientResponse; + }).when(httpClientResponse).exceptionHandler(any()); + + restClientInvocation.handleResponse(httpClientResponse); + Error error = new Error(); + exceptionHandler.handle(error); + + Assert.assertThat(((InvocationException) response.getResult()).getCause(), Matchers.sameInstance(error)); + } + @Test public void processResponseBody() { Response resp = Response.ok(null); -- To stop receiving notification emails like this one, please contact [email protected].
