Suppress PREFLIGHT_AMBIGUOUS_MATCH if matches have no CORS config
Closes gh-26490
This commit is contained in:
@@ -407,20 +407,26 @@ public abstract class AbstractHandlerMethodMapping<T> extends AbstractHandlerMap
|
||||
logger.trace(matches.size() + " matching mappings: " + matches);
|
||||
}
|
||||
if (CorsUtils.isPreFlightRequest(request)) {
|
||||
return PREFLIGHT_AMBIGUOUS_MATCH;
|
||||
for (Match match : matches) {
|
||||
if (match.hasCorsConfig()) {
|
||||
return PREFLIGHT_AMBIGUOUS_MATCH;
|
||||
}
|
||||
}
|
||||
}
|
||||
Match secondBestMatch = matches.get(1);
|
||||
if (comparator.compare(bestMatch, secondBestMatch) == 0) {
|
||||
Method m1 = bestMatch.handlerMethod.getMethod();
|
||||
Method m2 = secondBestMatch.handlerMethod.getMethod();
|
||||
String uri = request.getRequestURI();
|
||||
throw new IllegalStateException(
|
||||
"Ambiguous handler methods mapped for '" + uri + "': {" + m1 + ", " + m2 + "}");
|
||||
else {
|
||||
Match secondBestMatch = matches.get(1);
|
||||
if (comparator.compare(bestMatch, secondBestMatch) == 0) {
|
||||
Method m1 = bestMatch.getHandlerMethod().getMethod();
|
||||
Method m2 = secondBestMatch.getHandlerMethod().getMethod();
|
||||
String uri = request.getRequestURI();
|
||||
throw new IllegalStateException(
|
||||
"Ambiguous handler methods mapped for '" + uri + "': {" + m1 + ", " + m2 + "}");
|
||||
}
|
||||
}
|
||||
}
|
||||
request.setAttribute(BEST_MATCHING_HANDLER_ATTRIBUTE, bestMatch.handlerMethod);
|
||||
request.setAttribute(BEST_MATCHING_HANDLER_ATTRIBUTE, bestMatch.getHandlerMethod());
|
||||
handleMatch(bestMatch.mapping, lookupPath, request);
|
||||
return bestMatch.handlerMethod;
|
||||
return bestMatch.getHandlerMethod();
|
||||
}
|
||||
else {
|
||||
return handleNoMatch(this.mappingRegistry.getRegistrations().keySet(), lookupPath, request);
|
||||
@@ -431,8 +437,7 @@ public abstract class AbstractHandlerMethodMapping<T> extends AbstractHandlerMap
|
||||
for (T mapping : mappings) {
|
||||
T match = getMatchingMapping(mapping, request);
|
||||
if (match != null) {
|
||||
matches.add(new Match(match,
|
||||
this.mappingRegistry.getRegistrations().get(mapping).getHandlerMethod()));
|
||||
matches.add(new Match(match, this.mappingRegistry.getRegistrations().get(mapping)));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -630,13 +635,14 @@ public abstract class AbstractHandlerMethodMapping<T> extends AbstractHandlerMap
|
||||
addMappingName(name, handlerMethod);
|
||||
}
|
||||
|
||||
CorsConfiguration config = initCorsConfiguration(handler, method, mapping);
|
||||
if (config != null) {
|
||||
config.validateAllowCredentials();
|
||||
this.corsLookup.put(handlerMethod, config);
|
||||
CorsConfiguration corsConfig = initCorsConfiguration(handler, method, mapping);
|
||||
if (corsConfig != null) {
|
||||
corsConfig.validateAllowCredentials();
|
||||
this.corsLookup.put(handlerMethod, corsConfig);
|
||||
}
|
||||
|
||||
this.registry.put(mapping, new MappingRegistration<>(mapping, handlerMethod, directPaths, name));
|
||||
this.registry.put(mapping,
|
||||
new MappingRegistration<>(mapping, handlerMethod, directPaths, name, corsConfig != null));
|
||||
}
|
||||
finally {
|
||||
this.readWriteLock.writeLock().unlock();
|
||||
@@ -735,8 +741,10 @@ public abstract class AbstractHandlerMethodMapping<T> extends AbstractHandlerMap
|
||||
@Nullable
|
||||
private final String mappingName;
|
||||
|
||||
private final boolean corsConfig;
|
||||
|
||||
public MappingRegistration(T mapping, HandlerMethod handlerMethod,
|
||||
@Nullable Set<String> directPaths, @Nullable String mappingName) {
|
||||
@Nullable Set<String> directPaths, @Nullable String mappingName, boolean corsConfig) {
|
||||
|
||||
Assert.notNull(mapping, "Mapping must not be null");
|
||||
Assert.notNull(handlerMethod, "HandlerMethod must not be null");
|
||||
@@ -744,6 +752,7 @@ public abstract class AbstractHandlerMethodMapping<T> extends AbstractHandlerMap
|
||||
this.handlerMethod = handlerMethod;
|
||||
this.directPaths = (directPaths != null ? directPaths : Collections.emptySet());
|
||||
this.mappingName = mappingName;
|
||||
this.corsConfig = corsConfig;
|
||||
}
|
||||
|
||||
public T getMapping() {
|
||||
@@ -762,6 +771,10 @@ public abstract class AbstractHandlerMethodMapping<T> extends AbstractHandlerMap
|
||||
public String getMappingName() {
|
||||
return this.mappingName;
|
||||
}
|
||||
|
||||
public boolean hasCorsConfig() {
|
||||
return this.corsConfig;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -773,11 +786,23 @@ public abstract class AbstractHandlerMethodMapping<T> extends AbstractHandlerMap
|
||||
|
||||
private final T mapping;
|
||||
|
||||
private final HandlerMethod handlerMethod;
|
||||
private final MappingRegistration<T> registration;
|
||||
|
||||
public Match(T mapping, HandlerMethod handlerMethod) {
|
||||
public Match(T mapping, MappingRegistration<T> registration) {
|
||||
this.mapping = mapping;
|
||||
this.handlerMethod = handlerMethod;
|
||||
this.registration = registration;
|
||||
}
|
||||
|
||||
public T getMapping() {
|
||||
return this.mapping;
|
||||
}
|
||||
|
||||
public HandlerMethod getHandlerMethod() {
|
||||
return this.registration.getHandlerMethod();
|
||||
}
|
||||
|
||||
public boolean hasCorsConfig() {
|
||||
return this.registration.hasCorsConfig();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user