From 72119ac076f52bfe5ec0f9d66a966d582254db49 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Wed, 3 Apr 2019 14:55:51 -0400 Subject: [PATCH] ProducesRequestCondition caches accepted media types Closes gh-22644 --- .../org/springframework/util/MimeTypeUtils.java | 2 +- .../result/condition/ProducesRequestCondition.java | 9 ++++++++- .../mvc/condition/ConsumesRequestCondition.java | 2 ++ .../mvc/condition/ProducesRequestCondition.java | 14 ++++++++++++-- 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/spring-core/src/main/java/org/springframework/util/MimeTypeUtils.java b/spring-core/src/main/java/org/springframework/util/MimeTypeUtils.java index c169aa22b3..428f08c33a 100644 --- a/spring-core/src/main/java/org/springframework/util/MimeTypeUtils.java +++ b/spring-core/src/main/java/org/springframework/util/MimeTypeUtils.java @@ -161,7 +161,7 @@ public abstract class MimeTypeUtils { private static final ConcurrentLruCache cachedMimeTypes = - new ConcurrentLruCache<>(32, MimeTypeUtils::parseMimeTypeInternal); + new ConcurrentLruCache<>(64, MimeTypeUtils::parseMimeTypeInternal); @Nullable private static volatile Random random; diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/condition/ProducesRequestCondition.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/condition/ProducesRequestCondition.java index 8ed2942210..6683372e80 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/condition/ProducesRequestCondition.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/condition/ProducesRequestCondition.java @@ -52,6 +52,8 @@ public final class ProducesRequestCondition extends AbstractRequestCondition mediaTypeAllList = Collections.singletonList(new ProduceMediaTypeExpression(MediaType.ALL_VALUE)); @@ -262,7 +264,12 @@ public final class ProducesRequestCondition extends AbstractRequestCondition getAcceptedMediaTypes(ServerWebExchange exchange) throws NotAcceptableStatusException { - return this.contentTypeResolver.resolveMediaTypes(exchange); + List 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) { diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/ConsumesRequestCondition.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/ConsumesRequestCondition.java index a956612a19..396e6bf052 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/ConsumesRequestCondition.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/ConsumesRequestCondition.java @@ -171,6 +171,8 @@ public final class ConsumesRequestCondition extends AbstractRequestCondition 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 expressions; @@ -266,8 +268,16 @@ public final class ProducesRequestCondition extends AbstractRequestCondition getAcceptedMediaTypes(HttpServletRequest request) throws HttpMediaTypeNotAcceptableException { - return this.contentNegotiationManager.resolveMediaTypes(new ServletWebRequest(request)); + @SuppressWarnings("unchecked") + private List getAcceptedMediaTypes(HttpServletRequest request) + throws HttpMediaTypeNotAcceptableException { + + List result = (List) 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) {