Optimize initial buffer size in ContentCachingRequestWrapper
Prior to this commit, the initial buffer size for content caching allocated in `ContentCachingRequestWrapper` would be: * the request content length, if available in request headers * the cache limit size as configured on the wrapper The latter is really an upper bound and should not be considered as a good default in most cases. This commit ensures that the request content length is still used if available, but uses a default 1024 size if it's not. While this change will probably cause more reallocations as the buffer grows, this will avoid large allocations in many cases and should overall help with GC. Closes gh-29775
This commit is contained in:
@@ -56,6 +56,8 @@ import org.springframework.lang.Nullable;
|
||||
*/
|
||||
public class ContentCachingRequestWrapper extends HttpServletRequestWrapper {
|
||||
|
||||
private static final int DEFAULT_BUFFER_SIZE = 1024;
|
||||
|
||||
private final ByteArrayOutputStream cachedContent;
|
||||
|
||||
@Nullable
|
||||
@@ -75,7 +77,8 @@ public class ContentCachingRequestWrapper extends HttpServletRequestWrapper {
|
||||
public ContentCachingRequestWrapper(HttpServletRequest request) {
|
||||
super(request);
|
||||
int contentLength = request.getContentLength();
|
||||
this.cachedContent = new ByteArrayOutputStream(contentLength >= 0 ? contentLength : 1024);
|
||||
this.cachedContent = new ByteArrayOutputStream(contentLength >= 0 ?
|
||||
contentLength : DEFAULT_BUFFER_SIZE);
|
||||
this.contentCacheLimit = null;
|
||||
}
|
||||
|
||||
@@ -88,7 +91,9 @@ public class ContentCachingRequestWrapper extends HttpServletRequestWrapper {
|
||||
*/
|
||||
public ContentCachingRequestWrapper(HttpServletRequest request, int contentCacheLimit) {
|
||||
super(request);
|
||||
this.cachedContent = new ByteArrayOutputStream(contentCacheLimit);
|
||||
int contentLength = request.getContentLength();
|
||||
int initialBufferSize = contentLength >= 0 ? contentLength : DEFAULT_BUFFER_SIZE;
|
||||
this.cachedContent = new ByteArrayOutputStream(Math.min(initialBufferSize, contentCacheLimit));
|
||||
this.contentCacheLimit = contentCacheLimit;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user