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.