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 fa9ff764c73459a218ede84880dc4a4907cc5a42 Author: liubao <[email protected]> AuthorDate: Thu Aug 16 10:21:52 2018 +0800 [SCB-847]fix container error code handling logic --- .../rest/client/http/DefaultHttpClientFilter.java | 8 ++++--- .../client/http/TestDefaultHttpClientFilter.java | 25 ++++++++++++++++------ 2 files changed, 23 insertions(+), 10 deletions(-) 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 7d54078..60921c5 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 @@ -23,13 +23,13 @@ import javax.ws.rs.core.HttpHeaders; import org.apache.servicecomb.common.rest.RestConst; import org.apache.servicecomb.common.rest.codec.produce.ProduceProcessor; +import org.apache.servicecomb.common.rest.codec.produce.ProduceProcessorManager; import org.apache.servicecomb.common.rest.definition.RestOperationMeta; 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.foundation.vertx.http.HttpServletRequestEx; import org.apache.servicecomb.foundation.vertx.http.HttpServletResponseEx; -import org.apache.servicecomb.swagger.invocation.InvocationType; import org.apache.servicecomb.swagger.invocation.Response; import org.apache.servicecomb.swagger.invocation.response.ResponseMeta; import org.slf4j.Logger; @@ -74,6 +74,8 @@ public class DefaultHttpClientFilter implements HttpClientFilter { RestOperationMeta swaggerRestOperation = operationMeta.getExtData(RestConst.SWAGGER_REST_OPERATION); ProduceProcessor produceProcessor = findProduceProcessor(swaggerRestOperation, responseEx); if (produceProcessor == null) { + // This happens outside the runtime such as Servlet filter response. Here we give a default json parser to it + // and keep user data not get lose. String msg = String.format("method %s, path %s, statusCode %d, reasonPhrase %s, response content-type %s is not supported", swaggerRestOperation.getHttpMethod(), @@ -81,8 +83,8 @@ public class DefaultHttpClientFilter implements HttpClientFilter { responseEx.getStatus(), responseEx.getStatusType().getReasonPhrase(), responseEx.getHeader(HttpHeaders.CONTENT_TYPE)); - LOGGER.error(msg); - return Response.createFail(InvocationType.CONSUMER, msg); + LOGGER.warn(msg); + produceProcessor = ProduceProcessorManager.DEFAULT_PROCESSOR; } try { 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 3279ab3..d14bc1d 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 @@ -31,6 +31,7 @@ import org.apache.servicecomb.common.rest.codec.produce.ProduceProcessor; 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.common.utils.JsonUtils; import org.apache.servicecomb.foundation.vertx.http.HttpServletResponseEx; import org.apache.servicecomb.foundation.vertx.http.ReadStreamPart; import org.apache.servicecomb.swagger.invocation.Response; @@ -48,6 +49,7 @@ import io.vertx.core.buffer.Buffer; import io.vertx.core.buffer.impl.BufferImpl; import io.vertx.core.http.CaseInsensitiveHeaders; import mockit.Expectations; +import mockit.Injectable; import mockit.Mock; import mockit.MockUp; import mockit.Mocked; @@ -172,29 +174,38 @@ public class TestDefaultHttpClientFilter { public void testAfterReceiveResponseNullProduceProcessor(@Mocked Invocation invocation, @Mocked HttpServletResponseEx responseEx, @Mocked OperationMeta operationMeta, - @Mocked RestOperationMeta swaggerRestOperation) { + @Mocked RestOperationMeta swaggerRestOperation, + @Injectable ResponseMeta responseMeta) throws Exception { + CommonExceptionData data = new CommonExceptionData("abcd"); new Expectations() { { invocation.getOperationMeta(); result = operationMeta; operationMeta.getExtData(RestConst.SWAGGER_REST_OPERATION); result = swaggerRestOperation; + operationMeta.findResponseMeta(403); + result = responseMeta; + responseMeta.getJavaType(); + result = SimpleType.constructUnsafe(CommonExceptionData.class); responseEx.getStatus(); - result = 200; + result = 403; + responseEx.getStatusType(); + result = Status.FORBIDDEN; + responseEx.getBodyBuffer(); + result = Buffer.buffer(JsonUtils.writeValueAsString(data).getBytes()); } }; Response response = filter.afterReceiveResponse(invocation, responseEx); - Assert.assertEquals(490, response.getStatusCode()); - Assert.assertEquals(ExceptionFactory.CONSUMER_INNER_REASON_PHRASE, response.getReasonPhrase()); + Assert.assertEquals(403, response.getStatusCode()); + Assert.assertEquals("Forbidden", response.getReasonPhrase()); Assert.assertEquals(InvocationException.class, response.<InvocationException>getResult().getClass()); InvocationException invocationException = response.getResult(); Assert.assertEquals( - 490, + 403, invocationException.getStatusCode()); Assert.assertEquals( - "CommonExceptionData [message=method null, path null, statusCode 200, reasonPhrase null, " - + "response content-type null is not supported]", + "CommonExceptionData [message=abcd]", invocationException.getErrorData().toString()); }
