Okay, so it seems the functionality I need has already been added in
`master` [1] around 1 year ago, but hasn't been released yet.

Is there a timeline for the next release?

[1] https://github.com/apache/commons-fileupload/pull/315


On Fri, May 2, 2025 at 1:35 PM Robert Turner <rtur...@e-djuster.ca> wrote:

> Looking at the code further, there is some code to support
> "multipart/related", but for some reason it doesn't seem to be being used
> in my use case. I will dig into it further and try to figure out what
> that's not being used in this case.
>
> On Fri, May 2, 2025 at 1:21 PM Robert Turner <rtur...@e-djuster.ca> wrote:
>
>> Will do... I'll try to get a PR posted over the next couple of days.
>>
>> On Fri, May 2, 2025 at 1:20 PM Gary Gregory <garydgreg...@gmail.com>
>> wrote:
>>
>>> 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 <rtur...@e-djuster.ca.invalid>
>>> 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 <garydgreg...@gmail.com>
>>> > 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
>>> <rtur...@e-djuster.ca.invalid>
>>> > > 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
>>> > > >
>>> > >
>>> >
>>>
>>

Reply via email to