From 27a26e11b0932284ae720610f25f9648b4b0736c Mon Sep 17 00:00:00 2001 From: Shivam Tyagi1 Date: Tue, 20 Dec 2022 16:02:45 +0530 Subject: [PATCH] Adding capability to take max upload size per request. --- .../commons/fileupload/FileUploadBase.java | 21 ++++++++++++++----- .../servlet/ServletRequestContext.java | 9 ++++++++ 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/apache/commons/fileupload/FileUploadBase.java b/src/main/java/org/apache/commons/fileupload/FileUploadBase.java index aaad4d2d4e..01eff9664f 100644 --- a/src/main/java/org/apache/commons/fileupload/FileUploadBase.java +++ b/src/main/java/org/apache/commons/fileupload/FileUploadBase.java @@ -205,6 +205,16 @@ public long getSizeMax() { return sizeMax; } + /** + * Gets allowed max size for current upload, subclasses can override this method + * to calculate allowed size per request + * @param ctx requestContext - provides information related to current upload request. + * @return max size allowed for current request + */ + public long getSizeMaxForThisRequest(RequestContext ctx) { + return sizeMax; + } + /** * Sets the maximum allowed size of a complete request, as opposed * to {@link #setFileSizeMax(long)}. @@ -969,15 +979,16 @@ public void setHeaders(FileItemHeaders pHeaders) { // CHECKSTYLE:ON InputStream input; // N.B. this is eventually closed in MultipartStream processing - if (sizeMax >= 0) { - if (requestSize != -1 && requestSize > sizeMax) { + long sizeMaxForThisRequest = getSizeMaxForThisRequest(ctx); + if (sizeMaxForThisRequest >= 0) { + if (requestSize != -1 && requestSize > sizeMaxForThisRequest) { throw new SizeLimitExceededException( format("the request was rejected because its size (%s) exceeds the configured maximum (%s)", - Long.valueOf(requestSize), Long.valueOf(sizeMax)), - requestSize, sizeMax); + Long.valueOf(requestSize), Long.valueOf(sizeMaxForThisRequest)), + requestSize, sizeMaxForThisRequest); } // N.B. this is eventually closed in MultipartStream processing - input = new LimitedInputStream(ctx.getInputStream(), sizeMax) { + input = new LimitedInputStream(ctx.getInputStream(), sizeMaxForThisRequest) { @Override protected void raiseError(long pSizeMax, long pCount) throws IOException { diff --git a/src/main/java/org/apache/commons/fileupload/servlet/ServletRequestContext.java b/src/main/java/org/apache/commons/fileupload/servlet/ServletRequestContext.java index b962734dbc..90e461f667 100644 --- a/src/main/java/org/apache/commons/fileupload/servlet/ServletRequestContext.java +++ b/src/main/java/org/apache/commons/fileupload/servlet/ServletRequestContext.java @@ -127,4 +127,13 @@ public String toString() { this.getContentType()); } + /** + * Gets underlying HttpServletRequest, this method can be used in subclasses of @{@link FileUploadBase} + * while adding support for max upload size per request. + * @return + */ + public HttpServletRequest getRequest(){ + return this.request; + } + }