Skip to content

Commit 02b97ed

Browse files
committed
Demonstrate AHC properly encodes chinese characters
1 parent 6656e9c commit 02b97ed

File tree

2 files changed

+41
-9
lines changed

2 files changed

+41
-9
lines changed

client/src/test/java/org/asynchttpclient/BasicHttpTest.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,10 @@
3838
import java.io.ByteArrayInputStream;
3939
import java.io.IOException;
4040
import java.io.InputStream;
41+
import java.io.UnsupportedEncodingException;
4142
import java.net.ConnectException;
43+
import java.net.URLDecoder;
44+
import java.net.URLEncoder;
4245
import java.net.UnknownHostException;
4346
import java.nio.charset.StandardCharsets;
4447
import java.util.*;
@@ -206,6 +209,40 @@ public Response onCompleted(Response response) {
206209
}));
207210
}
208211

212+
@Test
213+
public void postChineseChar() throws Throwable {
214+
withClient().run(client ->
215+
withServer(server).run(server -> {
216+
HttpHeaders h = new DefaultHttpHeaders();
217+
h.add(CONTENT_TYPE, HttpHeaderValues.APPLICATION_X_WWW_FORM_URLENCODED);
218+
219+
String chineseChar = "是";
220+
221+
Map<String, List<String>> m = new HashMap<>();
222+
m.put("param", Collections.singletonList(chineseChar));
223+
224+
Request request = post(getTargetUrl()).setHeaders(h).setFormParams(m).build();
225+
226+
server.enqueueEcho();
227+
228+
client.executeRequest(request, new AsyncCompletionHandlerAdapter() {
229+
@Override
230+
public Response onCompleted(Response response) {
231+
assertEquals(response.getStatusCode(), 200);
232+
String value;
233+
try {
234+
// headers must be encoded
235+
value = URLDecoder.decode(response.getHeader("X-param"), StandardCharsets.UTF_8.name());
236+
} catch (UnsupportedEncodingException e) {
237+
throw new RuntimeException(e);
238+
}
239+
assertEquals(value, chineseChar);
240+
return response;
241+
}
242+
}).get(TIMEOUT, SECONDS);
243+
}));
244+
}
245+
209246
@Test
210247
public void headHasEmptyBody() throws Throwable {
211248
withClient().run(client ->

client/src/test/java/org/asynchttpclient/testserver/HttpServer.java

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
import javax.servlet.http.HttpServletResponse;
2626
import java.io.Closeable;
2727
import java.io.IOException;
28+
import java.net.URLEncoder;
29+
import java.nio.charset.StandardCharsets;
2830
import java.util.Enumeration;
2931
import java.util.Map.Entry;
3032
import java.util.concurrent.ConcurrentLinkedQueue;
@@ -208,8 +210,9 @@ protected void handle0(String target, Request baseRequest, HttpServletRequest re
208210
response.addHeader("X-" + headerName, request.getHeader(headerName));
209211
}
210212

213+
StringBuilder requestBody = new StringBuilder();
211214
for (Entry<String, String[]> e : baseRequest.getParameterMap().entrySet()) {
212-
response.addHeader("X-" + e.getKey(), e.getValue()[0]);
215+
response.addHeader("X-" + e.getKey(), URLEncoder.encode(e.getValue()[0], StandardCharsets.UTF_8.name()));
213216
}
214217

215218
Cookie[] cs = request.getCookies();
@@ -219,14 +222,6 @@ protected void handle0(String target, Request baseRequest, HttpServletRequest re
219222
}
220223
}
221224

222-
Enumeration<String> parameterNames = request.getParameterNames();
223-
StringBuilder requestBody = new StringBuilder();
224-
while (parameterNames.hasMoreElements()) {
225-
String param = parameterNames.nextElement();
226-
response.addHeader("X-" + param, request.getParameter(param));
227-
requestBody.append(param);
228-
requestBody.append("_");
229-
}
230225
if (requestBody.length() > 0) {
231226
response.getOutputStream().write(requestBody.toString().getBytes());
232227
}

0 commit comments

Comments
 (0)