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 189e3155007466135036af7ecda1e543424f9bb0 Author: Gary Gregory <[email protected]> AuthorDate: Tue Jun 6 10:23:23 2023 -0400 Type-safe charset handling Fail faster on invalid charsets Don't allow invalid charsets in APIs --- .../commons/fileupload2/disk/DiskFileItem.java | 24 ++++++++++------------ .../fileupload2/disk/DiskFileItemFactory.java | 7 ++++--- .../jakarta/JakartaServletFileUploadTest.java | 2 +- .../javax/JavaxServletFileUploadTest.java | 2 +- 4 files changed, 17 insertions(+), 18 deletions(-) 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 b904e23..dad510a 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 @@ -23,7 +23,9 @@ import java.io.InputStream; import java.io.OutputStream; import java.io.UncheckedIOException; import java.io.UnsupportedEncodingException; +import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; +import java.nio.charset.UnsupportedCharsetException; import java.nio.file.Files; import java.nio.file.Path; import java.util.Map; @@ -35,6 +37,7 @@ import org.apache.commons.fileupload2.FileItemHeaders; import org.apache.commons.fileupload2.FileUploadException; import org.apache.commons.fileupload2.InvalidFileNameException; import org.apache.commons.fileupload2.ParameterParser; +import org.apache.commons.io.Charsets; import org.apache.commons.io.FileUtils; import org.apache.commons.io.function.Uncheck; import org.apache.commons.io.output.DeferredFileOutputStream; @@ -63,7 +66,7 @@ public class DiskFileItem implements FileItem { * Default content charset to be used when no explicit charset parameter is provided by the sender. Media subtypes of the "text" type are defined to have a * default charset value of "ISO-8859-1" when received via HTTP. */ - public static final String DEFAULT_CHARSET = StandardCharsets.ISO_8859_1.name(); + public static final Charset DEFAULT_CHARSET = StandardCharsets.ISO_8859_1; /** * UID used in unique file name generation. @@ -179,7 +182,7 @@ public class DiskFileItem implements FileItem { /** * Default content charset to be used when no explicit charset parameter is provided by the sender. */ - private String defaultCharset = DEFAULT_CHARSET; + private Charset defaultCharset = DEFAULT_CHARSET; /** * Constructs a new {@code DiskFileItem} instance. @@ -240,12 +243,12 @@ public class DiskFileItem implements FileItem { * * @return The content charset passed by the agent or {@code null} if not defined. */ - public String getCharset() { + public Charset getCharset() { final ParameterParser parser = new ParameterParser(); parser.setLowerCaseNames(true); // Parameter parser can handle null input final Map<String, String> params = parser.parse(getContentType(), ';'); - return params.get("charset"); + return Charsets.toCharset(params.get("charset"), defaultCharset); } /** @@ -263,7 +266,7 @@ public class DiskFileItem implements FileItem { * * @return the default charset */ - public String getDefaultCharset() { + public Charset getDefaultCharset() { return defaultCharset; } @@ -379,13 +382,8 @@ public class DiskFileItem implements FileItem { @Override public String getString() { try { - final byte[] rawData = get(); - String charset = getCharset(); - if (charset == null) { - charset = defaultCharset; - } - return new String(rawData, charset); - } catch (final IOException e) { + return new String(get(), getCharset()); + } catch (final UnsupportedCharsetException e) { return ""; } } @@ -452,7 +450,7 @@ public class DiskFileItem implements FileItem { * * @param charset the default charset */ - public void setDefaultCharset(final String charset) { + public void setDefaultCharset(final Charset charset) { defaultCharset = charset; } 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 18e66f3..92a13a7 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 @@ -17,6 +17,7 @@ package org.apache.commons.fileupload2.disk; import java.io.File; +import java.nio.charset.Charset; import org.apache.commons.fileupload2.FileItem; import org.apache.commons.fileupload2.FileItemFactory; @@ -79,7 +80,7 @@ public class DiskFileItemFactory implements FileItemFactory { /** * Default content charset to be used when no explicit charset parameter is provided by the sender. */ - private String defaultCharset = DiskFileItem.DEFAULT_CHARSET; + private Charset defaultCharset = DiskFileItem.DEFAULT_CHARSET; /** * Constructs an unconfigured instance of this class. The resulting factory may be configured by calling the appropriate setter methods. @@ -124,7 +125,7 @@ public class DiskFileItemFactory implements FileItemFactory { * * @return the default charset */ - public String getDefaultCharset() { + public Charset getDefaultCharset() { return defaultCharset; } @@ -162,7 +163,7 @@ public class DiskFileItemFactory implements FileItemFactory { * * @param charset the default charset */ - public void setDefaultCharset(final String charset) { + public void setDefaultCharset(final Charset charset) { defaultCharset = charset; } diff --git a/commons-fileupload2-jakarta/src/test/java/org/apache/commons/fileupload2/jakarta/JakartaServletFileUploadTest.java b/commons-fileupload2-jakarta/src/test/java/org/apache/commons/fileupload2/jakarta/JakartaServletFileUploadTest.java index 4e7fb79..9c299a5 100644 --- a/commons-fileupload2-jakarta/src/test/java/org/apache/commons/fileupload2/jakarta/JakartaServletFileUploadTest.java +++ b/commons-fileupload2-jakarta/src/test/java/org/apache/commons/fileupload2/jakarta/JakartaServletFileUploadTest.java @@ -59,7 +59,7 @@ public class JakartaServletFileUploadTest extends AbstractFileUploadTest<Jakarta final HttpServletRequest request = new JakartaMockServletHttpRequest(bytes, Constants.CONTENT_TYPE); final DiskFileItemFactory fileItemFactory = new DiskFileItemFactory(); - fileItemFactory.setDefaultCharset("UTF-8"); + fileItemFactory.setDefaultCharset(StandardCharsets.UTF_8); final JakartaServletFileUpload upload = new JakartaServletFileUpload(fileItemFactory); final List<FileItem> fileItems = upload.parseRequest(request); final FileItem fileItem = fileItems.get(0); diff --git a/commons-fileupload2-javax/src/test/java/org/apache/commons/fileupload2/javax/JavaxServletFileUploadTest.java b/commons-fileupload2-javax/src/test/java/org/apache/commons/fileupload2/javax/JavaxServletFileUploadTest.java index a4d4d00..ec98fdf 100644 --- a/commons-fileupload2-javax/src/test/java/org/apache/commons/fileupload2/javax/JavaxServletFileUploadTest.java +++ b/commons-fileupload2-javax/src/test/java/org/apache/commons/fileupload2/javax/JavaxServletFileUploadTest.java @@ -63,7 +63,7 @@ public class JavaxServletFileUploadTest extends AbstractFileUploadTest<JavaxServ final HttpServletRequest request = new JavaxMockHttpServletRequest(bytes, Constants.CONTENT_TYPE); final DiskFileItemFactory fileItemFactory = new DiskFileItemFactory(); - fileItemFactory.setDefaultCharset("UTF-8"); + fileItemFactory.setDefaultCharset(StandardCharsets.UTF_8); final JavaxServletFileUpload upload = new JavaxServletFileUpload(fileItemFactory); final List<FileItem> fileItems = upload.parseRequest(request); final FileItem fileItem = fileItems.get(0);
