diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/entity/mime/HttpMultipartMode.java b/httpclient5/src/main/java/org/apache/hc/client5/http/entity/mime/HttpMultipartMode.java
index c4f7ceb08..e120c6bb4 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/entity/mime/HttpMultipartMode.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/entity/mime/HttpMultipartMode.java
@@ -28,18 +28,35 @@
package org.apache.hc.client5.http.entity.mime;
/**
+ * MIME compliance mode.
*
* @since 4.0
*/
public enum HttpMultipartMode {
- /** RFC 822, RFC 2045, RFC 2046 compliant */
+ /**
+ * Legacy compatibility mode.
+ *
+ * In this mode only the most essential fields are generated
+ * such as Content-Type and Content-Disposition.
+ */
+ LEGACY,
+
+ /**
+ * Strict MIME specification conformance.
+ *
+ * Presently conforms to RFC 822, RFC 2045, RFC 2046.
+ */
STRICT,
- /** browser-compatible mode, i.e. only write Content-Disposition; use content charset */
- BROWSER_COMPATIBLE,
- /** RFC 6532 compliant */
- RFC6532,
- /** RFC 7578 compliant */
- RFC7578
+
+ /**
+ * Extended MIME specification conformance.
+ *
+ * In this mode header field values may contain international UTF-8 encoded
+ * characters.
+ *
+ * Presently conforms to RFC 6532 and RFC 7578.
+ */
+ EXTENDED,
}
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/entity/mime/HttpBrowserCompatibleMultipart.java b/httpclient5/src/main/java/org/apache/hc/client5/http/entity/mime/LegacyMultipart.java
similarity index 95%
rename from httpclient5/src/main/java/org/apache/hc/client5/http/entity/mime/HttpBrowserCompatibleMultipart.java
rename to httpclient5/src/main/java/org/apache/hc/client5/http/entity/mime/LegacyMultipart.java
index e431091ac..adda69de3 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/entity/mime/HttpBrowserCompatibleMultipart.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/entity/mime/LegacyMultipart.java
@@ -38,11 +38,11 @@
*
* @since 4.3
*/
-class HttpBrowserCompatibleMultipart extends AbstractMultipartFormat {
+class LegacyMultipart extends AbstractMultipartFormat {
private final List parts;
- public HttpBrowserCompatibleMultipart(
+ public LegacyMultipart(
final Charset charset,
final String boundary,
final List parts) {
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/entity/mime/MultipartEntityBuilder.java b/httpclient5/src/main/java/org/apache/hc/client5/http/entity/mime/MultipartEntityBuilder.java
index 86f24c98e..278aade69 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/entity/mime/MultipartEntityBuilder.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/entity/mime/MultipartEntityBuilder.java
@@ -56,9 +56,6 @@ public class MultipartEntityBuilder {
"-_1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
.toCharArray();
- private final static String FORM_SUBTYPE = "form-data";
- private final static String MIXED_SUBTYPE = "mixed";
-
private ContentType contentType;
private HttpMultipartMode mode = HttpMultipartMode.STRICT;
private String boundary = null;
@@ -78,7 +75,7 @@ public MultipartEntityBuilder setMode(final HttpMultipartMode mode) {
}
public MultipartEntityBuilder setLaxMode() {
- this.mode = HttpMultipartMode.BROWSER_COMPATIBLE;
+ this.mode = HttpMultipartMode.LEGACY;
return this;
}
@@ -219,9 +216,9 @@ MultipartFormEntity buildEntity() {
}
if (formData) {
- contentTypeCopy = ContentType.create("multipart/" + FORM_SUBTYPE, params);
+ contentTypeCopy = ContentType.MULTIPART_FORM_DATA.withParameters(params);
} else {
- contentTypeCopy = ContentType.create("multipart/" + MIXED_SUBTYPE, params);
+ contentTypeCopy = ContentType.create("multipart/mixed", params);
}
}
final List multipartPartsCopy = multipartParts != null ? new ArrayList<>(multipartParts) :
@@ -229,17 +226,18 @@ MultipartFormEntity buildEntity() {
final HttpMultipartMode modeCopy = mode != null ? mode : HttpMultipartMode.STRICT;
final AbstractMultipartFormat form;
switch (modeCopy) {
- case BROWSER_COMPATIBLE:
- form = new HttpBrowserCompatibleMultipart(charsetCopy, boundaryCopy, multipartPartsCopy);
+ case LEGACY:
+ form = new LegacyMultipart(charsetCopy, boundaryCopy, multipartPartsCopy);
break;
- case RFC6532:
- form = new HttpRFC6532Multipart(charsetCopy, boundaryCopy, multipartPartsCopy);
- break;
- case RFC7578:
- if (charsetCopy == null) {
- charsetCopy = StandardCharsets.UTF_8;
+ case EXTENDED:
+ if (ContentType.MULTIPART_FORM_DATA.isSameMimeType(ContentType.MULTIPART_FORM_DATA)) {
+ if (charsetCopy == null) {
+ charsetCopy = StandardCharsets.UTF_8;
+ }
+ form = new HttpRFC7578Multipart(charsetCopy, boundaryCopy, multipartPartsCopy);
+ } else {
+ form = new HttpRFC6532Multipart(charsetCopy, boundaryCopy, multipartPartsCopy);
}
- form = new HttpRFC7578Multipart(charsetCopy, boundaryCopy, multipartPartsCopy);
break;
default:
form = new HttpStrictMultipart(StandardCharsets.US_ASCII, boundaryCopy, multipartPartsCopy);
diff --git a/httpclient5/src/test/java/org/apache/hc/client5/http/entity/mime/TestMultipartEntityBuilder.java b/httpclient5/src/test/java/org/apache/hc/client5/http/entity/mime/TestMultipartEntityBuilder.java
index ce6dbf7bc..5b588c1ec 100644
--- a/httpclient5/src/test/java/org/apache/hc/client5/http/entity/mime/TestMultipartEntityBuilder.java
+++ b/httpclient5/src/test/java/org/apache/hc/client5/http/entity/mime/TestMultipartEntityBuilder.java
@@ -58,7 +58,7 @@ public void testMultipartOptions() throws Exception {
.setLaxMode()
.buildEntity();
Assert.assertNotNull(entity);
- Assert.assertTrue(entity.getMultipart() instanceof HttpBrowserCompatibleMultipart);
+ Assert.assertTrue(entity.getMultipart() instanceof LegacyMultipart);
Assert.assertEquals("blah-blah", entity.getMultipart().boundary);
Assert.assertEquals(StandardCharsets.UTF_8, entity.getMultipart().charset);
}
@@ -151,7 +151,7 @@ public void testMultipartWriteToRFC7578Mode() throws Exception {
parameters.add(new BasicNameValuePair(MimeConsts.FIELD_PARAM_FILENAME, "hello \u03BA\u03CC\u03C3\u03BC\u03B5!%"));
final MultipartFormEntity entity = MultipartEntityBuilder.create()
- .setMode(HttpMultipartMode.RFC7578)
+ .setMode(HttpMultipartMode.EXTENDED)
.setBoundary("xxxxxxxxxxxxxxxxxxxxxxxx")
.addPart(new FormBodyPartBuilder()
.setName("test")
diff --git a/httpclient5/src/test/java/org/apache/hc/client5/http/entity/mime/TestMultipartForm.java b/httpclient5/src/test/java/org/apache/hc/client5/http/entity/mime/TestMultipartForm.java
index 98d6ee64d..b38ca74fc 100644
--- a/httpclient5/src/test/java/org/apache/hc/client5/http/entity/mime/TestMultipartForm.java
+++ b/httpclient5/src/test/java/org/apache/hc/client5/http/entity/mime/TestMultipartForm.java
@@ -300,7 +300,7 @@ public void testMultipartFormBrowserCompatibleNonASCIIHeaders() throws Exception
final FormBodyPart p2 = FormBodyPartBuilder.create(
"field2",
new InputStreamBody(new FileInputStream(tmpfile), s2 + ".tmp")).build();
- final HttpBrowserCompatibleMultipart multipart = new HttpBrowserCompatibleMultipart(
+ final LegacyMultipart multipart = new LegacyMultipart(
StandardCharsets.UTF_8, "foo",
Arrays.asList(p1, p2));
diff --git a/httpclient5/src/test/java/org/apache/hc/client5/http/entity/mime/TestMultipartMixed.java b/httpclient5/src/test/java/org/apache/hc/client5/http/entity/mime/TestMultipartMixed.java
index 714d5ff93..9d27a8465 100644
--- a/httpclient5/src/test/java/org/apache/hc/client5/http/entity/mime/TestMultipartMixed.java
+++ b/httpclient5/src/test/java/org/apache/hc/client5/http/entity/mime/TestMultipartMixed.java
@@ -264,7 +264,7 @@ public void testMultipartPartBrowserCompatibleNonASCIIHeaders() throws Exception
@SuppressWarnings("resource")
final MultipartPart p2 = MultipartPartBuilder.create(
new InputStreamBody(new FileInputStream(tmpfile), s2 + ".tmp")).build();
- final HttpBrowserCompatibleMultipart multipart = new HttpBrowserCompatibleMultipart(
+ final LegacyMultipart multipart = new LegacyMultipart(
StandardCharsets.UTF_8, "foo",
Arrays.asList(p1, p2));