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.