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/06 14:29:20 UTC

[commons-fileupload] 08/09: Type-safe charset handling

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 <ga...@gmail.com>
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);