Method level only, empty RequestMapping matches "" and "/"

Closes gh-30293
This commit is contained in:
rstoyanchev
2023-06-12 16:09:49 +01:00
parent 3fb98b6a97
commit bbab4faf7a
7 changed files with 53 additions and 15 deletions

View File

@@ -89,8 +89,12 @@ public final class PatternsRequestCondition extends AbstractRequestCondition<Pat
return " || ";
}
private boolean isEmptyPathMapping() {
return this.patterns == EMPTY_PATH_PATTERN;
/**
* Whether the condition is the "" (empty path) mapping.
* @since 6.0.10
*/
public boolean isEmptyPathMapping() {
return (this.patterns == EMPTY_PATH_PATTERN);
}
/**

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2022 the original author or authors.
* Copyright 2002-2023 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -153,6 +153,9 @@ public class RequestMappingHandlerMapping extends RequestMappingInfoHandlerMappi
if (typeInfo != null) {
info = typeInfo.combine(info);
}
if (info.getPatternsCondition().isEmptyPathMapping()) {
info = info.mutate().paths("", "/").options(this.config).build();
}
for (Map.Entry<String, Predicate<Class<?>>> entry : this.pathPrefixes.entrySet()) {
if (entry.getValue().test(handlerType)) {
String prefix = entry.getKey();

View File

@@ -61,6 +61,17 @@ class RequestMappingIntegrationTests extends AbstractRequestMappingIntegrationTe
}
@ParameterizedHttpServerTest // gh-30293
void emptyMapping(HttpServer httpServer) throws Exception {
startServer(httpServer);
String url = "http://localhost:" + this.port;
assertThat(getRestTemplate().getForObject(url, String.class)).isEqualTo("root");
url += "/";
assertThat(getRestTemplate().getForObject(url, String.class)).isEqualTo("root");
}
@ParameterizedHttpServerTest
void httpHead(HttpServer httpServer) throws Exception {
startServer(httpServer);
@@ -106,6 +117,11 @@ class RequestMappingIntegrationTests extends AbstractRequestMappingIntegrationTe
@SuppressWarnings("unused")
private static class TestRestController {
@GetMapping
public String get() {
return "root";
}
@GetMapping("/text")
public String textGet() {
return "Foo";