More optimal RequestMethod condition lookup

See gh-22644
This commit is contained in:
Rossen Stoyanchev 2019-08-22 13:39:04 +03:00
parent 86c734785d
commit 1d2ebdeb8c
2 changed files with 24 additions and 21 deletions

View File

@ -42,12 +42,13 @@ import org.springframework.web.server.ServerWebExchange;
public final class RequestMethodsRequestCondition extends AbstractRequestCondition<RequestMethodsRequestCondition> { public final class RequestMethodsRequestCondition extends AbstractRequestCondition<RequestMethodsRequestCondition> {
/** Per HTTP method cache to return ready instances from getMatchingCondition. */ /** Per HTTP method cache to return ready instances from getMatchingCondition. */
private static final Map<String, RequestMethodsRequestCondition> requestMethodConditionCache; private static final Map<HttpMethod, RequestMethodsRequestCondition> requestMethodConditionCache;
static { static {
requestMethodConditionCache = new HashMap<>(RequestMethod.values().length); requestMethodConditionCache = new HashMap<>(RequestMethod.values().length);
for (RequestMethod method : RequestMethod.values()) { for (RequestMethod method : RequestMethod.values()) {
requestMethodConditionCache.put(method.name(), new RequestMethodsRequestCondition(method)); requestMethodConditionCache.put(
HttpMethod.valueOf(method.name()), new RequestMethodsRequestCondition(method));
} }
} }
@ -123,7 +124,7 @@ public final class RequestMethodsRequestCondition extends AbstractRequestConditi
} }
return this; return this;
} }
return matchRequestMethod(exchange.getRequest().getMethodValue()); return matchRequestMethod(exchange.getRequest().getMethod());
} }
/** /**
@ -137,20 +138,20 @@ public final class RequestMethodsRequestCondition extends AbstractRequestConditi
return this; return this;
} }
HttpMethod expectedMethod = request.getHeaders().getAccessControlRequestMethod(); HttpMethod expectedMethod = request.getHeaders().getAccessControlRequestMethod();
return expectedMethod != null ? matchRequestMethod(expectedMethod.name()) : null; return expectedMethod != null ? matchRequestMethod(expectedMethod) : null;
} }
@Nullable @Nullable
private RequestMethodsRequestCondition matchRequestMethod(@Nullable String httpMethod) { private RequestMethodsRequestCondition matchRequestMethod(@Nullable HttpMethod httpMethod) {
if (httpMethod != null) { if (httpMethod == null) {
for (RequestMethod method : getMethods()) { return null;
if (httpMethod.matches(method.name())) {
return requestMethodConditionCache.get(method.name());
} }
RequestMethod requestMethod = RequestMethod.valueOf(httpMethod.name());
if (getMethods().contains(requestMethod)) {
return requestMethodConditionCache.get(httpMethod);
} }
if (HttpMethod.HEAD.matches(httpMethod) && getMethods().contains(RequestMethod.GET)) { if (requestMethod.equals(RequestMethod.HEAD) && getMethods().contains(RequestMethod.GET)) {
return requestMethodConditionCache.get(HttpMethod.GET.name()); return requestMethodConditionCache.get(HttpMethod.GET);
}
} }
return null; return null;
} }

View File

@ -142,17 +142,19 @@ public final class RequestMethodsRequestCondition extends AbstractRequestConditi
@Nullable @Nullable
private RequestMethodsRequestCondition matchRequestMethod(String httpMethodValue) { private RequestMethodsRequestCondition matchRequestMethod(String httpMethodValue) {
HttpMethod httpMethod = HttpMethod.resolve(httpMethodValue); RequestMethod requestMethod;
if (httpMethod != null) { try {
for (RequestMethod method : getMethods()) { requestMethod = RequestMethod.valueOf(httpMethodValue);
if (httpMethod.matches(method.name())) { if (getMethods().contains(requestMethod)) {
return requestMethodConditionCache.get(method.name()); return requestMethodConditionCache.get(httpMethodValue);
} }
} if (requestMethod.equals(RequestMethod.HEAD) && getMethods().contains(RequestMethod.GET)) {
if (httpMethod == HttpMethod.HEAD && getMethods().contains(RequestMethod.GET)) {
return requestMethodConditionCache.get(HttpMethod.GET.name()); return requestMethodConditionCache.get(HttpMethod.GET.name());
} }
} }
catch (IllegalArgumentException ex) {
// Custom request method
}
return null; return null;
} }