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> {
/** 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 {
requestMethodConditionCache = new HashMap<>(RequestMethod.values().length);
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 matchRequestMethod(exchange.getRequest().getMethodValue());
return matchRequestMethod(exchange.getRequest().getMethod());
}
/**
@ -137,20 +138,20 @@ public final class RequestMethodsRequestCondition extends AbstractRequestConditi
return this;
}
HttpMethod expectedMethod = request.getHeaders().getAccessControlRequestMethod();
return expectedMethod != null ? matchRequestMethod(expectedMethod.name()) : null;
return expectedMethod != null ? matchRequestMethod(expectedMethod) : null;
}
@Nullable
private RequestMethodsRequestCondition matchRequestMethod(@Nullable String httpMethod) {
if (httpMethod != null) {
for (RequestMethod method : getMethods()) {
if (httpMethod.matches(method.name())) {
return requestMethodConditionCache.get(method.name());
}
}
if (HttpMethod.HEAD.matches(httpMethod) && getMethods().contains(RequestMethod.GET)) {
return requestMethodConditionCache.get(HttpMethod.GET.name());
}
private RequestMethodsRequestCondition matchRequestMethod(@Nullable HttpMethod httpMethod) {
if (httpMethod == null) {
return null;
}
RequestMethod requestMethod = RequestMethod.valueOf(httpMethod.name());
if (getMethods().contains(requestMethod)) {
return requestMethodConditionCache.get(httpMethod);
}
if (requestMethod.equals(RequestMethod.HEAD) && getMethods().contains(RequestMethod.GET)) {
return requestMethodConditionCache.get(HttpMethod.GET);
}
return null;
}

View File

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