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 5695ceeb6..a6cb45a00 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, 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,16 @@ public static final boolean isMultipartContent(final RequestContext ctx) { 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. + */ + 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 abc1aa397..93268d8de 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 @@ -55,6 +55,16 @@ private void assertHeaders(final String[] headerNames, final String[] headerValu } } + @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)); + } + } + /** * Tests FILEUPLOAD-239 * 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 c28b00b42..539ad9cfe 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 @@ */ public class JakartaServletFileUpload, F extends FileItemFactory> extends AbstractFileUpload { - /** - * 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, 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 AbstractFileUpload.isMultipartRequestMethod(request.getMethod()) && AbstractFileUpload.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 60b525002..502b0ec3e 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 @@ */ public class JakartaServletFileUpload, F extends FileItemFactory> extends AbstractFileUpload { - /** - * 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, 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 AbstractFileUpload.isMultipartRequestMethod(request.getMethod()) && AbstractFileUpload.isMultipartContent(new JakartaServletRequestContext(request)); } /**