Skip to content

Commit f75d283

Browse files
committed
HTTPCLIENT-2418 - Fix default charset handling in SimpleBody for JSON content.Use UTF-8 instead of US-ASCII when no charset parameter is present.
1 parent 726eac2 commit f75d283

File tree

2 files changed

+84
-8
lines changed

2 files changed

+84
-8
lines changed

httpclient5/src/main/java/org/apache/hc/client5/http/async/methods/SimpleBody.java

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,8 @@ static SimpleBody create(final String body, final ContentType contentType) {
5555
if (body.length() > 2048) {
5656
return new SimpleBody(null, body, contentType);
5757
}
58-
final Charset charset = (contentType != null ? contentType : ContentType.DEFAULT_TEXT).getCharset();
59-
final byte[] bytes = body.getBytes(charset != null ? charset : StandardCharsets.US_ASCII);
58+
final Charset charset = (contentType != null ? contentType : ContentType.DEFAULT_TEXT).getCharset(StandardCharsets.UTF_8);
59+
final byte[] bytes = body.getBytes(charset);
6060
return new SimpleBody(bytes, null, contentType);
6161
}
6262

@@ -83,8 +83,8 @@ public byte[] getBodyBytes() {
8383
if (bodyAsBytes != null) {
8484
return bodyAsBytes;
8585
} else if (bodyAsText != null) {
86-
final Charset charset = (contentType != null ? contentType : ContentType.DEFAULT_TEXT).getCharset();
87-
return bodyAsText.getBytes(charset != null ? charset : StandardCharsets.US_ASCII);
86+
final Charset charset = (contentType != null ? contentType : ContentType.DEFAULT_TEXT).getCharset(StandardCharsets.UTF_8);
87+
return bodyAsText.getBytes(charset);
8888
} else {
8989
return null;
9090
}
@@ -97,8 +97,8 @@ public byte[] getBodyBytes() {
9797
*/
9898
public String getBodyText() {
9999
if (bodyAsBytes != null) {
100-
final Charset charset = (contentType != null ? contentType : ContentType.DEFAULT_TEXT).getCharset();
101-
return new String(bodyAsBytes, charset != null ? charset : StandardCharsets.US_ASCII);
100+
final Charset charset = (contentType != null ? contentType : ContentType.DEFAULT_TEXT).getCharset(StandardCharsets.UTF_8);
101+
return new String(bodyAsBytes, charset);
102102
}
103103
return bodyAsText;
104104
}
@@ -127,5 +127,4 @@ public String toString() {
127127
", content type=" + contentType + "}";
128128
}
129129

130-
}
131-
130+
}
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
/*
2+
* ====================================================================
3+
* Licensed to the Apache Software Foundation (ASF) under one
4+
* or more contributor license agreements. See the NOTICE file
5+
* distributed with this work for additional information
6+
* regarding copyright ownership. The ASF licenses this file
7+
* to you under the Apache License, Version 2.0 (the
8+
* "License"); you may not use this file except in compliance
9+
* with the License. You may obtain a copy of the License at
10+
*
11+
* http://www.apache.org/licenses/LICENSE-2.0
12+
*
13+
* Unless required by applicable law or agreed to in writing,
14+
* software distributed under the License is distributed on an
15+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16+
* KIND, either express or implied. See the License for the
17+
* specific language governing permissions and limitations
18+
* under the License.
19+
* ====================================================================
20+
*
21+
* This software consists of voluntary contributions made by many
22+
* individuals on behalf of the Apache Software Foundation. For more
23+
* information on the Apache Software Foundation, please see
24+
* <http://www.apache.org/>.
25+
*
26+
*/
27+
package org.apache.hc.client5.http.async.methods;
28+
29+
import java.nio.charset.StandardCharsets;
30+
31+
import org.apache.hc.core5.http.ContentType;
32+
import org.junit.jupiter.api.Assertions;
33+
import org.junit.jupiter.api.Test;
34+
35+
class TestSimpleBody {
36+
37+
@Test
38+
void testGetBodyTextUsesUtf8ForJsonWithoutCharsetParameter() {
39+
final String message = "{\"msg\": \"Test emoji 👋\"}";
40+
final SimpleBody body = SimpleBody.create(
41+
message.getBytes(StandardCharsets.UTF_8),
42+
ContentType.parse("application/json"));
43+
44+
Assertions.assertEquals(message, body.getBodyText());
45+
}
46+
47+
@Test
48+
void testGetBodyBytesUsesUtf8ForJsonWithoutCharsetParameter() {
49+
final String message = "{\"msg\": \"Test emoji 👋\"}";
50+
final SimpleBody body = SimpleBody.create(
51+
message,
52+
ContentType.parse("application/json"));
53+
54+
Assertions.assertArrayEquals(message.getBytes(StandardCharsets.UTF_8), body.getBodyBytes());
55+
}
56+
57+
@Test
58+
void testGetBodyTextUsesUtf8ForProblemJsonWithoutCharsetParameter() {
59+
final String message = "{\"title\": \"Bad request 👋\"}";
60+
final SimpleBody body = SimpleBody.create(
61+
message.getBytes(StandardCharsets.UTF_8),
62+
ContentType.parse("application/problem+json"));
63+
64+
Assertions.assertEquals(message, body.getBodyText());
65+
}
66+
67+
@Test
68+
void testExplicitCharsetStillWins() {
69+
final String message = "{\"msg\": \"hi\"}";
70+
final byte[] utf16 = message.getBytes(StandardCharsets.UTF_16);
71+
final SimpleBody body = SimpleBody.create(
72+
utf16,
73+
ContentType.parse("application/json; charset=UTF-16"));
74+
75+
Assertions.assertEquals(message, body.getBodyText());
76+
}
77+
}

0 commit comments

Comments
 (0)