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

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


The following commit(s) were added to refs/heads/master by this push:
     new 036f98e3 [FILEUPLOAD-367] 
*ServletFileUpload.isMultipartContent(HttpServletRequest) should allow PUT and 
PATCH request methods in addition to POST.
036f98e3 is described below

commit 036f98e3ea93987cc295a24f1fed9be44587c10a
Author: Gary Gregory <[email protected]>
AuthorDate: Sun Feb 8 10:33:45 2026 -0500

    [FILEUPLOAD-367]
    *ServletFileUpload.isMultipartContent(HttpServletRequest) should allow
    PUT and PATCH request methods in addition to POST.
    
    - Add AbstractFileUpload.isMultipartRequestMethod(String).
    - Based on PR #469.
---
 .../fileupload2/core/AbstractFileUpload.java       | 26 ++++++++++++++++++++++
 .../fileupload2/core/AbstractFileUploadTest.java   | 10 +++++++++
 .../jakarta/servlet5/JakartaServletFileUpload.java |  7 +-----
 .../jakarta/servlet6/JakartaServletFileUpload.java |  7 +-----
 .../fileupload2/javax/JavaxServletFileUpload.java  |  7 +-----
 src/changes/changes.xml                            |  2 ++
 6 files changed, 41 insertions(+), 18 deletions(-)

diff --git 
a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/core/AbstractFileUpload.java
 
b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/core/AbstractFileUpload.java
index 5695ceeb..6d4e64e3 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
@@ -61,6 +61,21 @@ public abstract class AbstractFileUpload<R, I extends 
FileItem<I>, F extends Fil
      */
     private static final String FILENAME_KEY = "filename";
 
+    /**
+     * Constant for HTTP POST method.
+     */
+    private static final String POST_METHOD = "POST";
+
+    /**
+     * Constant for HTTP PUT method.
+     */
+    private static final String PUT_METHOD = "PUT";
+
+    /**
+     * Constant for HTTP PATCH method.
+     */
+    private static final String PATCH_METHOD = "PATCH";
+
     /**
      * HTTP content type header name.
      */
@@ -119,6 +134,17 @@ public abstract class AbstractFileUpload<R, I extends 
FileItem<I>, F extends Fil
         return contentType.toLowerCase(Locale.ROOT).startsWith(MULTIPART);
     }
 
+    /**
+     * Checks if a given request method is a valid multipart request method.
+     *
+     * @param method The request method verb.
+     * @return {@code true} if the request method supports multipart request 
payloads; {@code false} otherwise.
+     * @since 2.0.0-M5
+     */
+    protected static boolean isMultipartRequestMethod(final String method) {
+        return POST_METHOD.equalsIgnoreCase(method) || 
PUT_METHOD.equalsIgnoreCase(method) || PATCH_METHOD.equalsIgnoreCase(method);
+    }
+
     /**
      * The maximum size permitted for the complete request, as opposed to 
{@link #maxFileSize}. A value of -1 indicates no maximum.
      */
diff --git 
a/commons-fileupload2-core/src/test/java/org/apache/commons/fileupload2/core/AbstractFileUploadTest.java
 
b/commons-fileupload2-core/src/test/java/org/apache/commons/fileupload2/core/AbstractFileUploadTest.java
index abc1aa39..0995040e 100644
--- 
a/commons-fileupload2-core/src/test/java/org/apache/commons/fileupload2/core/AbstractFileUploadTest.java
+++ 
b/commons-fileupload2-core/src/test/java/org/apache/commons/fileupload2/core/AbstractFileUploadTest.java
@@ -396,6 +396,16 @@ public abstract class AbstractFileUploadTest<AFU extends 
AbstractFileUpload<R, I
         assertEquals("fieldValue2", field2.getString());
     }
 
+    @Test
+    void testIsMultipartRequestMethod() {
+        for (String allowed : new String[]{"POST", "PUT", "PATCH"}) {
+            assertTrue(AbstractFileUpload.isMultipartRequestMethod(allowed));
+        }
+        for (String disallowed : new String[]{"GET", "HEAD", "DELETE", 
"CONNECT", "OPTIONS", "TRACE"}) {
+            
assertFalse(AbstractFileUpload.isMultipartRequestMethod(disallowed));
+        }
+    }
+
     /**
      * Test for multipart/mixed with no boundary defined
      */
diff --git 
a/commons-fileupload2-jakarta-servlet5/src/main/java/org/apache/commons/fileupload2/jakarta/servlet5/JakartaServletFileUpload.java
 
b/commons-fileupload2-jakarta-servlet5/src/main/java/org/apache/commons/fileupload2/jakarta/servlet5/JakartaServletFileUpload.java
index c28b00b4..b80bd469 100644
--- 
a/commons-fileupload2-jakarta-servlet5/src/main/java/org/apache/commons/fileupload2/jakarta/servlet5/JakartaServletFileUpload.java
+++ 
b/commons-fileupload2-jakarta-servlet5/src/main/java/org/apache/commons/fileupload2/jakarta/servlet5/JakartaServletFileUpload.java
@@ -44,11 +44,6 @@ import jakarta.servlet.http.HttpServletRequest;
  */
 public class JakartaServletFileUpload<I extends FileItem<I>, F extends 
FileItemFactory<I>> extends AbstractFileUpload<HttpServletRequest, I, F> {
 
-    /**
-     * Constant for HTTP POST method.
-     */
-    private static final String POST_METHOD = "POST";
-
     /**
      * Tests whether the request contains multipart content.
      *
@@ -56,7 +51,7 @@ public class JakartaServletFileUpload<I extends FileItem<I>, 
F extends FileItemF
      * @return {@code true} if the request is multipart; {@code false} 
otherwise.
      */
     public static final boolean isMultipartContent(final HttpServletRequest 
request) {
-        return POST_METHOD.equalsIgnoreCase(request.getMethod()) && 
AbstractFileUpload.isMultipartContent(new 
JakartaServletRequestContext(request));
+        return isMultipartRequestMethod(request.getMethod()) && 
isMultipartContent(new JakartaServletRequestContext(request));
     }
 
     /**
diff --git 
a/commons-fileupload2-jakarta-servlet6/src/main/java/org/apache/commons/fileupload2/jakarta/servlet6/JakartaServletFileUpload.java
 
b/commons-fileupload2-jakarta-servlet6/src/main/java/org/apache/commons/fileupload2/jakarta/servlet6/JakartaServletFileUpload.java
index 60b52500..cb44c777 100644
--- 
a/commons-fileupload2-jakarta-servlet6/src/main/java/org/apache/commons/fileupload2/jakarta/servlet6/JakartaServletFileUpload.java
+++ 
b/commons-fileupload2-jakarta-servlet6/src/main/java/org/apache/commons/fileupload2/jakarta/servlet6/JakartaServletFileUpload.java
@@ -44,11 +44,6 @@ import jakarta.servlet.http.HttpServletRequest;
  */
 public class JakartaServletFileUpload<I extends FileItem<I>, F extends 
FileItemFactory<I>> extends AbstractFileUpload<HttpServletRequest, I, F> {
 
-    /**
-     * Constant for HTTP POST method.
-     */
-    private static final String POST_METHOD = "POST";
-
     /**
      * Tests whether the request contains multipart content.
      *
@@ -56,7 +51,7 @@ public class JakartaServletFileUpload<I extends FileItem<I>, 
F extends FileItemF
      * @return {@code true} if the request is multipart; {@code false} 
otherwise.
      */
     public static final boolean isMultipartContent(final HttpServletRequest 
request) {
-        return POST_METHOD.equalsIgnoreCase(request.getMethod()) && 
AbstractFileUpload.isMultipartContent(new 
JakartaServletRequestContext(request));
+        return isMultipartRequestMethod(request.getMethod()) && 
isMultipartContent(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 a7249e67..9295628f 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
@@ -44,11 +44,6 @@ import 
org.apache.commons.fileupload2.core.FileUploadException;
  */
 public class JavaxServletFileUpload<I extends FileItem<I>, F extends 
FileItemFactory<I>> extends AbstractFileUpload<HttpServletRequest, I, F> {
 
-    /**
-     * Constant for HTTP POST method.
-     */
-    private static final String POST_METHOD = "POST";
-
     /**
      * Tests whether the request contains multipart content.
      *
@@ -56,7 +51,7 @@ public class JavaxServletFileUpload<I extends FileItem<I>, F 
extends FileItemFac
      * @return {@code true} if the request is multipart; {@code false} 
otherwise.
      */
     public static final boolean isMultipartContent(final HttpServletRequest 
request) {
-        return POST_METHOD.equalsIgnoreCase(request.getMethod()) && 
AbstractFileUpload.isMultipartContent(new JavaxServletRequestContext(request));
+        return isMultipartRequestMethod(request.getMethod()) && 
AbstractFileUpload.isMultipartContent(new JavaxServletRequestContext(request));
     }
 
     /**
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index b6a7ca03..c42eab81 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -55,6 +55,8 @@ The <action> type attribute can be add,update,fix,remove.
       <action                        type="fix" dev="ggregory" due-to="Gary 
Gregory">Fix Apache RAT plugin console warnings.</action>
       <!-- ADD -->
       <action                        type="add" dev="ggregory" due-to="Ryan J 
Murphy">Add AbstractFileUpload support for a maximum part header size 
#429.</action>
+      <action issue="FILEUPLOAD-367" type="add" dev="ggregory" due-to="Gary 
Gregory">Jakarta and Javax 
ServletFileUpload.isMultipartContent(HttpServletRequest) should allow PUT and 
PATCH request methods in addition to POST.</action>
+      <action issue="FILEUPLOAD-367" type="add" dev="ggregory" due-to="Gary 
Gregory">Add AbstractFileUpload.isMultipartRequestMethod(String).</action>
       <!-- UPDATE -->
       <action type="update" dev="ggregory" due-to="Gary Gregory, 
Dependabot">Bump org.apache.commons:commons-parent from 84 to 96 #444, #459, 
#463.</action>
       <action type="update" dev="ggregory" due-to="Gary Gregory">Bump 
org.apache.commons:commons-lang3 from 3.17.0 to 3.20.0 #427.</action>

Reply via email to