You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by li...@apache.org on 2018/04/22 08:32:32 UTC

[incubator-servicecomb-java-chassis] 05/09: [SCB-486] when receive http response, create ReadStreamPart, and not decode http body anymore.

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 7658f9e20d8c69846df8c6b7e1486c504cd4f37e
Author: wujimin <wu...@huawei.com>
AuthorDate: Sat Apr 21 22:30:37 2018 +0800

    [SCB-486] when receive http response, create ReadStreamPart, and not decode http body anymore.
---
 .../apache/servicecomb/common/rest/RestConst.java  |  2 ++
 .../rest/client/http/DefaultHttpClientFilter.java  | 21 +++++++++++------
 .../rest/client/http/RestClientInvocation.java     | 12 ++++++++++
 .../client/http/TestDefaultHttpClientFilter.java   | 17 ++++++++++++++
 .../rest/client/http/TestRestClientInvocation.java | 26 ++++++++++++++++++++++
 5 files changed, 71 insertions(+), 7 deletions(-)

diff --git a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/RestConst.java b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/RestConst.java
index 7e45aa8..1261ca9 100644
--- a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/RestConst.java
+++ b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/RestConst.java
@@ -54,4 +54,6 @@ public final class RestConst {
   public static final String REST_REQUEST = "servicecomb-rest-request";
 
   public static final String CONSUMER_HEADER = "servicecomb-rest-consumer-header";
+
+  public static final String READ_STREAM_PART = "servicecomb-readStreamPart";
 }
diff --git a/transports/transport-rest/transport-rest-client/src/main/java/org/apache/servicecomb/transport/rest/client/http/DefaultHttpClientFilter.java b/transports/transport-rest/transport-rest-client/src/main/java/org/apache/servicecomb/transport/rest/client/http/DefaultHttpClientFilter.java
index 8d8555d..097c39c 100644
--- a/transports/transport-rest/transport-rest-client/src/main/java/org/apache/servicecomb/transport/rest/client/http/DefaultHttpClientFilter.java
+++ b/transports/transport-rest/transport-rest-client/src/main/java/org/apache/servicecomb/transport/rest/client/http/DefaultHttpClientFilter.java
@@ -61,8 +61,12 @@ public class DefaultHttpClientFilter implements HttpClientFilter {
     return restOperation.findProduceProcessor(contentTypeForFind);
   }
 
-  @Override
-  public Response afterReceiveResponse(Invocation invocation, HttpServletResponseEx responseEx) {
+  protected Object extractResult(Invocation invocation, HttpServletResponseEx responseEx) {
+    Object result = invocation.getHandlerContext().get(RestConst.READ_STREAM_PART);
+    if (result != null) {
+      return result;
+    }
+
     OperationMeta operationMeta = invocation.getOperationMeta();
     ResponseMeta responseMeta = operationMeta.findResponseMeta(responseEx.getStatus());
     RestOperationMeta swaggerRestOperation = operationMeta.getExtData(RestConst.SWAGGER_REST_OPERATION);
@@ -75,16 +79,19 @@ public class DefaultHttpClientFilter implements HttpClientFilter {
               responseEx.getStatus(),
               responseEx.getStatusType().getReasonPhrase(),
               responseEx.getHeader(HttpHeaders.CONTENT_TYPE));
-      Exception exception = ExceptionFactory.createConsumerException(new CommonExceptionData(msg));
-      return Response.consumerFailResp(exception);
+      return ExceptionFactory.createConsumerException(new CommonExceptionData(msg));
     }
 
-    Object result = null;
     try {
-      result = produceProcessor.decodeResponse(responseEx.getBodyBuffer(), responseMeta.getJavaType());
+      return produceProcessor.decodeResponse(responseEx.getBodyBuffer(), responseMeta.getJavaType());
     } catch (Exception e) {
-      return Response.consumerFailResp(e);
+      return ExceptionFactory.createConsumerException(e);
     }
+  }
+
+  @Override
+  public Response afterReceiveResponse(Invocation invocation, HttpServletResponseEx responseEx) {
+    Object result = extractResult(invocation, responseEx);
 
     Response response =
         Response.create(responseEx.getStatusType(), result);
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 1468ade..9a586a1 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
@@ -19,6 +19,8 @@ package org.apache.servicecomb.transport.rest.client.http;
 
 import java.util.List;
 
+import javax.servlet.http.Part;
+
 import org.apache.servicecomb.common.rest.RestConst;
 import org.apache.servicecomb.common.rest.codec.param.RestClientRequestImpl;
 import org.apache.servicecomb.common.rest.definition.RestOperationMeta;
@@ -26,12 +28,14 @@ import org.apache.servicecomb.common.rest.filter.HttpClientFilter;
 import org.apache.servicecomb.core.Invocation;
 import org.apache.servicecomb.core.definition.OperationMeta;
 import org.apache.servicecomb.core.transport.AbstractTransport;
+import org.apache.servicecomb.foundation.common.http.HttpStatus;
 import org.apache.servicecomb.foundation.common.net.IpPort;
 import org.apache.servicecomb.foundation.common.net.URIEndpointObject;
 import org.apache.servicecomb.foundation.common.utils.JsonUtils;
 import org.apache.servicecomb.foundation.vertx.client.http.HttpClientWithContext;
 import org.apache.servicecomb.foundation.vertx.http.HttpServletRequestEx;
 import org.apache.servicecomb.foundation.vertx.http.HttpServletResponseEx;
+import org.apache.servicecomb.foundation.vertx.http.ReadStreamPart;
 import org.apache.servicecomb.foundation.vertx.http.VertxClientRequestToHttpServletRequest;
 import org.apache.servicecomb.foundation.vertx.http.VertxClientResponseToHttpServletResponse;
 import org.apache.servicecomb.serviceregistry.api.Const;
@@ -149,6 +153,14 @@ public class RestClientInvocation {
   protected void handleResponse(HttpClientResponse httpClientResponse) {
     this.clientResponse = httpClientResponse;
 
+    if (HttpStatus.isSuccess(clientResponse.statusCode())
+        && Part.class.equals(invocation.getOperationMeta().getMethod().getReturnType())) {
+      ReadStreamPart part = new ReadStreamPart(httpClientResponse);
+      invocation.getHandlerContext().put(RestConst.READ_STREAM_PART, part);
+      processResponseBody(null);
+      return;
+    }
+
     httpClientResponse.exceptionHandler(e -> {
       LOGGER.error("Failed to receive response from {}.", httpClientResponse.netSocket().remoteAddress(), e);
       asyncResp.fail(invocation.getInvocationType(), e);
diff --git a/transports/transport-rest/transport-rest-client/src/test/java/org/apache/servicecomb/transport/rest/client/http/TestDefaultHttpClientFilter.java b/transports/transport-rest/transport-rest-client/src/test/java/org/apache/servicecomb/transport/rest/client/http/TestDefaultHttpClientFilter.java
index 1d79e60..8e6168a 100644
--- a/transports/transport-rest/transport-rest-client/src/test/java/org/apache/servicecomb/transport/rest/client/http/TestDefaultHttpClientFilter.java
+++ b/transports/transport-rest/transport-rest-client/src/test/java/org/apache/servicecomb/transport/rest/client/http/TestDefaultHttpClientFilter.java
@@ -18,6 +18,8 @@
 package org.apache.servicecomb.transport.rest.client.http;
 
 import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
 
 import javax.ws.rs.core.HttpHeaders;
 import javax.ws.rs.core.Response.Status;
@@ -28,6 +30,7 @@ import org.apache.servicecomb.common.rest.definition.RestOperationMeta;
 import org.apache.servicecomb.core.Invocation;
 import org.apache.servicecomb.core.definition.OperationMeta;
 import org.apache.servicecomb.foundation.vertx.http.HttpServletResponseEx;
+import org.apache.servicecomb.foundation.vertx.http.ReadStreamPart;
 import org.apache.servicecomb.swagger.invocation.Response;
 import org.apache.servicecomb.swagger.invocation.exception.CommonExceptionData;
 import org.apache.servicecomb.swagger.invocation.exception.InvocationException;
@@ -93,6 +96,20 @@ public class TestDefaultHttpClientFilter {
   }
 
   @Test
+  public void extractResult_readStreamPart(@Mocked Invocation invocation, @Mocked ReadStreamPart part) {
+    Map<String, Object> handlerContext = new HashMap<>();
+    handlerContext.put(RestConst.READ_STREAM_PART, part);
+    new Expectations() {
+      {
+        invocation.getHandlerContext();
+        result = handlerContext;
+      }
+    };
+
+    Assert.assertSame(part, filter.extractResult(invocation, null));
+  }
+
+  @Test
   public void testAfterReceiveResponseNullProduceProcessor(@Mocked Invocation invocation,
       @Mocked HttpServletResponseEx responseEx,
       @Mocked OperationMeta operationMeta,
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 0f20853..76a6eab 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
@@ -22,12 +22,15 @@ import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
+import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import javax.servlet.http.Part;
+
 import org.apache.log4j.Level;
 import org.apache.servicecomb.common.rest.RestConst;
 import org.apache.servicecomb.common.rest.definition.RestOperationMeta;
@@ -38,8 +41,10 @@ import org.apache.servicecomb.core.Invocation;
 import org.apache.servicecomb.core.definition.OperationMeta;
 import org.apache.servicecomb.core.executor.ReactiveExecutor;
 import org.apache.servicecomb.foundation.common.net.URIEndpointObject;
+import org.apache.servicecomb.foundation.common.utils.ReflectUtils;
 import org.apache.servicecomb.foundation.test.scaffolding.log.LogCollector;
 import org.apache.servicecomb.foundation.vertx.client.http.HttpClientWithContext;
+import org.apache.servicecomb.foundation.vertx.http.ReadStreamPart;
 import org.apache.servicecomb.serviceregistry.api.Const;
 import org.apache.servicecomb.swagger.invocation.AsyncResponse;
 import org.apache.servicecomb.swagger.invocation.Response;
@@ -211,6 +216,27 @@ public class TestRestClientInvocation {
     Assert.assertSame(buf, response.getResult());
   }
 
+  public Part returnPart() {
+    return null;
+  }
+
+  @Test
+  public void handleResponse_readStreamPart() {
+    HttpClientResponse httpClientResponse = mock(HttpClientResponse.class);
+    when(httpClientResponse.statusCode()).thenReturn(200);
+    Method method = ReflectUtils.findMethod(this.getClass(), "returnPart");
+    when(operationMeta.getMethod()).thenReturn(method);
+    new MockUp<RestClientInvocation>(restClientInvocation) {
+      @Mock
+      void processResponseBody(Buffer responseBuf) {
+      }
+    };
+
+    restClientInvocation.handleResponse(httpClientResponse);
+
+    Assert.assertThat(handlerContext.get(RestConst.READ_STREAM_PART), Matchers.instanceOf(ReadStreamPart.class));
+  }
+
   @SuppressWarnings("unchecked")
   @Test
   public void handleResponse_responseException() {

-- 
To stop receiving notification emails like this one, please contact
liubao@apache.org.