in common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/BodyProcessorCreator.java [105:148]
private Object getValueImpl(HttpServletRequest request) throws IOException {
Object body = request.getAttribute(RestConst.BODY_PARAMETER);
if (body != null) {
return convertValue(body, targetType);
}
// edge support convert from form-data or x-www-form-urlencoded to json automatically
String contentType = request.getContentType();
contentType = contentType == null ? "" : contentType.toLowerCase(Locale.US);
if (contentType.startsWith(MediaType.MULTIPART_FORM_DATA)
|| contentType.startsWith(MediaType.APPLICATION_FORM_URLENCODED)) {
return convertValue(request.getParameterMap(), targetType);
}
// for standard HttpServletRequest, getInputStream will never return null
// but for mocked HttpServletRequest, maybe get a null
// like org.apache.servicecomb.provider.springmvc.reference.ClientToHttpServletRequest
InputStream inputStream = request.getInputStream();
if (inputStream == null) {
return null;
}
if (!contentType.isEmpty() && !contentType.startsWith(MediaType.APPLICATION_JSON)) {
// TODO: we should consider body encoding
return IOUtils.toString(inputStream, StandardCharsets.UTF_8);
}
try {
ObjectReader reader = serialViewClass != null
? RestObjectMapperFactory.getRestObjectMapper().readerWithView(serialViewClass)
: RestObjectMapperFactory.getRestObjectMapper().reader();
if (decodeAsObject) {
return reader.forType(OBJECT_TYPE).readValue(inputStream);
}
return reader.forType(targetType == null ? OBJECT_TYPE : targetType)
.readValue(inputStream);
} catch (MismatchedInputException e) {
// there is no way to detect InputStream is empty, so have to catch the exception
if (!isRequired && e.getMessage().contains("No content to map due to end-of-input")) {
LOGGER.info("Empty content and required is false, taken as null");
return null;
}
throw e;
}
}