This is an automated email from the ASF dual-hosted git repository. ggregory pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-fileupload.git
The following commit(s) were added to refs/heads/master by this push: new 3240e921 AbstractFileUpload support for partHeaderSizeMax limit (#429) 3240e921 is described below commit 3240e921c92659bdb79aa20f7fad86189d0f1460 Author: Ryan J Murphy <ryanm...@gmail.com> AuthorDate: Tue Sep 9 08:37:51 2025 -0600 AbstractFileUpload support for partHeaderSizeMax limit (#429) --- .../fileupload2/core/AbstractFileUpload.java | 27 +++++++++++++++++++ .../core/FileItemInputIteratorImpl.java | 7 ++++- .../commons/fileupload2/core/MultipartInput.java | 18 ++++++------- .../fileupload2/core/AbstractSizesTest.java | 30 ++++++++++++++++++++++ 4 files changed, 72 insertions(+), 10 deletions(-) diff --git a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/core/AbstractFileUpload.java b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/core/AbstractFileUpload.java index bef1e29a..90b3ec86 100644 --- a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/core/AbstractFileUpload.java +++ b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/core/AbstractFileUpload.java @@ -134,6 +134,11 @@ public abstract class AbstractFileUpload<R, I extends FileItem<I>, F extends Fil */ private long fileCountMax = -1; + /** + * The maximum permitted size of the headers provided with a single part in bytes. + */ + private int partHeaderSizeMax = MultipartInput.DEFAULT_PART_HEADER_SIZE_MAX; + /** * The content encoding to use when reading part headers. */ @@ -347,6 +352,17 @@ public abstract class AbstractFileUpload<R, I extends FileItem<I>, F extends Fil return headers; } + /** + * Gets the per part size limit for headers. + * + * @return The maximum size of the headers for a single part in bytes. + * + * @since 2.0.0-M5 + */ + public int getPartHeaderSizeMax() { + return partHeaderSizeMax; + } + /** * Gets the progress listener. * @@ -548,6 +564,17 @@ public abstract class AbstractFileUpload<R, I extends FileItem<I>, F extends Fil this.headerCharset = headerCharset; } + /** + * Sets the per part size limit for headers. + * + * @param partHeaderSizeMax The maximum size of the headers in bytes. + * + * @since 2.0.0-M5 + */ + public void setPartHeaderSizeMax(final int partHeaderSizeMax) { + this.partHeaderSizeMax = partHeaderSizeMax; + } + /** * Sets the progress listener. * diff --git a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/core/FileItemInputIteratorImpl.java b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/core/FileItemInputIteratorImpl.java index f35c2fbb..23a60424 100644 --- a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/core/FileItemInputIteratorImpl.java +++ b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/core/FileItemInputIteratorImpl.java @@ -290,7 +290,12 @@ class FileItemInputIteratorImpl implements FileItemInputIterator { progressNotifier = new MultipartInput.ProgressNotifier(fileUploadBase.getProgressListener(), requestSize); try { - multiPartInput = MultipartInput.builder().setInputStream(inputStream).setBoundary(multiPartBoundary).setProgressNotifier(progressNotifier).get(); + multiPartInput = MultipartInput.builder() + .setInputStream(inputStream) + .setBoundary(multiPartBoundary) + .setProgressNotifier(progressNotifier) + .setPartHeaderSizeMax(fileUploadBase.getPartHeaderSizeMax()) + .get(); } catch (final IllegalArgumentException e) { IOUtils.closeQuietly(inputStream); // avoid possible resource leak throw new FileUploadContentTypeException(String.format("The boundary specified in the %s header is too long", AbstractFileUpload.CONTENT_TYPE), e); diff --git a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/core/MultipartInput.java b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/core/MultipartInput.java index 18ff991b..122ecb7b 100644 --- a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/core/MultipartInput.java +++ b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/core/MultipartInput.java @@ -160,15 +160,15 @@ public final class MultipartInput { return this; } - /** Sets the per part size limit for headers. - * @param partHeaderSizeMax The maximum size of the headers in bytes. - * @return This builder. - * @since 2.0.0-M4 - */ - public Builder setPartHeaderSizeMax(final int partHeaderSizeMax) { - this.partHeaderSizeMax = partHeaderSizeMax; - return this; - } + /** Sets the per part size limit for headers. + * @param partHeaderSizeMax The maximum size of the headers in bytes. + * @return This builder. + * @since 2.0.0-M4 + */ + public Builder setPartHeaderSizeMax(final int partHeaderSizeMax) { + this.partHeaderSizeMax = partHeaderSizeMax; + return this; + } /** * Sets the progress notifier. diff --git a/commons-fileupload2-core/src/test/java/org/apache/commons/fileupload2/core/AbstractSizesTest.java b/commons-fileupload2-core/src/test/java/org/apache/commons/fileupload2/core/AbstractSizesTest.java index 3f7beed8..208893bc 100644 --- a/commons-fileupload2-core/src/test/java/org/apache/commons/fileupload2/core/AbstractSizesTest.java +++ b/commons-fileupload2-core/src/test/java/org/apache/commons/fileupload2/core/AbstractSizesTest.java @@ -39,6 +39,36 @@ import org.junit.jupiter.api.Test; public abstract class AbstractSizesTest<AFU extends AbstractFileUpload<R, I, F>, R, I extends FileItem<I>, F extends FileItemFactory<I>> extends AbstractTest<AFU, R, I, F> { + /** + * Checks whether limiting the PartHeaderSizeMax works. + * + * @throws IOException Test failure. + */ + @Test + void testFilePartHeaderSizeMax() throws IOException { + final String request = "-----1234\r\n" + + "Content-Disposition: form-data; name=\"file\"; filename=\"foo.tab\"\r\n" + + "Content-Type: text/whatever\r\n" + + "Content-Length: 10\r\n" + + "\r\n" + + "This is the content of the file\n" + + "\r\n" + + "-----1234--\r\n"; + + final var upload = newFileUpload(); + upload.setPartHeaderSizeMax(200); + final var req = newMockHttpServletRequest(request, null, null); + final var fileItems = upload.parseRequest(req); + assertEquals(1, fileItems.size()); + final var item = fileItems.get(0); + assertEquals("This is the content of the file\n", new String(item.get())); + + var upload2 = newFileUpload(); + upload2.setPartHeaderSizeMax(10); + var req2 = newMockHttpServletRequest(request, null, null); + assertThrows(FileUploadSizeException.class, () -> upload2.parseRequest(req2)); + } + /** * Checks, whether limiting the file size works. *