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/08/10 11:25:19 UTC
[incubator-servicecomb-java-chassis] 01/03: [SCB-828]In some tomcat
implementation inputstream available is null
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 45471e76d9a6cef4d997ef2b496b7006558e829b
Author: liubao <ba...@huawei.com>
AuthorDate: Thu Aug 9 22:22:59 2018 +0800
[SCB-828]In some tomcat implementation inputstream available is null
---
.../servicecomb/common/rest/codec/RestCodec.java | 4 ++--
.../rest/codec/param/BodyProcessorCreator.java | 20 +++++++++++++++-----
.../common/rest/codec/produce/ProduceProcessor.java | 4 ----
.../servicecomb/common/rest/codec/TestRestCodec.java | 4 ++--
.../common/rest/codec/TestRestObjectMapper.java | 14 ++++++++++++++
.../rest/codec/produce/TestProduceJsonProcessor.java | 10 ++++++++--
.../codec/produce/TestProduceTextPlainProcessor.java | 2 +-
7 files changed, 42 insertions(+), 16 deletions(-)
diff --git a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/RestCodec.java b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/RestCodec.java
index 7c80dfd..127b76d 100644
--- a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/RestCodec.java
+++ b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/RestCodec.java
@@ -23,7 +23,6 @@ import javax.servlet.http.HttpServletRequest;
import org.apache.servicecomb.common.rest.definition.RestOperationMeta;
import org.apache.servicecomb.common.rest.definition.RestParam;
-import org.apache.servicecomb.swagger.invocation.exception.ExceptionFactory;
import org.apache.servicecomb.swagger.invocation.exception.InvocationException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -67,7 +66,8 @@ public final class RestCodec {
LOG.error("Parameter is not valid for operation {}. ",
restOperation.getOperationMeta().getMicroserviceQualifiedName(),
e);
- throw ExceptionFactory.convertProducerException(e, "Parameter is not valid.");
+ // give standard http error code for invalid parameter
+ throw new InvocationException(400, "", "Parameter is not valid.");
}
}
}
diff --git a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/BodyProcessorCreator.java b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/BodyProcessorCreator.java
index c21f527..61f0ea9 100644
--- a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/BodyProcessorCreator.java
+++ b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/BodyProcessorCreator.java
@@ -31,14 +31,18 @@ import org.apache.servicecomb.common.rest.codec.RestClientRequest;
import org.apache.servicecomb.common.rest.codec.RestObjectMapperFactory;
import org.apache.servicecomb.foundation.vertx.stream.BufferOutputStream;
import org.apache.servicecomb.swagger.generator.core.utils.ClassUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import com.fasterxml.jackson.databind.JavaType;
+import com.fasterxml.jackson.databind.exc.MismatchedInputException;
import com.fasterxml.jackson.databind.type.TypeFactory;
import io.swagger.models.parameters.Parameter;
import io.vertx.core.buffer.Buffer;
public class BodyProcessorCreator implements ParamValueProcessorCreator {
+ private static final Logger LOGGER = LoggerFactory.getLogger(BodyProcessorCreator.class);
public static final String PARAMTYPE = "body";
@@ -75,15 +79,21 @@ public class BodyProcessorCreator implements ParamValueProcessorCreator {
return null;
}
- if (isRequired == false && inputStream.available() == 0) {
- return null;
- }
-
if (!contentType.isEmpty() && !contentType.startsWith(MediaType.APPLICATION_JSON)) {
// TODO: we should consider body encoding
return IOUtils.toString(inputStream, "UTF-8");
}
- return RestObjectMapperFactory.getRestObjectMapper().readValue(inputStream, targetType);
+
+ try {
+ return RestObjectMapperFactory.getRestObjectMapper().readValue(inputStream, targetType);
+ } catch (MismatchedInputException e) {
+ // there is no way to detect InputStream is empty, so have to catch the exception
+ if (!isRequired) {
+ LOGGER.warn("Mismatched content and required is false, taken as null. Msg=" + e.getMessage());
+ return null;
+ }
+ throw e;
+ }
}
@Override
diff --git a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/produce/ProduceProcessor.java b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/produce/ProduceProcessor.java
index 127250f..4172cb5 100644
--- a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/produce/ProduceProcessor.java
+++ b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/produce/ProduceProcessor.java
@@ -54,10 +54,6 @@ public interface ProduceProcessor {
}
default Object decodeResponse(InputStream input, JavaType type) throws Exception {
- if (input.available() == 0) {
- return null;
- }
-
return doDecodeResponse(input, type);
}
diff --git a/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/codec/TestRestCodec.java b/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/codec/TestRestCodec.java
index d3817a1..ce6489b 100644
--- a/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/codec/TestRestCodec.java
+++ b/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/codec/TestRestCodec.java
@@ -133,8 +133,8 @@ public class TestRestCodec {
RestCodec.restToArgs(request, restOperation);
success = true;
} catch (InvocationException e) {
- Assert.assertEquals(590, e.getStatusCode());
- Assert.assertEquals("Parameter is not valid.", ((CommonExceptionData) e.getErrorData()).getMessage());
+ Assert.assertEquals(400, e.getStatusCode());
+ Assert.assertEquals("Parameter is not valid.", e.getErrorData());
}
Assert.assertEquals(success, false);
}
diff --git a/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/codec/TestRestObjectMapper.java b/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/codec/TestRestObjectMapper.java
index 1a9980e..af840e1 100644
--- a/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/codec/TestRestObjectMapper.java
+++ b/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/codec/TestRestObjectMapper.java
@@ -17,11 +17,15 @@
package org.apache.servicecomb.common.rest.codec;
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+
import org.junit.Assert;
import org.junit.Test;
import com.fasterxml.jackson.core.JsonParser.Feature;
import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.exc.MismatchedInputException;
import com.fasterxml.jackson.databind.type.TypeFactory;
import io.vertx.core.json.JsonObject;
@@ -54,5 +58,15 @@ public class TestRestObjectMapper {
.convertValue(obj, TypeFactory.defaultInstance().constructType(PojoModel.class));
Assert.assertEquals("a", model.getName());
Assert.assertEquals("b", model.getDesc());
+
+ InputStream inputStream = new ByteArrayInputStream(new byte[0]);
+ try {
+ RestObjectMapperFactory.getRestObjectMapper().readValue(inputStream, PojoModel.class);
+ Assert.fail();
+ } catch (MismatchedInputException e) {
+ // right place, nothing to do.
+ } catch (Exception e) {
+ Assert.fail();
+ }
}
}
diff --git a/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/codec/produce/TestProduceJsonProcessor.java b/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/codec/produce/TestProduceJsonProcessor.java
index b186bda..98a83d9 100644
--- a/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/codec/produce/TestProduceJsonProcessor.java
+++ b/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/codec/produce/TestProduceJsonProcessor.java
@@ -25,6 +25,7 @@ import org.junit.Assert;
import org.junit.Test;
import com.fasterxml.jackson.databind.JavaType;
+import com.fasterxml.jackson.databind.exc.MismatchedInputException;
import com.fasterxml.jackson.databind.type.TypeFactory;
import io.vertx.core.buffer.Buffer;
@@ -51,8 +52,13 @@ public class TestProduceJsonProcessor {
Assert.assertNull(result);
ByteArrayInputStream is = new ByteArrayInputStream(new byte[] {});
- result = pp.decodeResponse(is, resultType);
- Assert.assertNull(result);
+ try {
+ pp.decodeResponse(is, resultType);
+ Assert.fail();
+ } catch (Exception e) {
+ Assert.assertTrue(e instanceof MismatchedInputException);
+ }
+
}
@Test
diff --git a/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/codec/produce/TestProduceTextPlainProcessor.java b/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/codec/produce/TestProduceTextPlainProcessor.java
index b1df575..905f70f 100644
--- a/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/codec/produce/TestProduceTextPlainProcessor.java
+++ b/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/codec/produce/TestProduceTextPlainProcessor.java
@@ -52,7 +52,7 @@ public class TestProduceTextPlainProcessor {
ByteArrayInputStream is = new ByteArrayInputStream(new byte[] {});
result = pp.decodeResponse(is, resultType);
- Assert.assertNull(result);
+ Assert.assertEquals(result, "");
}
@Test