Skip to content

Commit 290c9c4

Browse files
committed
Use form charset in ServletServerHttpRequest
Closes gh-34675
1 parent e01ad5a commit 290c9c4

File tree

2 files changed

+28
-3
lines changed

2 files changed

+28
-3
lines changed

spring-web/src/main/java/org/springframework/http/server/ServletServerHttpRequest.java

+17-3
Original file line numberDiff line numberDiff line change
@@ -270,18 +270,19 @@ private static boolean isFormPost(HttpServletRequest request) {
270270
*/
271271
private InputStream getBodyFromServletRequestParameters(HttpServletRequest request) throws IOException {
272272
ByteArrayOutputStream bos = new ByteArrayOutputStream(1024);
273-
Writer writer = new OutputStreamWriter(bos, FORM_CHARSET);
273+
Charset charset = getFormCharset();
274+
Writer writer = new OutputStreamWriter(bos, charset);
274275

275276
Map<String, String[]> form = request.getParameterMap();
276277
for (Iterator<Map.Entry<String, String[]>> entryItr = form.entrySet().iterator(); entryItr.hasNext();) {
277278
Map.Entry<String, String[]> entry = entryItr.next();
278279
List<String> values = Arrays.asList(entry.getValue());
279280
for (Iterator<String> valueItr = values.iterator(); valueItr.hasNext();) {
280281
String value = valueItr.next();
281-
writer.write(URLEncoder.encode(entry.getKey(), FORM_CHARSET));
282+
writer.write(URLEncoder.encode(entry.getKey(), charset));
282283
if (value != null) {
283284
writer.write('=');
284-
writer.write(URLEncoder.encode(value, FORM_CHARSET));
285+
writer.write(URLEncoder.encode(value, charset));
285286
if (valueItr.hasNext()) {
286287
writer.write('&');
287288
}
@@ -301,6 +302,19 @@ private InputStream getBodyFromServletRequestParameters(HttpServletRequest reque
301302
return new ByteArrayInputStream(bytes);
302303
}
303304

305+
private Charset getFormCharset() {
306+
try {
307+
MediaType contentType = getHeaders().getContentType();
308+
if (contentType != null && contentType.getCharset() != null) {
309+
return contentType.getCharset();
310+
}
311+
}
312+
catch (Exception ex) {
313+
// ignore
314+
}
315+
return FORM_CHARSET;
316+
}
317+
304318

305319
private final class AttributesMap extends AbstractMap<String, Object> {
306320

spring-web/src/test/java/org/springframework/http/server/ServletServerHttpRequestTests.java

+11
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import java.io.IOException;
2020
import java.net.URI;
21+
import java.net.URLDecoder;
2122
import java.nio.charset.StandardCharsets;
2223
import java.util.List;
2324

@@ -217,6 +218,16 @@ void getFormBodyWhenNotEncodedCharactersPresent() throws IOException {
217218
assertThat(request.getHeaders().getContentLength()).isEqualTo(contentLength);
218219
}
219220

221+
@Test // gh-34675
222+
void getFormBodyWithNotUtf8Charset() throws IOException {
223+
String charset = "windows-1251";
224+
mockRequest.setContentType("application/x-www-form-urlencoded; charset=" + charset);
225+
mockRequest.setMethod("POST");
226+
mockRequest.addParameter("x", URLDecoder.decode("%e0%e0%e0", charset));
227+
228+
assertFormContent("x=%E0%E0%E0");
229+
}
230+
220231
private int assertFormContent(String expected) throws IOException {
221232
byte[] result = FileCopyUtils.copyToByteArray(request.getBody());
222233
byte[] content = expected.getBytes(StandardCharsets.UTF_8);

0 commit comments

Comments
 (0)