Always specify charset for form data requests
Issue: SPR-16613
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2017 the original author or authors.
|
||||
* Copyright 2002-2018 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -61,12 +61,15 @@ public class FormHttpMessageWriter implements HttpMessageWriter<MultiValueMap<St
|
||||
|
||||
public static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8;
|
||||
|
||||
private static final ResolvableType MULTIVALUE_TYPE =
|
||||
ResolvableType.forClassWithGenerics(MultiValueMap.class, String.class, String.class);
|
||||
private static final MediaType DEFAULT_FORM_DATA_MEDIA_TYPE =
|
||||
new MediaType(MediaType.APPLICATION_FORM_URLENCODED, DEFAULT_CHARSET);
|
||||
|
||||
private static final List<MediaType> MEDIA_TYPES =
|
||||
Collections.singletonList(MediaType.APPLICATION_FORM_URLENCODED);
|
||||
|
||||
private static final ResolvableType MULTIVALUE_TYPE =
|
||||
ResolvableType.forClassWithGenerics(MultiValueMap.class, String.class, String.class);
|
||||
|
||||
|
||||
private Charset defaultCharset = DEFAULT_CHARSET;
|
||||
|
||||
@@ -117,13 +120,16 @@ public class FormHttpMessageWriter implements HttpMessageWriter<MultiValueMap<St
|
||||
ResolvableType elementType, @Nullable MediaType mediaType, ReactiveHttpOutputMessage message,
|
||||
Map<String, Object> hints) {
|
||||
|
||||
MediaType contentType = message.getHeaders().getContentType();
|
||||
if (contentType == null) {
|
||||
contentType = MediaType.APPLICATION_FORM_URLENCODED;
|
||||
message.getHeaders().setContentType(contentType);
|
||||
mediaType = (mediaType != null ? mediaType : DEFAULT_FORM_DATA_MEDIA_TYPE);
|
||||
Charset charset;
|
||||
if (mediaType.getCharset() == null) {
|
||||
charset = getDefaultCharset();
|
||||
mediaType = new MediaType(mediaType, charset);
|
||||
}
|
||||
|
||||
Charset charset = getMediaTypeCharset(contentType);
|
||||
else {
|
||||
charset = mediaType.getCharset();
|
||||
}
|
||||
message.getHeaders().setContentType(mediaType);
|
||||
|
||||
return Mono.from(inputStream).flatMap(form -> {
|
||||
String value = serializeForm(form, charset);
|
||||
|
||||
@@ -96,6 +96,9 @@ public class FormHttpMessageConverter implements HttpMessageConverter<MultiValue
|
||||
|
||||
public static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8;
|
||||
|
||||
private static final MediaType DEFAULT_FORM_DATA_MEDIA_TYPE =
|
||||
new MediaType(MediaType.APPLICATION_FORM_URLENCODED, DEFAULT_CHARSET);
|
||||
|
||||
|
||||
private List<MediaType> supportedMediaTypes = new ArrayList<>();
|
||||
|
||||
@@ -290,15 +293,14 @@ public class FormHttpMessageConverter implements HttpMessageConverter<MultiValue
|
||||
private void writeForm(MultiValueMap<String, String> form, @Nullable MediaType contentType,
|
||||
HttpOutputMessage outputMessage) throws IOException {
|
||||
|
||||
Charset charset;
|
||||
if (contentType != null) {
|
||||
outputMessage.getHeaders().setContentType(contentType);
|
||||
charset = (contentType.getCharset() != null ? contentType.getCharset() : this.charset);
|
||||
}
|
||||
else {
|
||||
outputMessage.getHeaders().setContentType(MediaType.APPLICATION_FORM_URLENCODED);
|
||||
contentType = (contentType != null ? contentType : DEFAULT_FORM_DATA_MEDIA_TYPE);
|
||||
Charset charset = contentType.getCharset();
|
||||
if (charset == null) {
|
||||
charset = this.charset;
|
||||
contentType = new MediaType(contentType, charset);
|
||||
}
|
||||
outputMessage.getHeaders().setContentType(contentType);
|
||||
|
||||
StringBuilder builder = new StringBuilder();
|
||||
for (Iterator<String> nameIterator = form.keySet().iterator(); nameIterator.hasNext();) {
|
||||
String name = nameIterator.next();
|
||||
|
||||
Reference in New Issue
Block a user