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].

Reply via email to