486394 - MultipartConfig.fileSizeThreshold default of 0 should always create a file

+ Refactored fileSizeThreshold logic so that a configuration value of
   0 is always create file
   (negative) is never create file
   positive is tested against filesize
This commit is contained in:
Joakim Erdfelt 2016-01-22 14:07:51 -07:00
parent 288f2e1f51
commit 734d18fb93
1 changed files with 28 additions and 2 deletions

View File

@ -40,6 +40,7 @@ import java.util.List;
import java.util.Locale;
import javax.servlet.MultipartConfigElement;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.http.Part;
import org.eclipse.jetty.util.log.Log;
@ -112,7 +113,7 @@ public class MultiPartInputStreamParser
if (MultiPartInputStreamParser.this._config.getMaxFileSize() > 0 && _size + 1 > MultiPartInputStreamParser.this._config.getMaxFileSize())
throw new IllegalStateException ("Multipart Mime part "+_name+" exceeds max filesize");
if (MultiPartInputStreamParser.this._config.getFileSizeThreshold() > 0 && _size + 1 > MultiPartInputStreamParser.this._config.getFileSizeThreshold() && _file==null)
if (_file == null && MultiPartInputStreamParser.this.isFileNeeded(_size + 1))
createFile();
_out.write(b);
@ -125,7 +126,7 @@ public class MultiPartInputStreamParser
if (MultiPartInputStreamParser.this._config.getMaxFileSize() > 0 && _size + length > MultiPartInputStreamParser.this._config.getMaxFileSize())
throw new IllegalStateException ("Multipart Mime part "+_name+" exceeds max filesize");
if (MultiPartInputStreamParser.this._config.getFileSizeThreshold() > 0 && _size + length > MultiPartInputStreamParser.this._config.getFileSizeThreshold() && _file==null)
if (_file == null && MultiPartInputStreamParser.this.isFileNeeded(_size + length))
createFile();
_out.write(bytes, offset, length);
@ -429,6 +430,31 @@ public class MultiPartInputStreamParser
}
/**
* Test to determine if the file content sizes exceeds the {@link MultipartConfig#fileSizeThreshold()}
* necessary to produce a file on disk
* <p>
* Configured {@link MultipartConfig#fileSizeThreshold()} of <code>0</code> is always true, negative is always false,
* all other configurations are tested against <code>size</code> parameter
*
* @param size the file size to test against.
* @return true if file is needed, false otherwise
*/
protected boolean isFileNeeded(long size)
{
if (_config.getFileSizeThreshold() < 0)
{
// Negative file size threshold means no file, ever
return false;
}
if (_config.getFileSizeThreshold() == 0)
{
// 0 means always create a file
return true;
}
return size > _config.getFileSizeThreshold();
}
/**
* Parse, if necessary, the multipart stream.
*