Please add tests and create a PR. The tests are the best way to see the intent of the changes.
Gary On Fri, May 2, 2025, 12:52 Robert Turner <[email protected]> wrote: > Thanks -- I have a local patch [1] on my machine (that I am just testing > now) if that is of interest to you (no tests added for it yet) > > [1] > 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 29876e9a..952b7920 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 > @@ -149,6 +149,11 @@ public abstract class AbstractFileUpload<R, I extends > FileItem<I>, F extends Fil > */ > private F fileItemFactory; > > + /** > + * Controls part detection and skipping. > + */ > + private boolean skipPartsWithoutNames = true; > + > /** > * Gets the boundary from the {@code Content-type} header. > * > @@ -558,4 +563,27 @@ public abstract class AbstractFileUpload<R, I extends > FileItem<I>, F extends Fil > this.sizeMax = sizeMax; > } > > + /** > + * Returns the current setting for skipping parts without names. The > default value is true. > + * > + * @return true if parts without form field names or file names will > be skipped, > + * false to include all parts. > + * @see #setSkipPartsWithoutNames(boolean) > + */ > + public boolean getSkipPartsWithoutNames() { > + return skipPartsWithoutNames; > + } > + > + /** > + * Enables or disables the skipping of parts with form field names or > file names. This > + * can be used by calling code to consume multipart payloads that are > not fully supported > + * by this library. > + * > + * @param skipPartsWithoutNames Indicates that parts without names > should be skipped. > + * The default value is true. > + * @see #getSkipPartsWithoutNames() > + */ > + public void setSkipPartsWithoutNames(final boolean > skipPartsWithoutNames) { > + this.skipPartsWithoutNames = skipPartsWithoutNames; > + } > } > 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 83fdfaaa..b40e927d 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 > @@ -184,7 +184,7 @@ class FileItemInputIteratorImpl implements > FileItemInputIterator { > } > } else { > final var fileName = fileUpload.getFileName(headers); > - if (fileName != null) { > + if (!fileUpload.getSkipPartsWithoutNames() || fileName != > null) { > currentItem = new FileItemInputImpl(this, fileName, > currentFieldName, headers.getHeader(AbstractFileUpload.CONTENT_TYPE), > false, > getContentLength(headers)); > currentItem.setHeaders(headers); > > On Fri, May 2, 2025 at 12:45 PM Gary Gregory <[email protected]> > wrote: > > > I'll take a look at this and see if we can make it play nice with SOAP... > > > > Gary > > > > On Fri, May 2, 2025, 12:04 Robert Turner <[email protected]> > > wrote: > > > > > I've been trying to find a solution to easily allow receiving > attachments > > > in a multipart payload (such as "multipart/related") [1]. The > FileUpload > > > library comes very close to allowing us to at least receive such parts. > > > > > > However, with the current implementation (2.0.0-M2) > > > of FileItemInputIteratorImpl [3], any parts without a form field name > > > ("name" value in the Content-Disposition header) or a file name > > ("filename" > > > value in the Content-Disposition header) are discarded. A related, but > > not > > > identical, work item is in the project jira, as FILEUPLOAD-281 [2], but > > > this is quite an old item (from 2017) and the proposed patch is likely > no > > > longer suitable. > > > > > > I have been looking at the code, and I'm wondering if there is an easy > > way > > > that at least partial support for these "unsupported" multipart > payloads > > > could be added without much effort. At a fairly quick glance, it looks > > like > > > one could eliminate or bypass the `if (fileName == null)` check in > > > FileItemInputIteratorImpl::findNextItem [3], and it "would work" -- > > > however, any code that relied on having a file name might fail -- but I > > > don't see anything in the library that would fail, it would be client > > code > > > most likely that would fail (a breaking change). > > > > > > As such, a change like that would likely want to be controlled by some > > > "flag" or similar when constructing the "FileUpload" object (derived > from > > > AbstractFileUpload [4]), or by adding a method to control that flag to > > > AbstractFileUpload [4]. > > > > > > I am happy to implement a solution / patch and post a PR / change, but > > > given that I am not intimately familiar with the project, the > proposals / > > > suggestions above may not be in line with how the project wants to > > evolve, > > > etc. If adding such functionality (or similar) is not desirable, I will > > > likely resort to patching it in some way to at least bypass this > > > limitation, or trying to find another solution / library. > > > > > > As such, feedback on this would be greatly appreciated before I invest > > > additional effort going in the "wrong direction". > > > > > > Thanks for any feedback anyone can provide, > > > > > > Robert > > > > > > > > > [1] Motivation for this comes from trying to support a "SOAP with > > > attachments" style interface (not popular, but unfortunately used by a > > > product we need to integrate with, and is unchangeable by us). The > > > related W3 document for this is "SOAP-attachments" ( > > > https://www.w3.org/TR/SOAP-attachments), which uses the Content-ID > part > > > header to identify parts instead of form fields or filenames. > > > > > > [2] https://issues.apache.org/jira/browse/FILEUPLOAD-281 > > > > > > [3] > > > > > > > > > https://github.com/apache/commons-fileupload/blob/master/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/core/FileItemInputIteratorImpl.java#L127 > > > > > > [4] > > > > > > > > > https://github.com/apache/commons-fileupload/blob/master/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/core/AbstractFileUpload.java > > > > > >
