You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2023/06/11 21:33:12 UTC

[commons-fileupload] branch master updated (16f5632 -> 59c7c13)

This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/commons-fileupload.git


    from 16f5632  Use a file item builder
     new e73b583  Javadoc
     new 24ec422  Use "Input" instead of "Stream" in class names
     new c2f45e9  Use Charset instead of String
     new 59c7c13  FileItemInputIterator now extends IOIterator<FileItemInput>

The 4 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../commons/fileupload2/AbstractFileUpload.java    |  45 +++++----
 .../commons/fileupload2/FileItemFactory.java       |  11 +--
 .../commons/fileupload2/FileItemHeadersImpl.java   |   3 +-
 .../fileupload2/FileItemHeadersSupport.java        |   6 +-
 .../{FileItemStream.java => FileItemInput.java}    |   8 +-
 ...eItemStreamImpl.java => FileItemInputImpl.java} |  22 ++---
 ...temIterator.java => FileItemInputIterator.java} |  16 ++--
 ...torImpl.java => FileItemInputIteratorImpl.java} | 101 +++++++++++----------
 .../org/apache/commons/fileupload2/FileUpload.java |   4 +-
 .../{MultipartStream.java => MultipartInput.java}  |  78 +++++++---------
 .../commons/fileupload2/ParameterParser.java       |   6 +-
 .../apache/commons/fileupload2/RequestContext.java |  14 +++
 .../commons/fileupload2/disk/DiskFileItem.java     |  14 ++-
 .../fileupload2/disk/DiskFileItemFactory.java      |   6 +-
 .../fileupload2/AbstractFileUploadTest.java        |  12 +--
 .../fileupload2/AbstractProgressListenerTest.java  |   6 +-
 .../commons/fileupload2/AbstractSizesTest.java     |   6 +-
 .../commons/fileupload2/AbstractStreamingTest.java |  10 +-
 .../commons/fileupload2/MultipartStreamTest.java   |  16 ++--
 .../disk/DiskFileItemSerializeTest.java            |  11 ++-
 .../jakarta/JakartaServletFileUpload.java          |   6 +-
 .../fileupload2/javax/JavaxServletFileUpload.java  |   6 +-
 .../portlet/JavaxPortletFileUpload.java            |   6 +-
 23 files changed, 213 insertions(+), 200 deletions(-)
 rename commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/{FileItemStream.java => FileItemInput.java} (92%)
 rename commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/{FileItemStreamImpl.java => FileItemInputImpl.java} (86%)
 rename commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/{FileItemIterator.java => FileItemInputIterator.java} (90%)
 rename commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/{FileItemIteratorImpl.java => FileItemInputIteratorImpl.java} (71%)
 rename commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/{MultipartStream.java => MultipartInput.java} (92%)


[commons-fileupload] 04/04: FileItemInputIterator now extends IOIterator

Posted by gg...@apache.org.
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

commit 59c7c13cfb8b9f3d719c601dea6d9f84eb453a2b
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Sun Jun 11 17:31:16 2023 -0400

    FileItemInputIterator now extends IOIterator<FileItemInput>
---
 .../org/apache/commons/fileupload2/AbstractFileUpload.java   | 12 +++++-------
 .../apache/commons/fileupload2/FileItemInputIterator.java    | 10 +++++++---
 .../commons/fileupload2/FileItemInputIteratorImpl.java       | 11 +++++++++--
 3 files changed, 21 insertions(+), 12 deletions(-)

diff --git a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/AbstractFileUpload.java b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/AbstractFileUpload.java
index 3b533a7..8097de9 100644
--- a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/AbstractFileUpload.java
+++ b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/AbstractFileUpload.java
@@ -259,14 +259,14 @@ public abstract class AbstractFileUpload {
     /**
      * Gets an <a href="http://www.ietf.org/rfc/rfc1867.txt">RFC 1867</a> compliant {@code multipart/form-data} stream.
      *
-     * @param ctx The context for the request to be parsed.
+     * @param requestContext The context for the request to be parsed.
      * @return An iterator to instances of {@code FileItemInput} parsed from the request, in the order that they were transmitted.
      * @throws FileUploadException if there are problems reading/parsing the request or storing files.
      * @throws IOException         An I/O error occurred. This may be a network error while communicating with the client or a problem while storing the
      *                             uploaded content.
      */
-    public FileItemInputIterator getItemIterator(final RequestContext ctx) throws FileUploadException, IOException {
-        return new FileItemInputIteratorImpl(this, ctx);
+    public FileItemInputIterator getItemIterator(final RequestContext requestContext) throws FileUploadException, IOException {
+        return new FileItemInputIteratorImpl(this, requestContext);
     }
 
     /**
@@ -410,15 +410,13 @@ public abstract class AbstractFileUpload {
         final List<FileItem> itemList = new ArrayList<>();
         boolean successful = false;
         try {
-            final FileItemInputIterator iter = getItemIterator(requestContext);
             final FileItemFactory fileItemFactory = Objects.requireNonNull(getFileItemFactory(), "No FileItemFactory has been set.");
             final byte[] buffer = new byte[IOUtils.DEFAULT_BUFFER_SIZE];
-            while (iter.hasNext()) {
+            getItemIterator(requestContext).forEachRemaining(fileItemInput -> {
                 if (itemList.size() == fileCountMax) {
                     // The next item will exceed the limit.
                     throw new FileUploadFileCountLimitException(ATTACHMENT, getFileCountMax(), itemList.size());
                 }
-                final FileItemInput fileItemInput = iter.next();
                 // Don't use getName() here to prevent an InvalidFileNameException.
                 final String fileName = fileItemInput.getName();
                 // @formatter:off
@@ -439,7 +437,7 @@ public abstract class AbstractFileUpload {
                 } catch (final IOException e) {
                     throw new FileUploadException(String.format("Processing of %s request failed. %s", MULTIPART_FORM_DATA, e.getMessage()), e);
                 }
-            }
+            });
             successful = true;
             return itemList;
         } catch (final FileUploadException e) {
diff --git a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItemInputIterator.java b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItemInputIterator.java
index a9ddc31..34d4e73 100644
--- a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItemInputIterator.java
+++ b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItemInputIterator.java
@@ -21,10 +21,12 @@ import java.util.List;
 
 import javax.naming.SizeLimitExceededException;
 
+import org.apache.commons.io.function.IOIterator;
+
 /**
  * An iterator, as returned by {@link AbstractFileUpload#getItemIterator(RequestContext)}.
  */
-public interface FileItemInputIterator {
+public interface FileItemInputIterator extends IOIterator<FileItemInput> {
 
     List<FileItem> getFileItems() throws FileUploadException, IOException;
 
@@ -53,7 +55,8 @@ public interface FileItemInputIterator {
      * @throws IOException         Reading the file item failed.
      * @return True, if one or more additional file items are available, otherwise false.
      */
-    boolean hasNext() throws FileUploadException, IOException;
+    @Override
+    boolean hasNext() throws IOException;
 
     /**
      * Returns the next available {@link FileItemInput}.
@@ -63,7 +66,8 @@ public interface FileItemInputIterator {
      * @throws IOException                      Reading the file item failed.
      * @return FileItemInput instance, which provides access to the next file item.
      */
-    FileItemInput next() throws FileUploadException, IOException;
+    @Override
+    FileItemInput next() throws IOException;
 
     /**
      * Sets the maximum size of a single file. An {@link FileUploadByteCountLimitException} will be thrown, if there is an uploaded file, which is exceeding
diff --git a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItemInputIteratorImpl.java b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItemInputIteratorImpl.java
index 5156035..b11f760 100644
--- a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItemInputIteratorImpl.java
+++ b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItemInputIteratorImpl.java
@@ -20,6 +20,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.nio.charset.Charset;
 import java.util.ArrayList;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Locale;
 import java.util.NoSuchElementException;
@@ -236,7 +237,7 @@ class FileItemInputIteratorImpl implements FileItemInputIterator {
      * @return True, if one or more additional file items are available, otherwise false.
      */
     @Override
-    public boolean hasNext() throws FileUploadException, IOException {
+    public boolean hasNext() throws IOException {
         if (eof) {
             return false;
         }
@@ -305,7 +306,7 @@ class FileItemInputIteratorImpl implements FileItemInputIterator {
      * @return FileItemInput instance, which provides access to the next file item.
      */
     @Override
-    public FileItemInput next() throws FileUploadException, IOException {
+    public FileItemInput next() throws IOException {
         if (eof || !itemValid && !hasNext()) {
             throw new NoSuchElementException();
         }
@@ -323,4 +324,10 @@ class FileItemInputIteratorImpl implements FileItemInputIterator {
         this.sizeMax = sizeMax;
     }
 
+    @Override
+    public Iterator<FileItemInput> unwrap() {
+        // TODO Something better?
+        return (Iterator<FileItemInput>) this;
+    }
+
 }


[commons-fileupload] 03/04: Use Charset instead of String

Posted by gg...@apache.org.
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

commit c2f45e91d9b03646ba9a29a25b9d1625dac5237c
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Sun Jun 11 17:20:52 2023 -0400

    Use Charset instead of String
    
    Update internal names
---
 .../commons/fileupload2/AbstractFileUpload.java    | 15 +++----
 .../commons/fileupload2/FileItemInputImpl.java     |  2 +-
 .../fileupload2/FileItemInputIteratorImpl.java     | 48 +++++++++++-----------
 .../apache/commons/fileupload2/MultipartInput.java | 47 +++++++++------------
 .../commons/fileupload2/ParameterParser.java       |  6 +--
 .../apache/commons/fileupload2/RequestContext.java | 14 +++++++
 6 files changed, 68 insertions(+), 64 deletions(-)

diff --git a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/AbstractFileUpload.java b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/AbstractFileUpload.java
index e0e0085..3b533a7 100644
--- a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/AbstractFileUpload.java
+++ b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/AbstractFileUpload.java
@@ -19,6 +19,7 @@ package org.apache.commons.fileupload2;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -118,7 +119,7 @@ public abstract class AbstractFileUpload {
     /**
      * The content encoding to use when reading part headers.
      */
-    private String headerEncoding;
+    private Charset headerCharset;
 
     /**
      * The progress listener.
@@ -160,7 +161,7 @@ public abstract class AbstractFileUpload {
      * Gets the field name, which is given by the content-disposition header.
      *
      * @param contentDisposition The content-dispositions header value.
-     * @return The field jake
+     * @return The field name.
      */
     private String getFieldName(final String contentDisposition) {
         String fieldName = null;
@@ -251,8 +252,8 @@ public abstract class AbstractFileUpload {
      *
      * @return The encoding used to read part headers.
      */
-    public String getHeaderEncoding() {
-        return headerEncoding;
+    public Charset getHeaderCharset() {
+        return headerCharset;
     }
 
     /**
@@ -488,10 +489,10 @@ public abstract class AbstractFileUpload {
      * Specifies the character encoding to be used when reading the headers of individual part. When not specified, or {@code null}, the request encoding is
      * used. If that is also not specified, or {@code null}, the platform default encoding is used.
      *
-     * @param encoding The encoding used to read part headers.
+     * @param headerCharset The encoding used to read part headers.
      */
-    public void setHeaderEncoding(final String encoding) {
-        headerEncoding = encoding;
+    public void setHeaderCharset(final Charset headerCharset) {
+        this.headerCharset = headerCharset;
     }
 
     /**
diff --git a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItemInputImpl.java b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItemInputImpl.java
index a559fb6..dababa3 100644
--- a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItemInputImpl.java
+++ b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItemInputImpl.java
@@ -96,7 +96,7 @@ class FileItemInputImpl implements FileItemInput {
                     contentLength, fileSizeMax, fileName, fieldName);
         }
         // OK to construct stream now
-        final ItemInputStream itemInputStream = fileItemInputIteratorImpl.getMultiPartStream().newInputStream();
+        final ItemInputStream itemInputStream = fileItemInputIteratorImpl.getMultiPartInput().newInputStream();
         InputStream istream = itemInputStream;
         if (fileSizeMax != -1) {
             istream = new BoundedInputStream(istream, fileSizeMax) {
diff --git a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItemInputIteratorImpl.java b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItemInputIteratorImpl.java
index 2b6dc7a..5156035 100644
--- a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItemInputIteratorImpl.java
+++ b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItemInputIteratorImpl.java
@@ -18,12 +18,14 @@ package org.apache.commons.fileupload2;
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.nio.charset.Charset;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Locale;
 import java.util.NoSuchElementException;
 import java.util.Objects;
 
+import org.apache.commons.io.Charsets;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.io.input.BoundedInputStream;
 
@@ -44,7 +46,7 @@ class FileItemInputIteratorImpl implements FileItemInputIterator {
      *
      * @see RequestContext
      */
-    private final RequestContext ctx;
+    private final RequestContext requestContext;
 
     /**
      * The maximum allowed size of a complete request.
@@ -59,7 +61,7 @@ class FileItemInputIteratorImpl implements FileItemInputIterator {
     /**
      * The multi part stream to process.
      */
-    private MultipartInput multiPartStream;
+    private MultipartInput multiPartInput;
 
     /**
      * The notifier, which used for triggering the {@link ProgressListener}.
@@ -108,7 +110,7 @@ class FileItemInputIteratorImpl implements FileItemInputIterator {
         this.fileUpload = fileUploadBase;
         this.sizeMax = fileUploadBase.getSizeMax();
         this.fileSizeMax = fileUploadBase.getFileSizeMax();
-        this.ctx = Objects.requireNonNull(requestContext, "requestContext");
+        this.requestContext = Objects.requireNonNull(requestContext, "requestContext");
         this.skipPreamble = true;
         findNextItem();
     }
@@ -127,7 +129,7 @@ class FileItemInputIteratorImpl implements FileItemInputIterator {
             currentItem.close();
             currentItem = null;
         }
-        final MultipartInput multi = getMultiPartStream();
+        final MultipartInput multi = getMultiPartInput();
         for (;;) {
             final boolean nextPart;
             if (skipPreamble) {
@@ -214,11 +216,11 @@ class FileItemInputIteratorImpl implements FileItemInputIterator {
         return fileSizeMax;
     }
 
-    public MultipartInput getMultiPartStream() throws FileUploadException, IOException {
-        if (multiPartStream == null) {
-            init(fileUpload, ctx);
+    public MultipartInput getMultiPartInput() throws FileUploadException, IOException {
+        if (multiPartInput == null) {
+            init(fileUpload, requestContext);
         }
-        return multiPartStream;
+        return multiPartInput;
     }
 
     @Override
@@ -244,21 +246,21 @@ class FileItemInputIteratorImpl implements FileItemInputIterator {
         return findNextItem();
     }
 
-    protected void init(final AbstractFileUpload fileUploadBase, final RequestContext requestContext) throws FileUploadException, IOException {
-        final String contentType = ctx.getContentType();
+    protected void init(final AbstractFileUpload fileUploadBase, final RequestContext initContext) throws FileUploadException, IOException {
+        final String contentType = requestContext.getContentType();
         if (null == contentType || !contentType.toLowerCase(Locale.ENGLISH).startsWith(AbstractFileUpload.MULTIPART)) {
             throw new FileUploadContentTypeException(String.format("the request doesn't contain a %s or %s stream, content type header is %s",
                     AbstractFileUpload.MULTIPART_FORM_DATA, AbstractFileUpload.MULTIPART_MIXED, contentType), contentType);
         }
-        final long contentLengthInt = ctx.getContentLength();
+        final long contentLengthInt = requestContext.getContentLength();
         // @formatter:off
-        final long requestSize = RequestContext.class.isAssignableFrom(ctx.getClass())
+        final long requestSize = RequestContext.class.isAssignableFrom(requestContext.getClass())
                                  // Inline conditional is OK here CHECKSTYLE:OFF
-                                 ? ctx.getContentLength()
+                                 ? requestContext.getContentLength()
                                  : contentLengthInt;
                                  // CHECKSTYLE:ON
         // @formatter:on
-        final InputStream input; // N.B. this is eventually closed in MultipartInput processing
+        final InputStream inputStream; // N.B. this is eventually closed in MultipartInput processing
         if (sizeMax >= 0) {
             if (requestSize != -1 && requestSize > sizeMax) {
                 throw new FileUploadSizeException(
@@ -266,7 +268,7 @@ class FileItemInputIteratorImpl implements FileItemInputIterator {
                         requestSize);
             }
             // N.B. this is eventually closed in MultipartInput processing
-            input = new BoundedInputStream(ctx.getInputStream(), sizeMax) {
+            inputStream = new BoundedInputStream(requestContext.getInputStream(), sizeMax) {
                 @Override
                 protected void onMaxLength(final long maxLen, final long count) throws IOException {
                     throw new FileUploadSizeException(
@@ -274,28 +276,24 @@ class FileItemInputIteratorImpl implements FileItemInputIterator {
                 }
             };
         } else {
-            input = ctx.getInputStream();
-        }
-
-        String charEncoding = fileUploadBase.getHeaderEncoding();
-        if (charEncoding == null) {
-            charEncoding = ctx.getCharacterEncoding();
+            inputStream = requestContext.getInputStream();
         }
 
+        final Charset charset = Charsets.toCharset(fileUploadBase.getHeaderCharset(), requestContext.getCharset());
         multiPartBoundary = fileUploadBase.getBoundary(contentType);
         if (multiPartBoundary == null) {
-            IOUtils.closeQuietly(input); // avoid possible resource leak
+            IOUtils.closeQuietly(inputStream); // avoid possible resource leak
             throw new FileUploadException("the request was rejected because no multipart boundary was found");
         }
 
         progressNotifier = new MultipartInput.ProgressNotifier(fileUploadBase.getProgressListener(), requestSize);
         try {
-            multiPartStream = MultipartInput.builder().setInputStream(input).setBoundary(multiPartBoundary).setProgressNotifier(progressNotifier).get();
+            multiPartInput = MultipartInput.builder().setInputStream(inputStream).setBoundary(multiPartBoundary).setProgressNotifier(progressNotifier).get();
         } catch (final IllegalArgumentException e) {
-            IOUtils.closeQuietly(input); // avoid possible resource leak
+            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);
         }
-        multiPartStream.setHeaderEncoding(charEncoding);
+        multiPartInput.setHeaderCharset(charset);
     }
 
     /**
diff --git a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/MultipartInput.java b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/MultipartInput.java
index 827fae3..6f79dcf 100644
--- a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/MultipartInput.java
+++ b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/MultipartInput.java
@@ -24,6 +24,7 @@ import java.io.UnsupportedEncodingException;
 import java.nio.charset.Charset;
 
 import org.apache.commons.fileupload2.FileItemInput.ItemSkippedException;
+import org.apache.commons.io.Charsets;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.io.build.AbstractOrigin;
 import org.apache.commons.io.build.AbstractStreamBuilder;
@@ -531,32 +532,32 @@ public final class MultipartInput {
     /**
      * The maximum length of {@code header-part} that will be processed (10 kilobytes = 10240 bytes.).
      */
-    public static final int HEADER_PART_SIZE_MAX = 10240;
+    public static final int HEADER_PART_SIZE_MAX = 10_240;
 
     /**
      * The default length of the buffer used for processing a request.
      */
-    protected static final int DEFAULT_BUFSIZE = 4096;
+    static final int DEFAULT_BUFSIZE = 4096;
 
     /**
      * A byte sequence that marks the end of {@code header-part} ({@code CRLFCRLF}).
      */
-    protected static final byte[] HEADER_SEPARATOR = { CR, LF, CR, LF };
+    static final byte[] HEADER_SEPARATOR = { CR, LF, CR, LF };
 
     /**
      * A byte sequence that that follows a delimiter that will be followed by an encapsulation ({@code CRLF}).
      */
-    protected static final byte[] FIELD_SEPARATOR = { CR, LF };
+    static final byte[] FIELD_SEPARATOR = { CR, LF };
 
     /**
      * A byte sequence that that follows a delimiter of the last encapsulation in the stream ({@code --}).
      */
-    protected static final byte[] STREAM_TERMINATOR = { DASH, DASH };
+    static final byte[] STREAM_TERMINATOR = { DASH, DASH };
 
     /**
      * A byte sequence that precedes a boundary ({@code CRLF--}).
      */
-    protected static final byte[] BOUNDARY_PREFIX = { CR, LF, DASH, DASH };
+    static final byte[] BOUNDARY_PREFIX = { CR, LF, DASH, DASH };
 
     /**
      * Compares {@code count} first bytes in the arrays {@code a} and {@code b}.
@@ -566,7 +567,7 @@ public final class MultipartInput {
      * @param count How many bytes should be compared.
      * @return {@code true} if {@code count} first bytes in arrays {@code a} and {@code b} are equal.
      */
-    public static boolean arrayEquals(final byte[] a, final byte[] b, final int count) {
+    static boolean arrayEquals(final byte[] a, final byte[] b, final int count) {
         for (int i = 0; i < count; i++) {
             if (a[i] != b[i]) {
                 return false;
@@ -634,7 +635,7 @@ public final class MultipartInput {
     /**
      * The content encoding to use when reading headers.
      */
-    private String headerEncoding;
+    private Charset headerCharset;
 
     /**
      * The progress notifier, if any, or null.
@@ -765,8 +766,8 @@ public final class MultipartInput {
      *
      * @return The encoding used to read part headers.
      */
-    public String getHeaderEncoding() {
-        return headerEncoding;
+    public Charset getHeaderCharset() {
+        return headerCharset;
     }
 
     /**
@@ -863,9 +864,6 @@ public final class MultipartInput {
      * <p>
      * Headers are returned verbatim to the input stream, including the trailing {@code CRLF} marker. Parsing is left to the application.
      * </p>
-     * <p>
-     * <strong>TODO</strong> allow limiting maximum header size to protect against abuse.
-     * </p>
      *
      * @return The {@code header-part} of the current encapsulation.
      * @throws FileUploadSizeException  if the bytes read from the stream exceeded the size limits.
@@ -898,19 +896,12 @@ public final class MultipartInput {
             baos.write(b);
         }
 
-        String headers;
-        if (headerEncoding != null) {
-            try {
-                headers = baos.toString(headerEncoding);
-            } catch (final UnsupportedEncodingException e) {
-                // Fall back to platform default if specified encoding is not supported.
-                headers = baos.toString();
-            }
-        } else {
-            headers = baos.toString();
+        try {
+            return baos.toString(Charsets.toCharset(headerCharset, Charset.defaultCharset()).name());
+        } catch (final UnsupportedEncodingException e) {
+            // not possible
+            throw new IllegalStateException(e);
         }
-
-        return headers;
     }
 
     /**
@@ -940,10 +931,10 @@ public final class MultipartInput {
      * Sets the character encoding to be used when reading the headers of individual parts. When not specified, or {@code null}, the platform default encoding
      * is used.
      *
-     * @param headerEncoding The encoding used to read part headers.
+     * @param headerCharset The encoding used to read part headers.
      */
-    public void setHeaderEncoding(final String headerEncoding) {
-        this.headerEncoding = headerEncoding;
+    public void setHeaderCharset(final Charset headerCharset) {
+        this.headerCharset = headerCharset;
     }
 
     /**
diff --git a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/ParameterParser.java b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/ParameterParser.java
index cd65201..94e4cdd 100644
--- a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/ParameterParser.java
+++ b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/ParameterParser.java
@@ -288,10 +288,10 @@ public class ParameterParser {
     /**
      * Sets the flag if parameter names are to be converted to lower case when name/value pairs are parsed.
      *
-     * @param b {@code true} if parameter names are to be converted to lower case when name/value pairs are parsed. {@code false} otherwise.
+     * @param lowerCaseNames {@code true} if parameter names are to be converted to lower case when name/value pairs are parsed. {@code false} otherwise.
      */
-    public void setLowerCaseNames(final boolean b) {
-        this.lowerCaseNames = b;
+    public void setLowerCaseNames(final boolean lowerCaseNames) {
+        this.lowerCaseNames = lowerCaseNames;
     }
 
 }
diff --git a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/RequestContext.java b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/RequestContext.java
index b463497..ca87751 100644
--- a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/RequestContext.java
+++ b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/RequestContext.java
@@ -18,6 +18,10 @@ package org.apache.commons.fileupload2;
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.nio.charset.Charset;
+import java.nio.charset.UnsupportedCharsetException;
+
+import org.apache.commons.io.Charsets;
 
 /**
  * Abstracts access to the request information needed for file uploads.
@@ -34,6 +38,16 @@ public interface RequestContext {
      */
     String getCharacterEncoding();
 
+    /**
+     * Gets the character encoding for the request.
+     *
+     * @return The character encoding for the request.
+     * @throws UnsupportedCharsetException If the named charset is unavailable (unchecked exception).
+     */
+    default Charset getCharset() throws UnsupportedCharsetException {
+        return Charsets.toCharset(getCharacterEncoding(), null);
+    }
+
     /**
      * Gets the content length of the request.
      *


[commons-fileupload] 01/04: Javadoc

Posted by gg...@apache.org.
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

commit e73b58369eb4c0e780567e4d015111bd92449557
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Sun Jun 11 15:09:47 2023 -0400

    Javadoc
    
    Inline single use variable
---
 .../org/apache/commons/fileupload2/AbstractFileUpload.java |  6 +++---
 .../org/apache/commons/fileupload2/FileItemFactory.java    | 11 +----------
 .../org/apache/commons/fileupload2/disk/DiskFileItem.java  | 14 ++++++++++----
 .../commons/fileupload2/disk/DiskFileItemFactory.java      |  6 ++++--
 .../apache/commons/fileupload2/AbstractFileUploadTest.java | 12 ++++++------
 .../fileupload2/disk/DiskFileItemSerializeTest.java        | 11 +++++++----
 6 files changed, 31 insertions(+), 29 deletions(-)

diff --git a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/AbstractFileUpload.java b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/AbstractFileUpload.java
index bd5f566..7c30e6e 100644
--- a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/AbstractFileUpload.java
+++ b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/AbstractFileUpload.java
@@ -401,15 +401,15 @@ public abstract class AbstractFileUpload {
     /**
      * Parses an <a href="http://www.ietf.org/rfc/rfc1867.txt">RFC 1867</a> compliant {@code multipart/form-data} stream.
      *
-     * @param ctx The context for the request to be parsed.
+     * @param requestContext The context for the request to be parsed.
      * @return A list of {@code FileItem} instances parsed from the request, in the order that they were transmitted.
      * @throws FileUploadException if there are problems reading/parsing the request or storing files.
      */
-    public List<FileItem> parseRequest(final RequestContext ctx) throws FileUploadException {
+    public List<FileItem> parseRequest(final RequestContext requestContext) throws FileUploadException {
         final List<FileItem> itemList = new ArrayList<>();
         boolean successful = false;
         try {
-            final FileItemIterator iter = getItemIterator(ctx);
+            final FileItemIterator iter = getItemIterator(requestContext);
             final FileItemFactory fileItemFactory = Objects.requireNonNull(getFileItemFactory(), "No FileItemFactory has been set.");
             final byte[] buffer = new byte[IOUtils.DEFAULT_BUFFER_SIZE];
             while (iter.hasNext()) {
diff --git a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItemFactory.java b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItemFactory.java
index ebb130d..bdb48d6 100644
--- a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItemFactory.java
+++ b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItemFactory.java
@@ -16,7 +16,6 @@
  */
 package org.apache.commons.fileupload2;
 
-import org.apache.commons.fileupload2.disk.DiskFileItem;
 import org.apache.commons.fileupload2.disk.DiskFileItemFactory;
 import org.apache.commons.io.FileCleaningTracker;
 import org.apache.commons.io.build.AbstractStreamBuilder;
@@ -31,15 +30,7 @@ import org.apache.commons.io.file.PathUtils;
 public interface FileItemFactory {
 
     /**
-     * Builds a new {@link DiskFileItem} instance.
-     * <p>
-     * For example:
-     * </p>
-     *
-     * <pre>{@code
-     * DiskFileItem diskFileItem = DiskFileItem.builder().get();
-     * }
-     * </pre>
+     * Abstracts building for subclasses.
      *
      * @param <T> the type of instances to build.
      * @param <B> the type of builder subclass.
diff --git a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/disk/DiskFileItem.java b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/disk/DiskFileItem.java
index 6600877..baa968b 100644
--- a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/disk/DiskFileItem.java
+++ b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/disk/DiskFileItem.java
@@ -74,7 +74,16 @@ public final class DiskFileItem implements FileItem {
      * </p>
      *
      * <pre>{@code
-     * DiskFileItem diskFileItem = DiskFileItem.builder().get();
+     * <pre>{@code
+     * final FileItem fileItem = fileItemFactory.fileItemBuilder()
+     *   .setFieldName("FieldName")
+     *   .setContentType("ContentType")
+     *   .setFormField(true)
+     *   .setFileName("FileName")
+     *   .setFileItemHeaders(...)
+     *   .get();
+     * }
+     * </pre>
      * }
      * </pre>
      */
@@ -90,9 +99,6 @@ public final class DiskFileItem implements FileItem {
         /**
          * Constructs a new instance.
          * <p>
-         * This builder use the superclass aspects Path (repository) and buffer size (threshold).
-         * </p>
-         * <p>
          * You must provide an origin that can be converted to a Reader by this builder, otherwise, this call will throw an
          * {@link UnsupportedOperationException}.
          * </p>
diff --git a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/disk/DiskFileItemFactory.java b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/disk/DiskFileItemFactory.java
index 19f1fc1..4f0646c 100644
--- a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/disk/DiskFileItemFactory.java
+++ b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/disk/DiskFileItemFactory.java
@@ -64,9 +64,11 @@ public final class DiskFileItemFactory implements FileItemFactory {
      * <p>
      * For example:
      * </p>
-     *
      * <pre>{@code
-     * DiskFileItemFactory factory = DiskFileItemFactory.builder().setPath(path).setBufferSize(DEFAULT_THRESHOLD).get();
+     * DiskFileItemFactory factory = DiskFileItemFactory.builder()
+     *   .setPath(path)
+     *   .setBufferSize(DEFAULT_THRESHOLD)
+     *   .get();
      * }
      * </pre>
      */
diff --git a/commons-fileupload2-core/src/test/java/org/apache/commons/fileupload2/AbstractFileUploadTest.java b/commons-fileupload2-core/src/test/java/org/apache/commons/fileupload2/AbstractFileUploadTest.java
index 4077abb..4cef95c 100644
--- a/commons-fileupload2-core/src/test/java/org/apache/commons/fileupload2/AbstractFileUploadTest.java
+++ b/commons-fileupload2-core/src/test/java/org/apache/commons/fileupload2/AbstractFileUploadTest.java
@@ -82,12 +82,12 @@ public abstract class AbstractFileUploadTest<T extends FileUpload<?>> extends Ab
         assertTrue(field.isFormField());
         assertEquals("Joe Blow", field.getString());
 
-        final FileItem file = fileItems.get(1);
-        assertEquals("pics", file.getFieldName());
-        assertFalse(file.isFormField());
-        assertEquals("... contents of file1.txt ...", file.getString());
-        assertEquals("text/plain", file.getContentType());
-        assertEquals("file1.txt", file.getName());
+        final FileItem fileItem = fileItems.get(1);
+        assertEquals("pics", fileItem.getFieldName());
+        assertFalse(fileItem.isFormField());
+        assertEquals("... contents of file1.txt ...", fileItem.getString());
+        assertEquals("text/plain", fileItem.getContentType());
+        assertEquals("file1.txt", fileItem.getName());
     }
 
     /**
diff --git a/commons-fileupload2-core/src/test/java/org/apache/commons/fileupload2/disk/DiskFileItemSerializeTest.java b/commons-fileupload2-core/src/test/java/org/apache/commons/fileupload2/disk/DiskFileItemSerializeTest.java
index 19b8bff..6063bc9 100644
--- a/commons-fileupload2-core/src/test/java/org/apache/commons/fileupload2/disk/DiskFileItemSerializeTest.java
+++ b/commons-fileupload2-core/src/test/java/org/apache/commons/fileupload2/disk/DiskFileItemSerializeTest.java
@@ -100,12 +100,15 @@ public class DiskFileItemSerializeTest {
      * Create a FileItem with the specfied content bytes and repository.
      */
     private FileItem createFileItem(final byte[] contentBytes, final Path repository) throws IOException {
-        final FileItemFactory factory = DiskFileItemFactory.builder().setBufferSize(THRESHOLD).setPath(repository).get();
-        final String textFieldName = "textField";
-
+        // @formatter:off
+        final FileItemFactory factory = DiskFileItemFactory.builder()
+                .setBufferSize(THRESHOLD)
+                .setPath(repository)
+                .get();
+        // @formatter:on
         // @formatter:off
         final FileItem item = factory.fileItemBuilder()
-                .setFieldName(textFieldName)
+                .setFieldName("textField")
                 .setContentType(TEXT_CONTENT_TYPE)
                 .setFormField(true)
                 .setFileName("My File Name")


[commons-fileupload] 02/04: Use "Input" instead of "Stream" in class names

Posted by gg...@apache.org.
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

commit 24ec422670696f2497809684184de991bd2cdb00
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Sun Jun 11 17:14:06 2023 -0400

    Use "Input" instead of "Stream" in class names
    
    The classes are neither a Stream or InputStream.
---
 .../commons/fileupload2/AbstractFileUpload.java    | 22 ++++-----
 .../commons/fileupload2/FileItemHeadersImpl.java   |  3 +-
 .../fileupload2/FileItemHeadersSupport.java        |  6 +--
 .../{FileItemStream.java => FileItemInput.java}    |  8 ++--
 ...eItemStreamImpl.java => FileItemInputImpl.java} | 22 ++++-----
 ...temIterator.java => FileItemInputIterator.java} | 10 ++--
 ...torImpl.java => FileItemInputIteratorImpl.java} | 56 +++++++++++-----------
 .../org/apache/commons/fileupload2/FileUpload.java |  4 +-
 .../{MultipartStream.java => MultipartInput.java}  | 39 ++++++++-------
 .../fileupload2/AbstractProgressListenerTest.java  |  6 +--
 .../commons/fileupload2/AbstractSizesTest.java     |  6 +--
 .../commons/fileupload2/AbstractStreamingTest.java | 10 ++--
 .../commons/fileupload2/MultipartStreamTest.java   | 16 +++----
 .../jakarta/JakartaServletFileUpload.java          |  6 +--
 .../fileupload2/javax/JavaxServletFileUpload.java  |  6 +--
 .../portlet/JavaxPortletFileUpload.java            |  6 +--
 16 files changed, 112 insertions(+), 114 deletions(-)

diff --git a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/AbstractFileUpload.java b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/AbstractFileUpload.java
index 7c30e6e..e0e0085 100644
--- a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/AbstractFileUpload.java
+++ b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/AbstractFileUpload.java
@@ -259,13 +259,13 @@ public abstract class AbstractFileUpload {
      * Gets an <a href="http://www.ietf.org/rfc/rfc1867.txt">RFC 1867</a> compliant {@code multipart/form-data} stream.
      *
      * @param ctx The context for the request to be parsed.
-     * @return An iterator to instances of {@code FileItemStream} parsed from the request, in the order that they were transmitted.
+     * @return An iterator to instances of {@code FileItemInput} parsed from the request, in the order that they were transmitted.
      * @throws FileUploadException if there are problems reading/parsing the request or storing files.
      * @throws IOException         An I/O error occurred. This may be a network error while communicating with the client or a problem while storing the
      *                             uploaded content.
      */
-    public FileItemIterator getItemIterator(final RequestContext ctx) throws FileUploadException, IOException {
-        return new FileItemIteratorImpl(this, ctx);
+    public FileItemInputIterator getItemIterator(final RequestContext ctx) throws FileUploadException, IOException {
+        return new FileItemInputIteratorImpl(this, ctx);
     }
 
     /**
@@ -409,7 +409,7 @@ public abstract class AbstractFileUpload {
         final List<FileItem> itemList = new ArrayList<>();
         boolean successful = false;
         try {
-            final FileItemIterator iter = getItemIterator(requestContext);
+            final FileItemInputIterator iter = getItemIterator(requestContext);
             final FileItemFactory fileItemFactory = Objects.requireNonNull(getFileItemFactory(), "No FileItemFactory has been set.");
             final byte[] buffer = new byte[IOUtils.DEFAULT_BUFFER_SIZE];
             while (iter.hasNext()) {
@@ -417,20 +417,20 @@ public abstract class AbstractFileUpload {
                     // The next item will exceed the limit.
                     throw new FileUploadFileCountLimitException(ATTACHMENT, getFileCountMax(), itemList.size());
                 }
-                final FileItemStream fileItemStream = iter.next();
+                final FileItemInput fileItemInput = iter.next();
                 // Don't use getName() here to prevent an InvalidFileNameException.
-                final String fileName = fileItemStream.getName();
+                final String fileName = fileItemInput.getName();
                 // @formatter:off
                 final FileItem fileItem = fileItemFactory.fileItemBuilder()
-                    .setFieldName(fileItemStream.getFieldName())
-                    .setContentType(fileItemStream.getContentType())
-                    .setFormField(fileItemStream.isFormField())
+                    .setFieldName(fileItemInput.getFieldName())
+                    .setContentType(fileItemInput.getContentType())
+                    .setFormField(fileItemInput.isFormField())
                     .setFileName(fileName)
-                    .setFileItemHeaders(fileItemStream.getHeaders())
+                    .setFileItemHeaders(fileItemInput.getHeaders())
                     .get();
                 // @formatter:on
                 itemList.add(fileItem);
-                try (InputStream inputStream = fileItemStream.getInputStream();
+                try (InputStream inputStream = fileItemInput.getInputStream();
                         OutputStream outputStream = fileItem.getOutputStream()) {
                     IOUtils.copyLarge(inputStream, outputStream, buffer);
                 } catch (final FileUploadException e) {
diff --git a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItemHeadersImpl.java b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItemHeadersImpl.java
index 9edba7d..e803758 100644
--- a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItemHeadersImpl.java
+++ b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItemHeadersImpl.java
@@ -41,8 +41,7 @@ class FileItemHeadersImpl implements FileItemHeaders {
      * @param value value of this header
      */
     public synchronized void addHeader(final String name, final String value) {
-        final List<String> headerValueList = headerNameToValueListMap.computeIfAbsent(toLowerCase(name), k -> new ArrayList<>());
-        headerValueList.add(value);
+        headerNameToValueListMap.computeIfAbsent(toLowerCase(name), k -> new ArrayList<>()).add(value);
     }
 
     /**
diff --git a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItemHeadersSupport.java b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItemHeadersSupport.java
index 4928efc..7f69be1 100644
--- a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItemHeadersSupport.java
+++ b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItemHeadersSupport.java
@@ -20,7 +20,7 @@ package org.apache.commons.fileupload2;
  * Accepts headers for an item type.
  *
  * @see FileItem
- * @see FileItemStream
+ * @see FileItemInput
  */
 public interface FileItemHeadersSupport {
 
@@ -32,8 +32,8 @@ public interface FileItemHeadersSupport {
     FileItemHeaders getHeaders();
 
     /**
-     * Sets the headers read from within an item. Implementations of {@link FileItem} or {@link FileItemStream} should implement this interface to be able to
-     * get the raw headers found within the item header block.
+     * Sets the headers read from within an item. Implementations of {@link FileItem} or {@link FileItemInput} should implement this interface to be able
+     * to get the raw headers found within the item header block.
      *
      * @param headers the instance that holds onto the headers for this instance.
      */
diff --git a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItemStream.java b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItemInput.java
similarity index 92%
rename from commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItemStream.java
rename to commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItemInput.java
index 62b3442..6fb0cd5 100644
--- a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItemStream.java
+++ b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItemInput.java
@@ -28,16 +28,16 @@ import java.io.InputStream;
  * Instances of this class are created by accessing the iterator, returned by {@link AbstractFileUpload#getItemIterator(RequestContext)}.
  * </p>
  * <p>
- * <em>Note</em>: There is an interaction between the iterator and its associated instances of {@link FileItemStream}: By invoking
+ * <em>Note</em>: There is an interaction between the iterator and its associated instances of {@link FileItemInput}: By invoking
  * {@link java.util.Iterator#hasNext()} on the iterator, you discard all data, which hasn't been read so far from the previous data.
  * </p>
  */
-public interface FileItemStream extends FileItemHeadersSupport {
+public interface FileItemInput extends FileItemHeadersSupport {
 
     /**
      * This exception is thrown, if an attempt is made to read data from the {@link InputStream}, which has been returned by
-     * {@link FileItemStream#getInputStream()}, after {@link java.util.Iterator#hasNext()} has been invoked on the iterator, which created the
-     * {@link FileItemStream}.
+     * {@link FileItemInput#getInputStream()}, after {@link java.util.Iterator#hasNext()} has been invoked on the iterator, which created the
+     * {@link FileItemInput}.
      */
     class ItemSkippedException extends FileUploadException {
 
diff --git a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItemStreamImpl.java b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItemInputImpl.java
similarity index 86%
rename from commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItemStreamImpl.java
rename to commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItemInputImpl.java
index 634f35b..a559fb6 100644
--- a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItemStreamImpl.java
+++ b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItemInputImpl.java
@@ -20,21 +20,21 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.nio.file.InvalidPathException;
 
-import org.apache.commons.fileupload2.MultipartStream.ItemInputStream;
+import org.apache.commons.fileupload2.MultipartInput.ItemInputStream;
 import org.apache.commons.fileupload2.disk.DiskFileItem;
 import org.apache.commons.io.input.BoundedInputStream;
 
 /**
- * Default implementation of {@link FileItemStream}.
+ * Default implementation of {@link FileItemInput}.
  */
-class FileItemStreamImpl implements FileItemStream {
+class FileItemInputImpl implements FileItemInput {
 
     /**
      * The File Item iterator implementation.
      *
-     * @see FileItemIteratorImpl
+     * @see FileItemInputIteratorImpl
      */
-    private final FileItemIteratorImpl fileItemIteratorImpl;
+    private final FileItemInputIteratorImpl fileItemInputIteratorImpl;
 
     /**
      * The file items content type.
@@ -74,7 +74,7 @@ class FileItemStreamImpl implements FileItemStream {
     /**
      * Creates a new instance.
      *
-     * @param fileItemIterator The {@link FileItemIteratorImpl iterator}, which returned this file item.
+     * @param fileItemIterator The {@link FileItemInputIteratorImpl iterator}, which returned this file item.
      * @param fileName         The items file name, or null.
      * @param fieldName        The items field name.
      * @param contentType      The items content type, or null.
@@ -83,20 +83,20 @@ class FileItemStreamImpl implements FileItemStream {
      * @throws IOException         Creating the file item failed.
      * @throws FileUploadException Parsing the incoming data stream failed.
      */
-    FileItemStreamImpl(final FileItemIteratorImpl fileItemIterator, final String fileName, final String fieldName, final String contentType,
+    FileItemInputImpl(final FileItemInputIteratorImpl fileItemIterator, final String fileName, final String fieldName, final String contentType,
             final boolean formField, final long contentLength) throws FileUploadException, IOException {
-        this.fileItemIteratorImpl = fileItemIterator;
+        this.fileItemInputIteratorImpl = fileItemIterator;
         this.fileName = fileName;
         this.fieldName = fieldName;
         this.contentType = contentType;
         this.formField = formField;
-        final long fileSizeMax = fileItemIteratorImpl.getFileSizeMax();
+        final long fileSizeMax = fileItemInputIteratorImpl.getFileSizeMax();
         if (fileSizeMax != -1 && contentLength != -1 && contentLength > fileSizeMax) {
             throw new FileUploadByteCountLimitException(String.format("The field %s exceeds its maximum permitted size of %s bytes.", fieldName, fileSizeMax),
                     contentLength, fileSizeMax, fileName, fieldName);
         }
         // OK to construct stream now
-        final ItemInputStream itemInputStream = fileItemIteratorImpl.getMultiPartStream().newInputStream();
+        final ItemInputStream itemInputStream = fileItemInputIteratorImpl.getMultiPartStream().newInputStream();
         InputStream istream = itemInputStream;
         if (fileSizeMax != -1) {
             istream = new BoundedInputStream(istream, fileSizeMax) {
@@ -161,7 +161,7 @@ class FileItemStreamImpl implements FileItemStream {
     @Override
     public InputStream getInputStream() throws IOException {
         if (inputStreamClosed) {
-            throw new FileItemStream.ItemSkippedException("getInputStream()");
+            throw new FileItemInput.ItemSkippedException("getInputStream()");
         }
         return inputStream;
     }
diff --git a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItemIterator.java b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItemInputIterator.java
similarity index 93%
rename from commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItemIterator.java
rename to commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItemInputIterator.java
index 19c8337..a9ddc31 100644
--- a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItemIterator.java
+++ b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItemInputIterator.java
@@ -24,7 +24,7 @@ import javax.naming.SizeLimitExceededException;
 /**
  * An iterator, as returned by {@link AbstractFileUpload#getItemIterator(RequestContext)}.
  */
-public interface FileItemIterator {
+public interface FileItemInputIterator {
 
     List<FileItem> getFileItems() throws FileUploadException, IOException;
 
@@ -47,7 +47,7 @@ public interface FileItemIterator {
     long getSizeMax();
 
     /**
-     * Tests whether another instance of {@link FileItemStream} is available.
+     * Tests whether another instance of {@link FileItemInput} is available.
      *
      * @throws FileUploadException Parsing or processing the file item failed.
      * @throws IOException         Reading the file item failed.
@@ -56,14 +56,14 @@ public interface FileItemIterator {
     boolean hasNext() throws FileUploadException, IOException;
 
     /**
-     * Returns the next available {@link FileItemStream}.
+     * Returns the next available {@link FileItemInput}.
      *
      * @throws java.util.NoSuchElementException No more items are available. Use {@link #hasNext()} to prevent this exception.
      * @throws FileUploadException              Parsing or processing the file item failed.
      * @throws IOException                      Reading the file item failed.
-     * @return FileItemStream instance, which provides access to the next file item.
+     * @return FileItemInput instance, which provides access to the next file item.
      */
-    FileItemStream next() throws FileUploadException, IOException;
+    FileItemInput next() throws FileUploadException, IOException;
 
     /**
      * Sets the maximum size of a single file. An {@link FileUploadByteCountLimitException} will be thrown, if there is an uploaded file, which is exceeding
diff --git a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItemIteratorImpl.java b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItemInputIteratorImpl.java
similarity index 81%
rename from commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItemIteratorImpl.java
rename to commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItemInputIteratorImpl.java
index 503c56d..2b6dc7a 100644
--- a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItemIteratorImpl.java
+++ b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItemInputIteratorImpl.java
@@ -28,16 +28,16 @@ import org.apache.commons.io.IOUtils;
 import org.apache.commons.io.input.BoundedInputStream;
 
 /**
- * The iterator, which is returned by {@link AbstractFileUpload#getItemIterator(RequestContext)}.
+ * The iterator returned by {@link AbstractFileUpload#getItemIterator(RequestContext)}.
  */
-class FileItemIteratorImpl implements FileItemIterator {
+class FileItemInputIteratorImpl implements FileItemInputIterator {
 
     /**
      * The file uploads processing utility.
      *
      * @see AbstractFileUpload
      */
-    private final AbstractFileUpload fileUploadBase;
+    private final AbstractFileUpload fileUpload;
 
     /**
      * The request context.
@@ -59,12 +59,12 @@ class FileItemIteratorImpl implements FileItemIterator {
     /**
      * The multi part stream to process.
      */
-    private MultipartStream multiPartStream;
+    private MultipartInput multiPartStream;
 
     /**
      * The notifier, which used for triggering the {@link ProgressListener}.
      */
-    private MultipartStream.ProgressNotifier progressNotifier;
+    private MultipartInput.ProgressNotifier progressNotifier;
 
     /**
      * The boundary, which separates the various parts.
@@ -74,7 +74,7 @@ class FileItemIteratorImpl implements FileItemIterator {
     /**
      * The item, which we currently process.
      */
-    private FileItemStreamImpl currentItem;
+    private FileItemInputImpl currentItem;
 
     /**
      * The current items field name.
@@ -104,8 +104,8 @@ class FileItemIteratorImpl implements FileItemIterator {
      * @throws FileUploadException An error occurred while parsing the request.
      * @throws IOException         An I/O error occurred.
      */
-    FileItemIteratorImpl(final AbstractFileUpload fileUploadBase, final RequestContext requestContext) throws FileUploadException, IOException {
-        this.fileUploadBase = fileUploadBase;
+    FileItemInputIteratorImpl(final AbstractFileUpload fileUploadBase, final RequestContext requestContext) throws FileUploadException, IOException {
+        this.fileUpload = fileUploadBase;
         this.sizeMax = fileUploadBase.getSizeMax();
         this.fileSizeMax = fileUploadBase.getFileSizeMax();
         this.ctx = Objects.requireNonNull(requestContext, "requestContext");
@@ -127,7 +127,7 @@ class FileItemIteratorImpl implements FileItemIterator {
             currentItem.close();
             currentItem = null;
         }
-        final MultipartStream multi = getMultiPartStream();
+        final MultipartInput multi = getMultiPartStream();
         for (;;) {
             final boolean nextPart;
             if (skipPreamble) {
@@ -146,22 +146,22 @@ class FileItemIteratorImpl implements FileItemIterator {
                 currentFieldName = null;
                 continue;
             }
-            final FileItemHeaders headers = fileUploadBase.getParsedHeaders(multi.readHeaders());
+            final FileItemHeaders headers = fileUpload.getParsedHeaders(multi.readHeaders());
             if (currentFieldName == null) {
                 // We're parsing the outer multipart
-                final String fieldName = fileUploadBase.getFieldName(headers);
+                final String fieldName = fileUpload.getFieldName(headers);
                 if (fieldName != null) {
                     final String subContentType = headers.getHeader(AbstractFileUpload.CONTENT_TYPE);
                     if (subContentType != null && subContentType.toLowerCase(Locale.ENGLISH).startsWith(AbstractFileUpload.MULTIPART_MIXED)) {
                         currentFieldName = fieldName;
                         // Multiple files associated with this field name
-                        final byte[] subBoundary = fileUploadBase.getBoundary(subContentType);
+                        final byte[] subBoundary = fileUpload.getBoundary(subContentType);
                         multi.setBoundary(subBoundary);
                         skipPreamble = true;
                         continue;
                     }
-                    final String fileName = fileUploadBase.getFileName(headers);
-                    currentItem = new FileItemStreamImpl(this, fileName, fieldName, headers.getHeader(AbstractFileUpload.CONTENT_TYPE), fileName == null,
+                    final String fileName = fileUpload.getFileName(headers);
+                    currentItem = new FileItemInputImpl(this, fileName, fieldName, headers.getHeader(AbstractFileUpload.CONTENT_TYPE), fileName == null,
                             getContentLength(headers));
                     currentItem.setHeaders(headers);
                     progressNotifier.noteItem();
@@ -169,9 +169,9 @@ class FileItemIteratorImpl implements FileItemIterator {
                     return true;
                 }
             } else {
-                final String fileName = fileUploadBase.getFileName(headers);
+                final String fileName = fileUpload.getFileName(headers);
                 if (fileName != null) {
-                    currentItem = new FileItemStreamImpl(this, fileName, currentFieldName, headers.getHeader(AbstractFileUpload.CONTENT_TYPE), false,
+                    currentItem = new FileItemInputImpl(this, fileName, currentFieldName, headers.getHeader(AbstractFileUpload.CONTENT_TYPE), false,
                             getContentLength(headers));
                     currentItem.setHeaders(headers);
                     progressNotifier.noteItem();
@@ -195,9 +195,9 @@ class FileItemIteratorImpl implements FileItemIterator {
     public List<FileItem> getFileItems() throws FileUploadException, IOException {
         final List<FileItem> items = new ArrayList<>();
         while (hasNext()) {
-            final FileItemStream fis = next();
+            final FileItemInput fis = next();
             // @formatter:off
-            final FileItem fileItem = fileUploadBase.getFileItemFactory().fileItemBuilder()
+            final FileItem fileItem = fileUpload.getFileItemFactory().fileItemBuilder()
                     .setFieldName(fis.getFieldName())
                     .setContentType(fis.getContentType())
                     .setFormField(fis.isFormField())
@@ -214,9 +214,9 @@ class FileItemIteratorImpl implements FileItemIterator {
         return fileSizeMax;
     }
 
-    public MultipartStream getMultiPartStream() throws FileUploadException, IOException {
+    public MultipartInput getMultiPartStream() throws FileUploadException, IOException {
         if (multiPartStream == null) {
-            init(fileUploadBase, ctx);
+            init(fileUpload, ctx);
         }
         return multiPartStream;
     }
@@ -227,7 +227,7 @@ class FileItemIteratorImpl implements FileItemIterator {
     }
 
     /**
-     * Tests whether another instance of {@link FileItemStream} is available.
+     * Tests whether another instance of {@link FileItemInput} is available.
      *
      * @throws FileUploadException Parsing or processing the file item failed.
      * @throws IOException         Reading the file item failed.
@@ -258,14 +258,14 @@ class FileItemIteratorImpl implements FileItemIterator {
                                  : contentLengthInt;
                                  // CHECKSTYLE:ON
         // @formatter:on
-        final InputStream input; // N.B. this is eventually closed in MultipartStream processing
+        final InputStream input; // N.B. this is eventually closed in MultipartInput processing
         if (sizeMax >= 0) {
             if (requestSize != -1 && requestSize > sizeMax) {
                 throw new FileUploadSizeException(
                         String.format("the request was rejected because its size (%s) exceeds the configured maximum (%s)", requestSize, sizeMax), sizeMax,
                         requestSize);
             }
-            // N.B. this is eventually closed in MultipartStream processing
+            // N.B. this is eventually closed in MultipartInput processing
             input = new BoundedInputStream(ctx.getInputStream(), sizeMax) {
                 @Override
                 protected void onMaxLength(final long maxLen, final long count) throws IOException {
@@ -288,9 +288,9 @@ class FileItemIteratorImpl implements FileItemIterator {
             throw new FileUploadException("the request was rejected because no multipart boundary was found");
         }
 
-        progressNotifier = new MultipartStream.ProgressNotifier(fileUploadBase.getProgressListener(), requestSize);
+        progressNotifier = new MultipartInput.ProgressNotifier(fileUploadBase.getProgressListener(), requestSize);
         try {
-            multiPartStream = MultipartStream.builder().setInputStream(input).setBoundary(multiPartBoundary).setProgressNotifier(progressNotifier).get();
+            multiPartStream = MultipartInput.builder().setInputStream(input).setBoundary(multiPartBoundary).setProgressNotifier(progressNotifier).get();
         } catch (final IllegalArgumentException e) {
             IOUtils.closeQuietly(input); // avoid possible resource leak
             throw new FileUploadContentTypeException(String.format("The boundary specified in the %s header is too long", AbstractFileUpload.CONTENT_TYPE), e);
@@ -299,15 +299,15 @@ class FileItemIteratorImpl implements FileItemIterator {
     }
 
     /**
-     * Returns the next available {@link FileItemStream}.
+     * Returns the next available {@link FileItemInput}.
      *
      * @throws java.util.NoSuchElementException No more items are available. Use {@link #hasNext()} to prevent this exception.
      * @throws FileUploadException              Parsing or processing the file item failed.
      * @throws IOException                      Reading the file item failed.
-     * @return FileItemStream instance, which provides access to the next file item.
+     * @return FileItemInput instance, which provides access to the next file item.
      */
     @Override
-    public FileItemStream next() throws FileUploadException, IOException {
+    public FileItemInput next() throws FileUploadException, IOException {
         if (eof || !itemValid && !hasNext()) {
             throw new NoSuchElementException();
         }
diff --git a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileUpload.java b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileUpload.java
index a8c3fd5..c00175d 100644
--- a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileUpload.java
+++ b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileUpload.java
@@ -73,12 +73,12 @@ public abstract class FileUpload<T> extends AbstractFileUpload {
      * Gets a file item iterator.
      *
      * @param request The servlet request to be parsed.
-     * @return An iterator to instances of {@code FileItemStream} parsed from the request, in the order that they were transmitted.
+     * @return An iterator to instances of {@code FileItemInput} parsed from the request, in the order that they were transmitted.
      * @throws FileUploadException if there are problems reading/parsing the request or storing files.
      * @throws IOException         An I/O error occurred. This may be a network error while communicating with the client or a problem while storing the
      *                             uploaded content.
      */
-    public abstract FileItemIterator getItemIterator(T request) throws FileUploadException, IOException;
+    public abstract FileItemInputIterator getItemIterator(T request) throws FileUploadException, IOException;
 
     /**
      * Parses an <a href="http://www.ietf.org/rfc/rfc1867.txt">RFC 1867</a> compliant {@code multipart/form-data} stream.
diff --git a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/MultipartStream.java b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/MultipartInput.java
similarity index 96%
rename from commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/MultipartStream.java
rename to commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/MultipartInput.java
index 4dda7cb..827fae3 100644
--- a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/MultipartStream.java
+++ b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/MultipartInput.java
@@ -23,7 +23,7 @@ import java.io.OutputStream;
 import java.io.UnsupportedEncodingException;
 import java.nio.charset.Charset;
 
-import org.apache.commons.fileupload2.FileItemStream.ItemSkippedException;
+import org.apache.commons.fileupload2.FileItemInput.ItemSkippedException;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.io.build.AbstractOrigin;
 import org.apache.commons.io.build.AbstractStreamBuilder;
@@ -64,7 +64,7 @@ import org.apache.commons.io.output.NullOutputStream;
  *
  * <pre>
  * try {
- *     MultipartStream multipartStream = new MultipartStream(input, boundary);
+ *     MultipartInput multipartStream = new MultipartInput(input, boundary);
  *     boolean nextPart = multipartStream.skipPreamble();
  *     OutputStream output;
  *     while (nextPart) {
@@ -74,30 +74,30 @@ import org.apache.commons.io.output.NullOutputStream;
  *         multipartStream.readBodyData(output);
  *         nextPart = multipartStream.readBoundary();
  *     }
- * } catch (MultipartStream.MalformedStreamException e) {
+ * } catch (MultipartInput.MalformedStreamException e) {
  *     // the stream failed to follow required syntax
  * } catch (IOException e) {
  *     // a read or write error occurred
  * }
  * </pre>
  */
-public final class MultipartStream {
+public final class MultipartInput {
 
     /**
-     * Builds a new {@link MultipartStream} instance.
+     * Builds a new {@link MultipartInput} instance.
      * <p>
      * For example:
      * </p>
      *
      * <pre>{@code
-     * MultipartStream factory = MultipartStream.builder()
+     * MultipartInput factory = MultipartInput.builder()
      *    .setPath(path)
      *    .setBufferSize(DEFAULT_THRESHOLD)
      *    .get();
      * }
      * </pre>
      */
-    public static class Builder extends AbstractStreamBuilder<MultipartStream, Builder> {
+    public static class Builder extends AbstractStreamBuilder<MultipartInput, Builder> {
 
         /**
          * Boundary.
@@ -129,8 +129,8 @@ public final class MultipartStream {
          * @see AbstractOrigin#getReader(Charset)
          */
         @Override
-        public MultipartStream get() throws IOException {
-            return new MultipartStream(getInputStream(), boundary, getBufferSize(), progressNotifier);
+        public MultipartInput get() throws IOException {
+            return new MultipartInput(getInputStream(), boundary, getBufferSize(), progressNotifier);
         }
 
         /**
@@ -231,7 +231,7 @@ public final class MultipartStream {
 
         private void checkOpen() throws ItemSkippedException {
             if (closed) {
-                throw new FileItemStream.ItemSkippedException("checkOpen()");
+                throw new FileItemInput.ItemSkippedException("checkOpen()");
             }
         }
 
@@ -277,7 +277,7 @@ public final class MultipartStream {
          * Called for finding the separator.
          */
         private void findSeparator() {
-            pos = MultipartStream.this.findSeparator();
+            pos = MultipartInput.this.findSeparator();
             if (pos == -1) {
                 if (tail - head > keepRegion) {
                     pad = keepRegion;
@@ -642,7 +642,7 @@ public final class MultipartStream {
     private final ProgressNotifier notifier;
 
     /**
-     * Constructs a {@code MultipartStream} with a custom size buffer.
+     * Constructs a {@code MultipartInput} with a custom size buffer.
      * <p>
      * Note that the buffer must be at least big enough to contain the boundary string, plus 4 characters for CR/LF and double dash, plus at least one byte of
      * data. Too small a buffer size setting will degrade performance.
@@ -654,7 +654,7 @@ public final class MultipartStream {
      * @param notifier   The notifier, which is used for calling the progress listener, if any.
      * @throws IllegalArgumentException If the buffer size is too small.
      */
-    private MultipartStream(final InputStream input, final byte[] boundary, final int bufferSize, final ProgressNotifier notifier) {
+    private MultipartInput(final InputStream input, final byte[] boundary, final int bufferSize, final ProgressNotifier notifier) {
         if (boundary == null) {
             throw new IllegalArgumentException("boundary may not be null");
         }
@@ -662,7 +662,7 @@ public final class MultipartStream {
         // body-data tokens.
         this.boundaryLength = boundary.length + BOUNDARY_PREFIX.length;
         if (bufferSize < this.boundaryLength + 1) {
-            throw new IllegalArgumentException("The buffer size specified for the MultipartStream is too small");
+            throw new IllegalArgumentException("The buffer size specified for the MultipartInput is too small");
         }
 
         this.input = input;
@@ -782,7 +782,7 @@ public final class MultipartStream {
      * Reads {@code body-data} from the current {@code encapsulation} and writes its contents into the output {@code Stream}.
      * <p>
      * Arbitrary large amounts of data can be processed by this method using a constant size buffer. (see
-     * {@link MultipartStream#builder()}).
+     * {@link MultipartInput#builder()}).
      * </p>
      *
      * @param output The {@code Stream} to write data into. May be null, in which case this method is equivalent to {@link #discardBodyData()}.
@@ -903,8 +903,7 @@ public final class MultipartStream {
             try {
                 headers = baos.toString(headerEncoding);
             } catch (final UnsupportedEncodingException e) {
-                // Fall back to platform default if specified encoding is not
-                // supported.
+                // Fall back to platform default if specified encoding is not supported.
                 headers = baos.toString();
             }
         } else {
@@ -941,10 +940,10 @@ public final class MultipartStream {
      * Sets the character encoding to be used when reading the headers of individual parts. When not specified, or {@code null}, the platform default encoding
      * is used.
      *
-     * @param encoding The encoding used to read part headers.
+     * @param headerEncoding The encoding used to read part headers.
      */
-    public void setHeaderEncoding(final String encoding) {
-        headerEncoding = encoding;
+    public void setHeaderEncoding(final String headerEncoding) {
+        this.headerEncoding = headerEncoding;
     }
 
     /**
diff --git a/commons-fileupload2-core/src/test/java/org/apache/commons/fileupload2/AbstractProgressListenerTest.java b/commons-fileupload2-core/src/test/java/org/apache/commons/fileupload2/AbstractProgressListenerTest.java
index c66f470..fa24c38 100644
--- a/commons-fileupload2-core/src/test/java/org/apache/commons/fileupload2/AbstractProgressListenerTest.java
+++ b/commons-fileupload2-core/src/test/java/org/apache/commons/fileupload2/AbstractProgressListenerTest.java
@@ -72,11 +72,11 @@ public abstract class AbstractProgressListenerTest<F extends FileUpload<R>, R> e
         final F upload = newFileUpload();
         final ProgressListenerImpl listener = new ProgressListenerImpl(contentLength, itemCount);
         upload.setProgressListener(listener);
-        final FileItemIterator iter = upload.getItemIterator(request);
+        final FileItemInputIterator iter = upload.getItemIterator(request);
         for (int i = 0; i < itemCount; i++) {
             final int idxI = i;
-            final FileItemStream fileItemStream = iter.next();
-            try (final InputStream inputStream = fileItemStream.getInputStream()) {
+            final FileItemInput fileItemInput = iter.next();
+            try (final InputStream inputStream = fileItemInput.getInputStream()) {
                 for (int j = 0; j < 16_384 + i; j++) {
                     final int idxJ = j;
                     //
diff --git a/commons-fileupload2-core/src/test/java/org/apache/commons/fileupload2/AbstractSizesTest.java b/commons-fileupload2-core/src/test/java/org/apache/commons/fileupload2/AbstractSizesTest.java
index 995b4ab..fba7cdb 100644
--- a/commons-fileupload2-core/src/test/java/org/apache/commons/fileupload2/AbstractSizesTest.java
+++ b/commons-fileupload2-core/src/test/java/org/apache/commons/fileupload2/AbstractSizesTest.java
@@ -209,10 +209,10 @@ public abstract class AbstractSizesTest<F extends FileUpload<R>, R> extends Abst
 
         final R req = newMockHttpServletRequest(request, -1L, 10);
 
-        final FileItemIterator it = upload.getItemIterator(req);
+        final FileItemInputIterator it = upload.getItemIterator(req);
         assertTrue(it.hasNext());
 
-        final FileItemStream item = it.next();
+        final FileItemInput item = it.next();
         assertFalse(item.isFormField());
         assertEquals("file1", item.getFieldName());
         assertEquals("foo1.tab", item.getName());
@@ -230,7 +230,7 @@ public abstract class AbstractSizesTest<F extends FileUpload<R>, R> extends Abst
         assertTrue(it.hasNext());
 
         assertThrows(FileUploadException.class, () -> {
-            final FileItemStream item2 = it.next();
+            final FileItemInput item2 = it.next();
             try (final ByteArrayOutputStream baos = new ByteArrayOutputStream();
                     final InputStream stream = item2.getInputStream()) {
                 IOUtils.copy(stream, baos);
diff --git a/commons-fileupload2-core/src/test/java/org/apache/commons/fileupload2/AbstractStreamingTest.java b/commons-fileupload2-core/src/test/java/org/apache/commons/fileupload2/AbstractStreamingTest.java
index ffbdcd0..8e21112 100644
--- a/commons-fileupload2-core/src/test/java/org/apache/commons/fileupload2/AbstractStreamingTest.java
+++ b/commons-fileupload2-core/src/test/java/org/apache/commons/fileupload2/AbstractStreamingTest.java
@@ -103,7 +103,7 @@ public abstract class AbstractStreamingTest<F extends FileUpload<R>, R, C extend
         return upload.parseRequest(newServletRequestContext(request));
     }
 
-    protected FileItemIterator parseUpload(final int length, final InputStream inputStream) throws FileUploadException, IOException {
+    protected FileItemInputIterator parseUpload(final int length, final InputStream inputStream) throws FileUploadException, IOException {
         final String contentType = "multipart/form-data; boundary=---1234";
 
         final AbstractFileUpload upload = newFileUpload();
@@ -187,7 +187,7 @@ public abstract class AbstractStreamingTest<F extends FileUpload<R>, R, C extend
             parseUpload(invalidRequest);
             fail("Expected EndOfStreamException");
         } catch (final FileUploadException e) {
-            assertTrue(e.getSuppressed()[0] instanceof MultipartStream.MalformedStreamException, e.toString());
+            assertTrue(e.getSuppressed()[0] instanceof MultipartInput.MalformedStreamException, e.toString());
         }
     }
 
@@ -223,10 +223,10 @@ public abstract class AbstractStreamingTest<F extends FileUpload<R>, R, C extend
         // @formatter:on
         final byte[] reqBytes = request.getBytes(StandardCharsets.US_ASCII);
 
-        final FileItemIterator fileItemIter = parseUpload(reqBytes.length, new ByteArrayInputStream(reqBytes));
-        final FileItemStream fileItemStream = fileItemIter.next();
+        final FileItemInputIterator fileItemIter = parseUpload(reqBytes.length, new ByteArrayInputStream(reqBytes));
+        final FileItemInput fileItemInput = fileItemIter.next();
         try {
-            fileItemStream.getName();
+            fileItemInput.getName();
             fail("Expected exception");
         } catch (final InvalidPathException e) {
             assertEquals(fileName, e.getInput());
diff --git a/commons-fileupload2-core/src/test/java/org/apache/commons/fileupload2/MultipartStreamTest.java b/commons-fileupload2-core/src/test/java/org/apache/commons/fileupload2/MultipartStreamTest.java
index d850141..9aef4b3 100644
--- a/commons-fileupload2-core/src/test/java/org/apache/commons/fileupload2/MultipartStreamTest.java
+++ b/commons-fileupload2-core/src/test/java/org/apache/commons/fileupload2/MultipartStreamTest.java
@@ -25,7 +25,7 @@ import java.io.InputStream;
 import org.junit.jupiter.api.Test;
 
 /**
- * Unit tests {@link MultipartStream}.
+ * Unit tests {@link MultipartInput}.
  */
 public class MultipartStreamTest {
 
@@ -38,8 +38,8 @@ public class MultipartStreamTest {
         final InputStream input = new ByteArrayInputStream(contents);
         final byte[] boundary = BOUNDARY_TEXT.getBytes();
         final int iBufSize = 1;
-        assertThrows(IllegalArgumentException.class, () -> MultipartStream.builder().setInputStream(input).setBoundary(boundary).setBufferSize(iBufSize)
-                .setProgressNotifier(new MultipartStream.ProgressNotifier(null, contents.length)).get());
+        assertThrows(IllegalArgumentException.class, () -> MultipartInput.builder().setInputStream(input).setBoundary(boundary).setBufferSize(iBufSize)
+                .setProgressNotifier(new MultipartInput.ProgressNotifier(null, contents.length)).get());
     }
 
     @Test
@@ -48,9 +48,9 @@ public class MultipartStreamTest {
         final byte[] contents = strData.getBytes();
         final InputStream input = new ByteArrayInputStream(contents);
         final byte[] boundary = BOUNDARY_TEXT.getBytes();
-        final int iBufSize = boundary.length + MultipartStream.BOUNDARY_PREFIX.length + 1;
-        final MultipartStream ms = MultipartStream.builder().setInputStream(input).setBoundary(boundary).setBufferSize(iBufSize)
-                .setProgressNotifier(new MultipartStream.ProgressNotifier(null, contents.length)).get();
+        final int iBufSize = boundary.length + MultipartInput.BOUNDARY_PREFIX.length + 1;
+        final MultipartInput ms = MultipartInput.builder().setInputStream(input).setBoundary(boundary).setBufferSize(iBufSize)
+                .setProgressNotifier(new MultipartInput.ProgressNotifier(null, contents.length)).get();
         assertNotNull(ms);
     }
 
@@ -60,8 +60,8 @@ public class MultipartStreamTest {
         final byte[] contents = strData.getBytes();
         final InputStream input = new ByteArrayInputStream(contents);
         final byte[] boundary = BOUNDARY_TEXT.getBytes();
-        final MultipartStream ms = MultipartStream.builder().setInputStream(input).setBoundary(boundary)
-                .setProgressNotifier(new MultipartStream.ProgressNotifier(null, contents.length)).get();
+        final MultipartInput ms = MultipartInput.builder().setInputStream(input).setBoundary(boundary)
+                .setProgressNotifier(new MultipartInput.ProgressNotifier(null, contents.length)).get();
         assertNotNull(ms);
     }
 
diff --git a/commons-fileupload2-jakarta/src/main/java/org/apache/commons/fileupload2/jakarta/JakartaServletFileUpload.java b/commons-fileupload2-jakarta/src/main/java/org/apache/commons/fileupload2/jakarta/JakartaServletFileUpload.java
index 1f62ac8..6a3e36c 100644
--- a/commons-fileupload2-jakarta/src/main/java/org/apache/commons/fileupload2/jakarta/JakartaServletFileUpload.java
+++ b/commons-fileupload2-jakarta/src/main/java/org/apache/commons/fileupload2/jakarta/JakartaServletFileUpload.java
@@ -23,7 +23,7 @@ import java.util.Map;
 import org.apache.commons.fileupload2.AbstractFileUpload;
 import org.apache.commons.fileupload2.FileItem;
 import org.apache.commons.fileupload2.FileItemFactory;
-import org.apache.commons.fileupload2.FileItemIterator;
+import org.apache.commons.fileupload2.FileItemInputIterator;
 import org.apache.commons.fileupload2.FileUpload;
 import org.apache.commons.fileupload2.FileUploadException;
 
@@ -81,13 +81,13 @@ public class JakartaServletFileUpload extends FileUpload<HttpServletRequest> {
      * Gets an <a href="http://www.ietf.org/rfc/rfc1867.txt">RFC 1867</a> compliant {@code multipart/form-data} file item iterator.
      *
      * @param request The servlet request to be parsed.
-     * @return An iterator to instances of {@code FileItemStream} parsed from the request, in the order that they were transmitted.
+     * @return An iterator to instances of {@code FileItemInput} parsed from the request, in the order that they were transmitted.
      * @throws FileUploadException if there are problems reading/parsing the request or storing files.
      * @throws IOException         An I/O error occurred. This may be a network error while communicating with the client or a problem while storing the
      *                             uploaded content.
      */
     @Override
-    public FileItemIterator getItemIterator(final HttpServletRequest request) throws FileUploadException, IOException {
+    public FileItemInputIterator getItemIterator(final HttpServletRequest request) throws FileUploadException, IOException {
         return super.getItemIterator(new JakartaServletRequestContext(request));
     }
 
diff --git a/commons-fileupload2-javax/src/main/java/org/apache/commons/fileupload2/javax/JavaxServletFileUpload.java b/commons-fileupload2-javax/src/main/java/org/apache/commons/fileupload2/javax/JavaxServletFileUpload.java
index 389ec0b..d0d478b 100644
--- a/commons-fileupload2-javax/src/main/java/org/apache/commons/fileupload2/javax/JavaxServletFileUpload.java
+++ b/commons-fileupload2-javax/src/main/java/org/apache/commons/fileupload2/javax/JavaxServletFileUpload.java
@@ -25,7 +25,7 @@ import javax.servlet.http.HttpServletRequest;
 import org.apache.commons.fileupload2.AbstractFileUpload;
 import org.apache.commons.fileupload2.FileItem;
 import org.apache.commons.fileupload2.FileItemFactory;
-import org.apache.commons.fileupload2.FileItemIterator;
+import org.apache.commons.fileupload2.FileItemInputIterator;
 import org.apache.commons.fileupload2.FileUpload;
 import org.apache.commons.fileupload2.FileUploadException;
 
@@ -81,13 +81,13 @@ public class JavaxServletFileUpload extends FileUpload<HttpServletRequest> {
      * Gets an <a href="http://www.ietf.org/rfc/rfc1867.txt">RFC 1867</a> compliant {@code multipart/form-data} file item iterator.
      *
      * @param request The servlet request to be parsed.
-     * @return An iterator to instances of {@code FileItemStream} parsed from the request, in the order that they were transmitted.
+     * @return An iterator to instances of {@code FileItemInput} parsed from the request, in the order that they were transmitted.
      * @throws FileUploadException if there are problems reading/parsing the request or storing files.
      * @throws IOException         An I/O error occurred. This may be a network error while communicating with the client or a problem while storing the
      *                             uploaded content.
      */
     @Override
-    public FileItemIterator getItemIterator(final HttpServletRequest request) throws FileUploadException, IOException {
+    public FileItemInputIterator getItemIterator(final HttpServletRequest request) throws FileUploadException, IOException {
         return super.getItemIterator(new JavaxServletRequestContext(request));
     }
 
diff --git a/commons-fileupload2-portlet/src/main/java/org/apache/commons/fileupload2/portlet/JavaxPortletFileUpload.java b/commons-fileupload2-portlet/src/main/java/org/apache/commons/fileupload2/portlet/JavaxPortletFileUpload.java
index 0c1053c..7cab2c5 100644
--- a/commons-fileupload2-portlet/src/main/java/org/apache/commons/fileupload2/portlet/JavaxPortletFileUpload.java
+++ b/commons-fileupload2-portlet/src/main/java/org/apache/commons/fileupload2/portlet/JavaxPortletFileUpload.java
@@ -25,7 +25,7 @@ import javax.portlet.ActionRequest;
 import org.apache.commons.fileupload2.AbstractFileUpload;
 import org.apache.commons.fileupload2.FileItem;
 import org.apache.commons.fileupload2.FileItemFactory;
-import org.apache.commons.fileupload2.FileItemIterator;
+import org.apache.commons.fileupload2.FileItemInputIterator;
 import org.apache.commons.fileupload2.FileUpload;
 import org.apache.commons.fileupload2.FileUploadException;
 import org.apache.commons.fileupload2.javax.JavaxServletFileUpload;
@@ -76,13 +76,13 @@ public class JavaxPortletFileUpload extends FileUpload<ActionRequest> {
      * Gets an <a href="http://www.ietf.org/rfc/rfc1867.txt">RFC 1867</a> compliant {@code multipart/form-data} file item iterator.
      *
      * @param request The portlet request to be parsed.
-     * @return An iterator to instances of {@code FileItemStream} parsed from the request, in the order that they were transmitted.
+     * @return An iterator to instances of {@code FileItemInput} parsed from the request, in the order that they were transmitted.
      * @throws FileUploadException if there are problems reading/parsing the request or storing files.
      * @throws IOException         An I/O error occurred. This may be a network error while communicating with the client or a problem while storing the
      *                             uploaded content.
      */
     @Override
-    public FileItemIterator getItemIterator(final ActionRequest request) throws FileUploadException, IOException {
+    public FileItemInputIterator getItemIterator(final ActionRequest request) throws FileUploadException, IOException {
         return super.getItemIterator(new PortletRequestContext(request));
     }