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


The following commit(s) were added to refs/heads/master by this push:
     new 9c734ac  [SCB-579] fix NullPointerException when consumer upload null 
file
9c734ac is described below

commit 9c734ac7691f638ddfb136410c8b65838e7bc594
Author: yaohaishi <yaohai...@huawei.com>
AuthorDate: Fri May 18 00:05:01 2018 +0800

    [SCB-579] fix NullPointerException when consumer upload null file
---
 .../rest/codec/param/RestClientRequestImpl.java    |  4 ++
 .../codec/param/TestRestClientRequestImpl.java     | 30 +++++++++++-
 .../VertxServerRequestToHttpServletRequest.java    | 11 ++---
 .../arguments/consumer/ConsumerArgumentSame.java   |  8 ++++
 .../consumer/ConsumerArgumentSameTest.java         | 53 ++++++++++++++++++++++
 5 files changed, 97 insertions(+), 9 deletions(-)

diff --git 
a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/RestClientRequestImpl.java
 
b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/RestClientRequestImpl.java
index 1158bc1..c6bb7e9 100644
--- 
a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/RestClientRequestImpl.java
+++ 
b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/RestClientRequestImpl.java
@@ -83,6 +83,10 @@ public class RestClientRequestImpl implements 
RestClientRequest {
 
   @Override
   public void attach(String name, Part part) {
+    if (null == part) {
+      LOGGER.debug("null file is ignored, file name = [{}]", name);
+      return;
+    }
     uploads.put(name, part);
   }
 
diff --git 
a/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/codec/param/TestRestClientRequestImpl.java
 
b/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/codec/param/TestRestClientRequestImpl.java
index 2f56071..d14c10e 100644
--- 
a/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/codec/param/TestRestClientRequestImpl.java
+++ 
b/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/codec/param/TestRestClientRequestImpl.java
@@ -16,17 +16,22 @@
  */
 package org.apache.servicecomb.common.rest.codec.param;
 
+import java.util.Map;
+
 import javax.servlet.http.Part;
 import javax.ws.rs.core.MediaType;
 
+import org.hamcrest.Matchers;
 import org.junit.Assert;
 import org.junit.Test;
+import org.mockito.Mockito;
 
 import io.vertx.core.MultiMap;
 import io.vertx.core.buffer.Buffer;
 import io.vertx.core.http.CaseInsensitiveHeaders;
 import io.vertx.core.http.HttpClientRequest;
 import io.vertx.core.http.HttpHeaders;
+import mockit.Deencapsulation;
 import mockit.Expectations;
 import mockit.Mock;
 import mockit.MockUp;
@@ -34,7 +39,7 @@ import mockit.Mocked;
 
 public class TestRestClientRequestImpl {
   @Mocked
-  HttpClientRequest request;
+  private HttpClientRequest request;
 
   @Test
   public void testForm() throws Exception {
@@ -113,4 +118,27 @@ public class TestRestClientRequestImpl {
         "Content-Transfer-Encoding: binary\r\n" +
         "\r\n", buffer.toString());
   }
+
+  @Test
+  public void testAttach() {
+    RestClientRequestImpl restClientRequest = new 
RestClientRequestImpl(request, null, null);
+    Part part = Mockito.mock(Part.class);
+    String fileName = "fileName";
+
+    restClientRequest.attach(fileName, part);
+
+    Map<String, Part> uploads = Deencapsulation.getField(restClientRequest, 
"uploads");
+    Assert.assertEquals(1, uploads.size());
+    Assert.assertThat(uploads, Matchers.hasEntry(fileName, part));
+  }
+
+  @Test
+  public void testAttachOnPartIsNull() {
+    RestClientRequestImpl restClientRequest = new 
RestClientRequestImpl(request, null, null);
+
+    restClientRequest.attach("fileName", null);
+
+    Map<String, Part> uploads = Deencapsulation.getField(restClientRequest, 
"uploads");
+    Assert.assertTrue(uploads.isEmpty());
+  }
 }
diff --git 
a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/http/VertxServerRequestToHttpServletRequest.java
 
b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/http/VertxServerRequestToHttpServletRequest.java
index 94bc41c..31b3892 100644
--- 
a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/http/VertxServerRequestToHttpServletRequest.java
+++ 
b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/http/VertxServerRequestToHttpServletRequest.java
@@ -17,7 +17,6 @@
 
 package org.apache.servicecomb.foundation.vertx.http;
 
-import java.io.IOException;
 import java.util.Collections;
 import java.util.Enumeration;
 import java.util.HashMap;
@@ -27,7 +26,6 @@ import java.util.Optional;
 import java.util.Set;
 
 import javax.servlet.AsyncContext;
-import javax.servlet.ServletException;
 import javax.servlet.ServletInputStream;
 import javax.servlet.http.Cookie;
 import javax.servlet.http.Part;
@@ -106,7 +104,6 @@ public class VertxServerRequestToHttpServletRequest extends 
AbstractHttpServletR
     return this.vertxRequest.getParam(name);
   }
 
-
   @Override
   public String[] getParameterValues(String name) {
     List<String> paramList = this.vertxRequest.params().getAll(name);
@@ -154,7 +151,6 @@ public class VertxServerRequestToHttpServletRequest extends 
AbstractHttpServletR
     return this.vertxRequest.localAddress().port();
   }
 
-
   @Override
   public String getHeader(String name) {
     return this.vertxRequest.getHeader(name);
@@ -203,7 +199,6 @@ public class VertxServerRequestToHttpServletRequest extends 
AbstractHttpServletR
     return this.path;
   }
 
-
   @Override
   public String getServletPath() {
     return this.getPathInfo();
@@ -215,7 +210,7 @@ public class VertxServerRequestToHttpServletRequest extends 
AbstractHttpServletR
   }
 
   @Override
-  public ServletInputStream getInputStream() throws IOException {
+  public ServletInputStream getInputStream() {
     if (inputStream == null) {
       inputStream = new BufferInputStream(context.getBody().getByteBuf());
     }
@@ -228,13 +223,13 @@ public class VertxServerRequestToHttpServletRequest 
extends AbstractHttpServletR
   }
 
   @Override
-  public Part getPart(String name) throws IOException, ServletException {
+  public Part getPart(String name) {
     Optional<FileUpload> upload = context.fileUploads()
         .stream()
         .filter(fileUpload -> fileUpload.name().equals(name))
         .findFirst();
     if (!upload.isPresent()) {
-      LOGGER.error("No such file with name: {}.", name);
+      LOGGER.debug("No such file with name: {}.", name);
       return null;
     }
 
diff --git 
a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/arguments/consumer/ConsumerArgumentSame.java
 
b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/arguments/consumer/ConsumerArgumentSame.java
index d6c5d43..eaad2cd 100644
--- 
a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/arguments/consumer/ConsumerArgumentSame.java
+++ 
b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/arguments/consumer/ConsumerArgumentSame.java
@@ -20,8 +20,12 @@ package 
org.apache.servicecomb.swagger.invocation.arguments.consumer;
 import org.apache.servicecomb.swagger.invocation.SwaggerInvocation;
 import org.apache.servicecomb.swagger.invocation.arguments.ArgumentMapper;
 import org.apache.servicecomb.swagger.invocation.converter.Converter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public final class ConsumerArgumentSame implements ArgumentMapper {
+  private static final Logger LOGGER = 
LoggerFactory.getLogger(ConsumerArgumentSame.class);
+
   private int consumerIdx;
 
   private int swaggerIdx;
@@ -36,6 +40,10 @@ public final class ConsumerArgumentSame implements 
ArgumentMapper {
 
   @Override
   public void mapArgument(SwaggerInvocation invocation, Object[] 
consumerArguments) {
+    if (null == consumerArguments[consumerIdx]) {
+      LOGGER.debug("null argument is ignored, consumerIdx = [{}]", 
consumerIdx);
+      return;
+    }
     Object swaggerParam = converter.convert(consumerArguments[consumerIdx]);
     invocation.setSwaggerArgument(swaggerIdx, swaggerParam);
   }
diff --git 
a/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/arguments/consumer/ConsumerArgumentSameTest.java
 
b/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/arguments/consumer/ConsumerArgumentSameTest.java
new file mode 100644
index 0000000..1af5cd8
--- /dev/null
+++ 
b/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/arguments/consumer/ConsumerArgumentSameTest.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.swagger.invocation.arguments.consumer;
+
+import org.apache.servicecomb.swagger.invocation.SwaggerInvocation;
+import org.apache.servicecomb.swagger.invocation.converter.Converter;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+public class ConsumerArgumentSameTest {
+
+  private Converter mockConverter = Mockito.mock(Converter.class);
+
+  private ConsumerArgumentSame consumerArgumentSame = new 
ConsumerArgumentSame(0, 0, mockConverter);
+
+  @Test
+  public void testMapArgumentOnArgument() {
+    SwaggerInvocation swaggerInvocation = 
Mockito.mock(SwaggerInvocation.class);
+    String[] args = {"testArg"};
+
+    Mockito.when(mockConverter.convert(args[0])).thenReturn(args[0]);
+
+    consumerArgumentSame.mapArgument(swaggerInvocation, args);
+
+    Mockito.verify(mockConverter, Mockito.times(1)).convert(args[0]);
+    Mockito.verify(swaggerInvocation, Mockito.times(1)).setSwaggerArgument(0, 
args[0]);
+  }
+
+  @Test
+  public void testMapArgumentOnArgumentIsNull() {
+    SwaggerInvocation swaggerInvocation = 
Mockito.mock(SwaggerInvocation.class);
+
+    consumerArgumentSame.mapArgument(swaggerInvocation, new Object[1]);
+
+    Mockito.verify(mockConverter, 
Mockito.never()).convert(Mockito.anyObject());
+    Mockito.verify(swaggerInvocation, 
Mockito.never()).setSwaggerArgument(Mockito.anyInt(), Mockito.anyObject());
+  }
+}

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

Reply via email to