From d79e33b5a0182af51f4c236fa59a99884d5a5f71 Mon Sep 17 00:00:00 2001 From: Sam Brannen Date: Fri, 7 May 2021 15:46:42 +0200 Subject: [PATCH] Handle empty file input in HtmlUnitRequestBuilder This commit revises the fix submitted in 959e6d1745 by ensuring that empty file input is converted to a MockPart with the supplied name, an empty filename, "application/octet-stream" as the content type, and empty content. This aligns with the behavior of Servlet containers, as tested with the interaction between Firefox and a standard Servlet running in a Jetty Servlet container. Closes gh-26799 --- .../htmlunit/HtmlUnitRequestBuilder.java | 11 ++++++---- .../htmlunit/HtmlUnitRequestBuilderTests.java | 21 ++++++++++++++----- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/HtmlUnitRequestBuilder.java b/spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/HtmlUnitRequestBuilder.java index b29ee388d14..fa52c987c66 100644 --- a/spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/HtmlUnitRequestBuilder.java +++ b/spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/HtmlUnitRequestBuilder.java @@ -374,12 +374,15 @@ final class HtmlUnitRequestBuilder implements RequestBuilder, Mergeable { if (param instanceof KeyDataPair) { KeyDataPair pair = (KeyDataPair) param; File file = pair.getFile(); - MockPart part = (file != null ? - new MockPart(pair.getName(), file.getName(), readAllBytes(file)) : - new MockPart(pair.getName(), null)); - if (StringUtils.hasLength(pair.getMimeType())) { + MockPart part; + if (file != null) { + part = new MockPart(pair.getName(), file.getName(), readAllBytes(file)); part.getHeaders().setContentType(MediaType.valueOf(pair.getMimeType())); } + else { // mimic empty file upload + part = new MockPart(pair.getName(), "", null); + part.getHeaders().setContentType(MediaType.APPLICATION_OCTET_STREAM); + } request.addPart(part); } else { diff --git a/spring-test/src/test/java/org/springframework/test/web/servlet/htmlunit/HtmlUnitRequestBuilderTests.java b/spring-test/src/test/java/org/springframework/test/web/servlet/htmlunit/HtmlUnitRequestBuilderTests.java index 0202b0bbcbb..b1f73b4741f 100644 --- a/spring-test/src/test/java/org/springframework/test/web/servlet/htmlunit/HtmlUnitRequestBuilderTests.java +++ b/spring-test/src/test/java/org/springframework/test/web/servlet/htmlunit/HtmlUnitRequestBuilderTests.java @@ -16,6 +16,7 @@ package org.springframework.test.web.servlet.htmlunit; +import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.nio.charset.Charset; @@ -53,6 +54,7 @@ import org.springframework.test.web.servlet.setup.MockMvcBuilders; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; +import static org.assertj.core.api.SoftAssertions.assertSoftly; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; /** @@ -449,11 +451,20 @@ public class HtmlUnitRequestBuilderTests { assertThat(actualRequest.getParts()).hasSize(1); Part part = actualRequest.getPart("key"); - assertThat(part).isNotNull(); - assertThat(part.getName()).isEqualTo("key"); - assertThat(IOUtils.toString(part.getInputStream(), StandardCharsets.UTF_8)).isEqualTo(""); - assertThat(part.getSubmittedFileName()).isNull(); - assertThat(part.getContentType()).isNull(); + + assertSoftly(softly -> { + softly.assertThat(part).isNotNull(); + softly.assertThat(part.getName()).as("name").isEqualTo("key"); + softly.assertThat(part.getSize()).as("size").isEqualTo(0); + try { + softly.assertThat(part.getInputStream()).isEmpty(); + } + catch (IOException ex) { + softly.fail("failed to get InputStream", ex); + } + softly.assertThat(part.getSubmittedFileName()).as("filename").isEqualTo(""); + softly.assertThat(part.getContentType()).as("content-type").isEqualTo("application/octet-stream"); + }); } @Test