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);