Improve ContentCachingRequestWrapper performance

This commit improves the performance of `read` method variants
to write to the cache in an optimized way.

Issue: SPR-15762
master
zilong6 6 years ago committed by Brian Clozel
parent 2ac6a15f6f
commit 4d0800f392
  1. 51
      spring-web/src/main/java/org/springframework/web/util/ContentCachingRequestWrapper.java

@ -213,6 +213,57 @@ public class ContentCachingRequestWrapper extends HttpServletRequestWrapper {
this.is = is;
}
@Override
public int readLine(final byte[] b, final int off, final int len) throws IOException {
int count = is.readLine(b, off, len);
cache(b, off, count);
return count;
}
private void cache(final byte[] b, final int off, final int count) {
if (contentCacheLimit != null && cachedContent.size() == contentCacheLimit) {
this.overflow = true;
handleContentOverflow(contentCacheLimit);
} else {
int sizeToCache = contentCacheLimit == null || count + cachedContent.size() < contentCacheLimit
? count
: contentCacheLimit - cachedContent.size();
cachedContent.write(b, off, sizeToCache);
if (sizeToCache < count) {
this.overflow = true;
handleContentOverflow(contentCacheLimit);
}
}
}
@Override
public int read(final byte[] b) throws IOException {
int count = super.read(b);
if (!this.overflow && count > 0) {
if (contentCacheLimit != null && cachedContent.size() == contentCacheLimit) {
this.overflow = true;
handleContentOverflow(contentCacheLimit);
} else {
int sizeToCache = contentCacheLimit == null || count + cachedContent.size() < contentCacheLimit
? count
: contentCacheLimit - cachedContent.size();
cachedContent.write(b, 0, sizeToCache);
if (sizeToCache < count) {
this.overflow = true;
handleContentOverflow(contentCacheLimit);
}
}
}
return count;
}
@Override
public int read(final byte[] b, final int off, final int len) throws IOException {
int count = is.read(b, off, len);
cache(b, off, count);
return count;
}
@Override
public int read() throws IOException {
int ch = this.is.read();

Loading…
Cancel
Save