From f69601c89b6d6465dcaa989287bbc8217756a4a2 Mon Sep 17 00:00:00 2001 From: Georgios Andrianakis Date: Fri, 9 Feb 2024 18:01:16 +0200 Subject: [PATCH] Don't assume that multipart part without filename is always text Fixes: #38703 --- .../MultipartBinaryWithoutFilenameTest.java | 67 ++++++++++++++++++ .../deployment/src/test/resources/image.png | Bin 0 -> 30568 bytes .../multipart/MultiPartParserDefinition.java | 30 +++++--- .../core/multipart/MultipartSupport.java | 9 ++- 4 files changed, 95 insertions(+), 11 deletions(-) create mode 100644 extensions/resteasy-reactive/quarkus-resteasy-reactive/deployment/src/test/java/io/quarkus/resteasy/reactive/server/test/multipart/MultipartBinaryWithoutFilenameTest.java create mode 100644 extensions/resteasy-reactive/quarkus-resteasy-reactive/deployment/src/test/resources/image.png diff --git a/extensions/resteasy-reactive/quarkus-resteasy-reactive/deployment/src/test/java/io/quarkus/resteasy/reactive/server/test/multipart/MultipartBinaryWithoutFilenameTest.java b/extensions/resteasy-reactive/quarkus-resteasy-reactive/deployment/src/test/java/io/quarkus/resteasy/reactive/server/test/multipart/MultipartBinaryWithoutFilenameTest.java new file mode 100644 index 00000000000000..ef0a01bb95f71f --- /dev/null +++ b/extensions/resteasy-reactive/quarkus-resteasy-reactive/deployment/src/test/java/io/quarkus/resteasy/reactive/server/test/multipart/MultipartBinaryWithoutFilenameTest.java @@ -0,0 +1,67 @@ +package io.quarkus.resteasy.reactive.server.test.multipart; + +import static io.restassured.RestAssured.given; +import static org.assertj.core.api.Assertions.assertThat; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.util.function.Supplier; + +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.core.MediaType; + +import org.jboss.resteasy.reactive.PartType; +import org.jboss.resteasy.reactive.RestForm; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.spec.JavaArchive; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import io.quarkus.test.QuarkusUnitTest; + +public class MultipartBinaryWithoutFilenameTest { + + @RegisterExtension + static QuarkusUnitTest test = new QuarkusUnitTest() + .setArchiveProducer(new Supplier<>() { + @Override + public JavaArchive get() { + return ShrinkWrap.create(JavaArchive.class) + .addClasses(MultipartDataInputTest.Resource.class, MultipartDataInputTest.Item.class, + MultipartDataInputTest.Result.class); + } + }); + private final File IMAGE_FILE = new File("./src/test/resources/image.png"); + + @Test + public void test() throws IOException { + byte[] bytes = given() + .contentType("multipart/form-data") + .multiPart("bytes", IMAGE_FILE, "application/png") + .when() + .post("/test") + .then() + .statusCode(200) + .extract().body().asByteArray(); + + assertThat(bytes).isEqualTo(Files.readAllBytes(IMAGE_FILE.toPath())); + } + + @Path("/test") + public static class Resource { + + @POST + public byte[] testMultipart(Input input) { + return input.bytes; + } + } + + public static class Input { + @RestForm("bytes") + @PartType(MediaType.APPLICATION_OCTET_STREAM) + public byte[] bytes; + + } +} diff --git a/extensions/resteasy-reactive/quarkus-resteasy-reactive/deployment/src/test/resources/image.png b/extensions/resteasy-reactive/quarkus-resteasy-reactive/deployment/src/test/resources/image.png new file mode 100644 index 0000000000000000000000000000000000000000..5a0e1e7e186e39bb736db6836b538b7cca603a47 GIT binary patch literal 30568 zcmV)7K*zs{P)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 getCreatedFiles() { return createdFiles; } diff --git a/independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/core/multipart/MultipartSupport.java b/independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/core/multipart/MultipartSupport.java index b6dddabfe2667f..6c048c672b48eb 100644 --- a/independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/core/multipart/MultipartSupport.java +++ b/independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/core/multipart/MultipartSupport.java @@ -30,6 +30,7 @@ import org.jboss.resteasy.reactive.server.core.ResteasyReactiveRequestContext; import org.jboss.resteasy.reactive.server.core.ServerSerialisers; import org.jboss.resteasy.reactive.server.handlers.RequestDeserializeHandler; +import org.jboss.resteasy.reactive.server.multipart.FileItem; import org.jboss.resteasy.reactive.server.multipart.FormValue; import org.jboss.resteasy.reactive.server.multipart.MultipartFormDataInput; import org.jboss.resteasy.reactive.server.multipart.MultipartPartReadingException; @@ -90,7 +91,7 @@ private static Object read(MessageBodyReader reader, String attributeName, Fo @Override public InputStream get() { try { - return Files.newInputStream(value.getFileItem().getFile()); + return value.getFileItem().getInputStream(); } catch (IOException e) { throw new UncheckedIOException(e); } @@ -248,7 +249,11 @@ public static byte[] getByteArray(String formName, ResteasyReactiveRequestContex } if (value.isFileItem()) { try { - return Files.readAllBytes(value.getFileItem().getFile()); + FileItem fileItem = value.getFileItem(); + if (fileItem.isInMemory()) { + return fileItem.getInputStream().readAllBytes(); + } + return Files.readAllBytes(fileItem.getFile()); } catch (IOException e) { throw new MultipartPartReadingException(e); }