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 2021/09/02 09:39:36 UTC

[servicecomb-java-chassis] branch master updated: SCB-2319 when dowanload part is null, will throw NPE (#2527)

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/servicecomb-java-chassis.git


The following commit(s) were added to refs/heads/master by this push:
     new b6478dd  SCB-2319 when dowanload part is null, will throw NPE (#2527)
b6478dd is described below

commit b6478dd5d7bc48e2b441d631065d96cbef6d6496
Author: zyl <72...@users.noreply.github.com>
AuthorDate: Thu Sep 2 17:39:31 2021 +0800

    SCB-2319 when dowanload part is null, will throw NPE (#2527)
---
 .../demo/springmvc/client/TestDownloadSchema.java        | 14 ++++++++++++++
 .../demo/springmvc/server/DownloadSchema.java            | 16 ++++++++++++++++
 .../servicecomb/foundation/vertx/http/DownloadUtils.java |  7 ++++++-
 .../vertx/http/StandardHttpServletResponseEx.java        |  4 ++++
 .../http/VertxServerResponseToHttpServletResponse.java   |  4 +++-
 .../TestVertxServerResponseToHttpServletResponse.java    |  6 ++++++
 6 files changed, 49 insertions(+), 2 deletions(-)

diff --git a/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/TestDownloadSchema.java b/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/TestDownloadSchema.java
index c010278..37a2411 100644
--- a/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/TestDownloadSchema.java
+++ b/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/TestDownloadSchema.java
@@ -30,6 +30,7 @@ public class TestDownloadSchema implements CategorizedTestCase {
   public void testRestTransport() throws Exception {
     testDownloadFileAndDeleted();
     testDownloadFileNotDeleted();
+    testDownloadFileWithNull();
   }
 
   private void testDownloadFileAndDeleted() throws Exception {
@@ -44,6 +45,19 @@ public class TestDownloadSchema implements CategorizedTestCase {
     TestMgr.check(exists, false);
   }
 
+  private void testDownloadFileWithNull() throws Exception {
+    RestTemplate restTemplate = RestTemplateBuilder.create();
+    ReadStreamPart readStreamPart = restTemplate
+        .getForObject("servicecomb://springmvc/download/partIsNull?content=test", ReadStreamPart.class);
+    String result = readStreamPart.saveAsString().get();
+    TestMgr.check(result, "test");
+
+    readStreamPart = restTemplate
+        .getForObject("servicecomb://springmvc/download/partIsNull?content=", ReadStreamPart.class);
+    result = readStreamPart.saveAsString().get();
+    TestMgr.check(result, "");
+  }
+
   private void testDownloadFileNotDeleted() throws Exception {
     RestTemplate restTemplate = RestTemplateBuilder.create();
     ReadStreamPart readStreamPart = restTemplate
diff --git a/demo/demo-springmvc/springmvc-server/src/main/java/org/apache/servicecomb/demo/springmvc/server/DownloadSchema.java b/demo/demo-springmvc/springmvc-server/src/main/java/org/apache/servicecomb/demo/springmvc/server/DownloadSchema.java
index 8f6db6b..5079017 100644
--- a/demo/demo-springmvc/springmvc-server/src/main/java/org/apache/servicecomb/demo/springmvc/server/DownloadSchema.java
+++ b/demo/demo-springmvc/springmvc-server/src/main/java/org/apache/servicecomb/demo/springmvc/server/DownloadSchema.java
@@ -25,6 +25,7 @@ import java.util.UUID;
 import javax.servlet.http.Part;
 
 import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.servicecomb.foundation.common.part.FilePart;
 import org.apache.servicecomb.provider.rest.common.RestSchema;
 import org.springframework.http.HttpHeaders;
@@ -66,6 +67,21 @@ public class DownloadSchema {
             .setDeleteAfterFinished(true));
   }
 
+  @GetMapping(path = "/partIsNull")
+  public ResponseEntity<Part> partIsNull(@RequestParam("content") String content) throws IOException {
+    if (StringUtils.isEmpty(content)) {
+      return ResponseEntity
+          .ok()
+          .header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=tempFileEntity.txt")
+          .body(null);
+    }
+    File file = createTempFile(content);
+    return ResponseEntity
+        .ok()
+        .header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=tempFileEntity.txt")
+        .body(new FilePart(null, file));
+  }
+
   @GetMapping(path = "/notDeleteAfterFinished")
   public ResponseEntity<Part> notDeleteAfterFinished(@RequestParam("content") String content) throws IOException {
     File file = createTempFile(content);
diff --git a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/http/DownloadUtils.java b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/http/DownloadUtils.java
index 1889305..f37712e 100644
--- a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/http/DownloadUtils.java
+++ b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/http/DownloadUtils.java
@@ -40,7 +40,9 @@ public final class DownloadUtils {
     if (responseEx.getHeader(HttpHeaders.CONTENT_LENGTH.toString()) == null) {
       responseEx.setChunked(true);
     }
-
+    if (part == null) {
+      return;
+    }
     if (responseEx.getHeader(HttpHeaders.CONTENT_TYPE.toString()) == null) {
       responseEx.setHeader(HttpHeaders.CONTENT_TYPE.toString(), part.getContentType());
     }
@@ -55,6 +57,9 @@ public final class DownloadUtils {
   }
 
   public static void clearPartResource(Part part) {
+    if (part == null) {
+      return;
+    }
     if (part instanceof FilePartForSend && ((FilePartForSend) part).isDeleteAfterFinished()) {
       try {
         part.delete();
diff --git a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/http/StandardHttpServletResponseEx.java b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/http/StandardHttpServletResponseEx.java
index 2050601..8a00cb8 100644
--- a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/http/StandardHttpServletResponseEx.java
+++ b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/http/StandardHttpServletResponseEx.java
@@ -104,6 +104,10 @@ public class StandardHttpServletResponseEx extends HttpServletResponseWrapper im
 
   @Override
   public CompletableFuture<Void> sendPart(Part part) {
+    if (part == null) {
+      return CompletableFuture.completedFuture(null);
+    }
+
     DownloadUtils.prepareDownloadHeader(this, part);
 
     OutputStream outputStream;
diff --git a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/http/VertxServerResponseToHttpServletResponse.java b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/http/VertxServerResponseToHttpServletResponse.java
index 539591c..9fdb51c 100644
--- a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/http/VertxServerResponseToHttpServletResponse.java
+++ b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/http/VertxServerResponseToHttpServletResponse.java
@@ -123,7 +123,9 @@ public class VertxServerResponseToHttpServletResponse extends AbstractHttpServle
   @Override
   public CompletableFuture<Void> sendPart(Part part) {
     DownloadUtils.prepareDownloadHeader(this, part);
-
+    if (part == null) {
+      return CompletableFuture.completedFuture(null);
+    }
     return new PumpFromPart(context, part).toWriteStream(serverResponse, null);
   }
 
diff --git a/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/http/TestVertxServerResponseToHttpServletResponse.java b/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/http/TestVertxServerResponseToHttpServletResponse.java
index 66150d6..da1d9d2 100644
--- a/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/http/TestVertxServerResponseToHttpServletResponse.java
+++ b/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/http/TestVertxServerResponseToHttpServletResponse.java
@@ -347,6 +347,12 @@ public class TestVertxServerResponseToHttpServletResponse {
   }
 
   @Test
+  public void sendPart_testPartIsNull(@Mocked Part part) throws InterruptedException, ExecutionException {
+    CompletableFuture<Void> future1 = response.sendPart(null);
+    Assert.assertNull(future1.get());
+  }
+
+  @Test
   public void sendPart_inputStreamBreak(@Mocked Part part, @Mocked InputStream inputStream)
       throws IOException, InterruptedException, ExecutionException {
     IOException ioException = new IOException("forbid read");