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 <[email protected]> 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 [email protected].
