ProducesRequestCondition caches accepted media types

Closes gh-22644
This commit is contained in:
Rossen Stoyanchev
2019-04-03 14:55:51 -04:00
parent 254f06e1a1
commit 72119ac076
4 changed files with 23 additions and 4 deletions

View File

@@ -161,7 +161,7 @@ public abstract class MimeTypeUtils {
private static final ConcurrentLruCache<String, MimeType> cachedMimeTypes =
new ConcurrentLruCache<>(32, MimeTypeUtils::parseMimeTypeInternal);
new ConcurrentLruCache<>(64, MimeTypeUtils::parseMimeTypeInternal);
@Nullable
private static volatile Random random;

View File

@@ -52,6 +52,8 @@ public final class ProducesRequestCondition extends AbstractRequestCondition<Pro
private static final ProducesRequestCondition EMPTY_CONDITION = new ProducesRequestCondition();
private static final String MEDIA_TYPES_ATTRIBUTE = ProducesRequestCondition.class.getName() + ".MEDIA_TYPES";
private final List<ProduceMediaTypeExpression> mediaTypeAllList =
Collections.singletonList(new ProduceMediaTypeExpression(MediaType.ALL_VALUE));
@@ -262,7 +264,12 @@ public final class ProducesRequestCondition extends AbstractRequestCondition<Pro
}
private List<MediaType> getAcceptedMediaTypes(ServerWebExchange exchange) throws NotAcceptableStatusException {
return this.contentTypeResolver.resolveMediaTypes(exchange);
List<MediaType> result = exchange.getAttribute(MEDIA_TYPES_ATTRIBUTE);
if (result == null) {
result = this.contentTypeResolver.resolveMediaTypes(exchange);
exchange.getAttributes().put(MEDIA_TYPES_ATTRIBUTE, result);
}
return result;
}
private int indexOfEqualMediaType(MediaType mediaType) {

View File

@@ -171,6 +171,8 @@ public final class ConsumesRequestCondition extends AbstractRequestCondition<Con
return this;
}
// Common media types are cached at the level of MimeTypeUtils
MediaType contentType;
try {
contentType = (StringUtils.hasLength(request.getContentType()) ?

View File

@@ -56,6 +56,8 @@ public final class ProducesRequestCondition extends AbstractRequestCondition<Pro
private static final List<ProduceMediaTypeExpression> MEDIA_TYPE_ALL_LIST =
Collections.singletonList(new ProduceMediaTypeExpression(MediaType.ALL_VALUE));
private static final String MEDIA_TYPES_ATTRIBUTE = ProducesRequestCondition.class.getName() + ".MEDIA_TYPES";
private final List<ProduceMediaTypeExpression> expressions;
@@ -266,8 +268,16 @@ public final class ProducesRequestCondition extends AbstractRequestCondition<Pro
}
}
private List<MediaType> getAcceptedMediaTypes(HttpServletRequest request) throws HttpMediaTypeNotAcceptableException {
return this.contentNegotiationManager.resolveMediaTypes(new ServletWebRequest(request));
@SuppressWarnings("unchecked")
private List<MediaType> getAcceptedMediaTypes(HttpServletRequest request)
throws HttpMediaTypeNotAcceptableException {
List<MediaType> result = (List<MediaType>) request.getAttribute(MEDIA_TYPES_ATTRIBUTE);
if (result == null) {
result = this.contentNegotiationManager.resolveMediaTypes(new ServletWebRequest(request));
request.setAttribute(MEDIA_TYPES_ATTRIBUTE, result);
}
return result;
}
private int indexOfEqualMediaType(MediaType mediaType) {