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");