org.springframework.http.converter.StringHttpMessageConverterCustom Maven / Gradle / Ivy
package org.springframework.http.converter;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import org.jsoup.helper.DataUtil;
import org.jsoup.parser.Parser;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.MediaType;
import org.springframework.util.ClassUtils;
import org.springframework.util.LinkedCaseInsensitiveMap;
public class StringHttpMessageConverterCustom extends StringHttpMessageConverter {
private static final Set textValues = new HashSet(1);
private static final Set xmlValues = new HashSet(3);
static {
textValues.add(new MediaType(MediaType.TEXT_XML.getType(), MediaType.ALL.getType()));
xmlValues.add(MediaType.TEXT_XML);
xmlValues.add(MediaType.APPLICATION_XML);
xmlValues.add(new MediaType(MediaType.TEXT_XML.getType(), MediaType.ALL.getType() + '+' + MediaType.TEXT_XML.getSubtype()));
}
private final boolean jsoup = ClassUtils.isPresent("org.jsoup.Jsoup", getClass().getClassLoader());
public StringHttpMessageConverterCustom(Charset defaultCharset) {
super(defaultCharset);
}
/**
* @see java.nio.charset.Charset#defaultCharset()
*/
@Override
protected List getAcceptedCharsets() {
return Arrays.asList(getDefaultCharset());
}
@Override
protected String readInternal(Class clazz, HttpInputMessage inputMessage) throws IOException {
MediaType mediaType = inputMessage.getHeaders().getContentType();
if (this.jsoup && mediaType.getCharset() == null) {
Charset charset = getCharset(mediaType, inputMessage.getBody());
if (charset != null && !charset.equals(getDefaultCharset())) {
Map parameters = new LinkedCaseInsensitiveMap(mediaType.getParameters().size() + 1, Locale.ENGLISH);
if (mediaType.getParameters().size() > 0) {
parameters.putAll(mediaType.getParameters());
}
parameters.putAll(new MediaType(mediaType, charset).getParameters());
inputMessage.getHeaders().setContentType(new MediaType(mediaType, parameters));
}
}
return super.readInternal(clazz, inputMessage);
}
/**
* text/*, application/xml, or application/xhtml+xml
*
*
* Pattern.compile("(application|text)/\\w*\\+?xml.*")
*
*/
protected Charset getCharset(MediaType mediaType, InputStream inputStream) throws IOException {
boolean text = isText(mediaType);
boolean xml = isXml(mediaType);
if (text || xml) {
Parser parser = xml ? Parser.xmlParser() : Parser.htmlParser();
return DataUtil.load(inputStream, null, "", parser).charset();
}
return null;
}
protected boolean isText(MediaType mediaType) {
for (MediaType xmlMediaType : textValues) {
if (xmlMediaType.includes(mediaType)) {
return true;
}
}
return false;
}
protected boolean isXml(MediaType mediaType) {
for (MediaType xmlMediaType : xmlValues) {
if (xmlMediaType.includes(mediaType)) {
return true;
}
}
return false;
}
}