@ -1,5 +1,5 @@
@@ -1,5 +1,5 @@
/ *
* Copyright 2002 - 2017 the original author or authors .
* Copyright 2002 - 2020 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 .
@ -22,11 +22,13 @@ import java.io.InputStream;
@@ -22,11 +22,13 @@ import java.io.InputStream;
import java.nio.charset.Charset ;
import javax.servlet.http.HttpServletRequest ;
import javax.servlet.http.Part ;
import org.springframework.http.HttpHeaders ;
import org.springframework.http.MediaType ;
import org.springframework.http.server.ServerHttpRequest ;
import org.springframework.http.server.ServletServerHttpRequest ;
import org.springframework.lang.Nullable ;
import org.springframework.web.multipart.MultipartException ;
import org.springframework.web.multipart.MultipartFile ;
import org.springframework.web.multipart.MultipartHttpServletRequest ;
@ -46,59 +48,79 @@ public class RequestPartServletServerHttpRequest extends ServletServerHttpReques
@@ -46,59 +48,79 @@ public class RequestPartServletServerHttpRequest extends ServletServerHttpReques
private final MultipartHttpServletRequest multipartRequest ;
private final String p artName;
private final String requestP artName;
private final HttpHeaders h eaders;
private final HttpHeaders multipartH eaders;
/ * *
* Create a new { @code RequestPartServletServerHttpRequest } instance .
* @param request the current servlet request
* @param p artName the name of the part to adapt to the { @link ServerHttpRequest } contract
* @param requestP artName the name of the part to adapt to the { @link ServerHttpRequest } contract
* @throws MissingServletRequestPartException if the request part cannot be found
* @throws MultipartException if MultipartHttpServletRequest cannot be initialized
* /
public RequestPartServletServerHttpRequest ( HttpServletRequest request , String p artName)
public RequestPartServletServerHttpRequest ( HttpServletRequest request , String requestP artName)
throws MissingServletRequestPartException {
super ( request ) ;
this . multipartRequest = MultipartResolutionDelegate . asMultipartHttpServletRequest ( request ) ;
this . partName = p artName;
this . requestPartName = requestP artName;
HttpHeaders h eaders = this . multipartRequest . getMultipartHeaders ( this . p artName) ;
if ( h eaders = = null ) {
throw new MissingServletRequestPartException ( p artName) ;
HttpHeaders multipartH eaders = this . multipartRequest . getMultipartHeaders ( this . requestP artName) ;
if ( multipartH eaders = = null ) {
throw new MissingServletRequestPartException ( requestP artName) ;
}
this . headers = h eaders;
this . multipartHeaders = multipartH eaders;
}
@Override
public HttpHeaders getHeaders ( ) {
return this . h eaders;
return this . multipartH eaders;
}
@Override
public InputStream getBody ( ) throws IOException {
if ( this . multipartRequest instanceof StandardMultipartHttpServletRequest ) {
try {
return this . multipartRequest . getPart ( this . partName ) . getInputStream ( ) ;
}
catch ( Exception ex ) {
throw new MultipartException ( "Could not parse multipart servlet request" , ex ) ;
// Prefer Servlet Part resolution to cover file as well as parameter streams
boolean servletParts = ( this . multipartRequest instanceof StandardMultipartHttpServletRequest ) ;
if ( servletParts ) {
Part part = retrieveServletPart ( ) ;
if ( part ! = null ) {
return part . getInputStream ( ) ;
}
}
else {
MultipartFile file = this . multipartRequest . getFile ( this . partName ) ;
if ( file ! = null ) {
return file . getInputStream ( ) ;
}
else {
String paramValue = this . multipartRequest . getParameter ( this . partName ) ;
return new ByteArrayInputStream ( paramValue . getBytes ( determineCharset ( ) ) ) ;
// Spring-style distinction between MultipartFile and String parameters
MultipartFile file = this . multipartRequest . getFile ( this . requestPartName ) ;
if ( file ! = null ) {
return file . getInputStream ( ) ;
}
String paramValue = this . multipartRequest . getParameter ( this . requestPartName ) ;
if ( paramValue ! = null ) {
return new ByteArrayInputStream ( paramValue . getBytes ( determineCharset ( ) ) ) ;
}
// Fallback: Servlet Part resolution even if not indicated
if ( ! servletParts ) {
Part part = retrieveServletPart ( ) ;
if ( part ! = null ) {
return part . getInputStream ( ) ;
}
}
throw new IllegalStateException ( "No body available for request part '" + this . requestPartName + "'" ) ;
}
@Nullable
private Part retrieveServletPart ( ) {
try {
return this . multipartRequest . getPart ( this . requestPartName ) ;
}
catch ( Exception ex ) {
throw new MultipartException ( "Failed to retrieve request part '" + this . requestPartName + "'" , ex ) ;
}
}
private Charset determineCharset ( ) {