Browse Source

Update contribution

Closes gh-35273
pull/35329/head
rstoyanchev 4 months ago
parent
commit
8f1ade55d9
  1. 66
      spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/InterceptorRegistration.java
  2. 137
      spring-webmvc/src/main/java/org/springframework/web/servlet/handler/MappedInterceptor.java
  3. 128
      spring-webmvc/src/test/java/org/springframework/web/servlet/handler/MappedInterceptorTests.java

66
spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/InterceptorRegistration.java

@ -83,8 +83,9 @@ public class InterceptorRegistration {
* @since 5.0.3 * @since 5.0.3
*/ */
public InterceptorRegistration addPathPatterns(List<String> patterns) { public InterceptorRegistration addPathPatterns(List<String> patterns) {
this.includePatterns = (this.includePatterns != null ? if (this.includePatterns == null) {
this.includePatterns : new ArrayList<>(patterns.size())); this.includePatterns = new ArrayList<>(patterns.size());
}
this.includePatterns.addAll(patterns); this.includePatterns.addAll(patterns);
return this; return this;
} }
@ -105,16 +106,16 @@ public class InterceptorRegistration {
* @since 5.0.3 * @since 5.0.3
*/ */
public InterceptorRegistration excludePathPatterns(List<String> patterns) { public InterceptorRegistration excludePathPatterns(List<String> patterns) {
this.excludePatterns = (this.excludePatterns != null ? if (this.excludePatterns == null) {
this.excludePatterns : new ArrayList<>(patterns.size())); this.excludePatterns = new ArrayList<>(patterns.size());
}
this.excludePatterns.addAll(patterns); this.excludePatterns.addAll(patterns);
return this; return this;
} }
/** /**
* Add HTTP methods the interceptor should be included for. * Add HTTP methods for requests the interceptor should be included in.
* <p>Only requests with these HTTP methods will be intercepted. * @since 7.0
* @since 7.0.x
*/ */
public InterceptorRegistration includeHttpMethods(HttpMethod... httpMethods) { public InterceptorRegistration includeHttpMethods(HttpMethod... httpMethods) {
return includeHttpMethods(Arrays.asList(httpMethods)); return includeHttpMethods(Arrays.asList(httpMethods));
@ -122,31 +123,33 @@ public class InterceptorRegistration {
/** /**
* List-based variant of {@link #includeHttpMethods(HttpMethod...)}. * List-based variant of {@link #includeHttpMethods(HttpMethod...)}.
* @since 7.0.x * @since 7.0
*/ */
public InterceptorRegistration includeHttpMethods(List<HttpMethod> httpMethods) { public InterceptorRegistration includeHttpMethods(List<HttpMethod> httpMethods) {
this.includeHttpMethods = (this.includeHttpMethods != null ? if (this.includeHttpMethods == null) {
this.includeHttpMethods : new ArrayList<>(httpMethods.size())); this.includeHttpMethods = new ArrayList<>(httpMethods.size());
}
this.includeHttpMethods.addAll(httpMethods); this.includeHttpMethods.addAll(httpMethods);
return this; return this;
} }
/** /**
* Add HTTP methods the interceptor should be excluded from. * Add HTTP methods for requests the interceptor should be excluded from.
* <p>Requests with these HTTP methods will be ignored by the interceptor. * <p>Requests with these HTTP methods will be ignored by the interceptor.
* @since 7.0.x * @since 7.0
*/ */
public InterceptorRegistration excludeHttpMethods(HttpMethod... httpMethods){ public InterceptorRegistration excludeHttpMethods(HttpMethod... httpMethods) {
return this.excludeHttpMethods(Arrays.asList(httpMethods)); return excludeHttpMethods(Arrays.asList(httpMethods));
} }
/** /**
* List-based variant of {@link #excludeHttpMethods(HttpMethod...)}. * List-based variant of {@link #excludeHttpMethods(HttpMethod...)}.
* @since 7.0.x * @since 7.0
*/ */
public InterceptorRegistration excludeHttpMethods(List<HttpMethod> httpMethods){ public InterceptorRegistration excludeHttpMethods(List<HttpMethod> httpMethods) {
this.excludeHttpMethods = (this.excludeHttpMethods != null ? if (this.excludeHttpMethods == null) {
this.excludeHttpMethods : new ArrayList<>(httpMethods.size())); this.excludeHttpMethods = new ArrayList<>(httpMethods.size());
}
this.excludeHttpMethods.addAll(httpMethods); this.excludeHttpMethods.addAll(httpMethods);
return this; return this;
} }
@ -175,7 +178,7 @@ public class InterceptorRegistration {
* Specify an order position to be used. Default is 0. * Specify an order position to be used. Default is 0.
* @since 4.3.23 * @since 4.3.23
*/ */
public InterceptorRegistration order(int order){ public InterceptorRegistration order(int order) {
this.order = order; this.order = order;
return this; return this;
} }
@ -194,27 +197,18 @@ public class InterceptorRegistration {
@SuppressWarnings("removal") @SuppressWarnings("removal")
protected Object getInterceptor() { protected Object getInterceptor() {
if (this.includePatterns == null && this.excludePatterns == null && this.includeHttpMethods == null && this.excludeHttpMethods == null) { if (this.includePatterns == null && this.excludePatterns == null &&
this.includeHttpMethods == null && this.excludeHttpMethods == null) {
return this.interceptor; return this.interceptor;
} }
HttpMethod[] includeMethodsArray = (this.includeHttpMethods != null) ?
this.includeHttpMethods.toArray(new HttpMethod[0]) : null;
HttpMethod[] excludeMethodsArray = (this.excludeHttpMethods != null) ?
this.excludeHttpMethods.toArray(new HttpMethod[0]) : null;
String[] includePattersArray = StringUtils.toStringArray(this.includePatterns);
String[] excludePattersArray = StringUtils.toStringArray(this.excludePatterns);
MappedInterceptor mappedInterceptor = new MappedInterceptor( MappedInterceptor mappedInterceptor = new MappedInterceptor(
includePattersArray, StringUtils.toStringArray(this.includePatterns),
excludePattersArray, StringUtils.toStringArray(this.excludePatterns),
includeMethodsArray, (this.includeHttpMethods != null) ? this.includeHttpMethods.toArray(new HttpMethod[0]) : null,
excludeMethodsArray, (this.excludeHttpMethods != null) ? this.excludeHttpMethods.toArray(new HttpMethod[0]) : null,
this.interceptor); this.interceptor, null);
if (this.pathMatcher != null) { if (this.pathMatcher != null) {
mappedInterceptor.setPathMatcher(this.pathMatcher); mappedInterceptor.setPathMatcher(this.pathMatcher);

137
spring-webmvc/src/main/java/org/springframework/web/servlet/handler/MappedInterceptor.java

@ -68,9 +68,9 @@ public final class MappedInterceptor implements HandlerInterceptor {
private final PatternAdapter @Nullable [] excludePatterns; private final PatternAdapter @Nullable [] excludePatterns;
private final MethodAdapter @Nullable [] includeHttpMethods; private final HttpMethod @Nullable [] includeHttpMethods;
private final MethodAdapter @Nullable [] excludeHttpMethods; private final HttpMethod @Nullable [] excludeHttpMethods;
private PathMatcher pathMatcher = defaultPathMatcher; private PathMatcher pathMatcher = defaultPathMatcher;
@ -78,45 +78,48 @@ public final class MappedInterceptor implements HandlerInterceptor {
/** /**
* Create an instance with the given include and exclude patterns along with * Create an instance with the given include and exclude patterns and HTTP methods.
* the target interceptor for the mappings. * @param includePatterns patterns to match, or null to match all paths
* @param includePatterns patterns to which requests must match, or null to * @param excludePatterns patterns for which requests must not match
* match all paths * @param includeHttpMethods the HTTP methods to match, or null for all methods
* @param excludePatterns patterns to which requests must not match * @param excludeHttpMethods the ßHTTP methods to which requests must not match
* @param includeHttpMethods http methods to which request must match, or null to match all paths
* @param excludeHttpMethods http methods to which request must not match
* @param interceptor the target interceptor * @param interceptor the target interceptor
* @param parser a parser to use to pre-parse patterns into {@link PathPattern}; * @param parser a parser to use to pre-parse patterns into {@link PathPattern};
* when not provided, {@link PathPatternParser#defaultInstance} is used. * when not provided, {@link PathPatternParser#defaultInstance} is used.
* @since 5.3 * @since 7.0
*/ */
public MappedInterceptor(String @Nullable [] includePatterns, String @Nullable [] excludePatterns, HttpMethod @Nullable [] includeHttpMethods, HttpMethod @Nullable [] excludeHttpMethods, public MappedInterceptor(String @Nullable [] includePatterns, String @Nullable [] excludePatterns,
HttpMethod @Nullable [] includeHttpMethods, HttpMethod @Nullable [] excludeHttpMethods,
HandlerInterceptor interceptor, @Nullable PathPatternParser parser) { HandlerInterceptor interceptor, @Nullable PathPatternParser parser) {
this.includePatterns = PatternAdapter.initPatterns(includePatterns, parser); this.includePatterns = PatternAdapter.initPatterns(includePatterns, parser);
this.excludePatterns = PatternAdapter.initPatterns(excludePatterns, parser); this.excludePatterns = PatternAdapter.initPatterns(excludePatterns, parser);
this.includeHttpMethods = MethodAdapter.initHttpMethods(includeHttpMethods); this.includeHttpMethods = includeHttpMethods;
this.excludeHttpMethods = MethodAdapter.initHttpMethods(excludeHttpMethods); this.excludeHttpMethods = excludeHttpMethods;
this.interceptor = interceptor; this.interceptor = interceptor;
} }
/** /**
* Variant of * Variation of
* {@link #MappedInterceptor(String[], String[], HttpMethod[], HttpMethod[], HandlerInterceptor, PathPatternParser)} * {@link #MappedInterceptor(String[], String[], HttpMethod[], HttpMethod[], HandlerInterceptor, PathPatternParser)}
* with include patterns only. * without HTTP methods.
* @since 5.3
* @deprecated in favor of the constructor variant with HTTP methods
*/ */
public MappedInterceptor(String @Nullable [] includePatterns, HandlerInterceptor interceptor) { @Deprecated(since = "7.0", forRemoval = true)
this(includePatterns, null, null, null, interceptor); public MappedInterceptor(String @Nullable [] includePatterns, String @Nullable [] excludePatterns,
HandlerInterceptor interceptor, @Nullable PathPatternParser parser) {
this(includePatterns, excludePatterns, null, null, interceptor, parser);
} }
/** /**
* Variant of * Variant of
* {@link #MappedInterceptor(String[], String[], HttpMethod[], HttpMethod[], HandlerInterceptor, PathPatternParser)} * {@link #MappedInterceptor(String[], String[], HttpMethod[], HttpMethod[], HandlerInterceptor, PathPatternParser)}
* with include methods only. * with include patterns only.
*/ */
public MappedInterceptor(HttpMethod @Nullable [] includeHttpMethods, HandlerInterceptor interceptor) { public MappedInterceptor(String @Nullable [] includePatterns, HandlerInterceptor interceptor) {
this(null, null, includeHttpMethods, null, interceptor); this(includePatterns, null, null, null, interceptor, null);
} }
/** /**
@ -124,10 +127,10 @@ public final class MappedInterceptor implements HandlerInterceptor {
* {@link #MappedInterceptor(String[], String[], HttpMethod[], HttpMethod[], HandlerInterceptor, PathPatternParser)} * {@link #MappedInterceptor(String[], String[], HttpMethod[], HttpMethod[], HandlerInterceptor, PathPatternParser)}
* without a provided parser. * without a provided parser.
*/ */
public MappedInterceptor(String @Nullable [] includePatterns, String @Nullable [] excludePatterns, HttpMethod @Nullable [] includeHttpMethods, HttpMethod @Nullable [] excludeHttpMethods, public MappedInterceptor(String @Nullable [] includePatterns, String @Nullable [] excludePatterns,
HandlerInterceptor interceptor) { HandlerInterceptor interceptor) {
this(includePatterns, excludePatterns,includeHttpMethods,excludeHttpMethods, interceptor, null); this(includePatterns, excludePatterns, null, null, interceptor, null);
} }
/** /**
@ -136,26 +139,18 @@ public final class MappedInterceptor implements HandlerInterceptor {
* with a {@link WebRequestInterceptor} as the target. * with a {@link WebRequestInterceptor} as the target.
*/ */
public MappedInterceptor(String @Nullable [] includePatterns, WebRequestInterceptor interceptor) { public MappedInterceptor(String @Nullable [] includePatterns, WebRequestInterceptor interceptor) {
this(includePatterns, null,null,null, interceptor); this(includePatterns, null, interceptor);
}
/**
* Variant of
* {@link #MappedInterceptor(String[], String[], HttpMethod[], HttpMethod[], HandlerInterceptor, PathPatternParser)}
* with a {@link WebRequestInterceptor} as the target.
*/
public MappedInterceptor(HttpMethod @Nullable [] includeHttpMethods, WebRequestInterceptor interceptor) {
this(null, null,includeHttpMethods ,null, interceptor);
} }
/** /**
* Variant of * Variant of
* {@link #MappedInterceptor(String[], String[], HttpMethod[], HttpMethod[] , HandlerInterceptor, PathPatternParser)} * {@link #MappedInterceptor(String[], String[], HttpMethod[], HttpMethod[], HandlerInterceptor, PathPatternParser)}
* with a {@link WebRequestInterceptor} as the target. * with a {@link WebRequestInterceptor} as the target.
*/ */
public MappedInterceptor(String @Nullable [] includePatterns, String @Nullable [] excludePatterns, HttpMethod @Nullable [] includeHttpMethods, HttpMethod @Nullable [] excludeHttpMethods, public MappedInterceptor(String @Nullable [] includePatterns, String @Nullable [] excludePatterns,
WebRequestInterceptor interceptor) { WebRequestInterceptor interceptor) {
this(includePatterns, excludePatterns,includeHttpMethods,excludeHttpMethods, new WebRequestHandlerInterceptorAdapter(interceptor)); this(includePatterns, excludePatterns, null, null, new WebRequestHandlerInterceptorAdapter(interceptor), null);
} }
@ -228,7 +223,7 @@ public final class MappedInterceptor implements HandlerInterceptor {
*/ */
public boolean matches(HttpServletRequest request) { public boolean matches(HttpServletRequest request) {
Object path = ServletRequestPathUtils.getCachedPath(request); Object path = ServletRequestPathUtils.getCachedPath(request);
HttpMethod method = HttpMethod.valueOf(request.getMethod()); HttpMethod httpMethod = HttpMethod.valueOf(request.getMethod());
if (this.pathMatcher != defaultPathMatcher) { if (this.pathMatcher != defaultPathMatcher) {
path = path.toString(); path = path.toString();
} }
@ -241,33 +236,28 @@ public final class MappedInterceptor implements HandlerInterceptor {
} }
} }
if (!ObjectUtils.isEmpty(this.excludeHttpMethods)) { if (!ObjectUtils.isEmpty(this.excludeHttpMethods)) {
for (MethodAdapter adapter : this.excludeHttpMethods) { for (HttpMethod excluded : this.excludeHttpMethods) {
if (adapter.match(method)){ if (excluded == httpMethod) {
return false; return false;
} }
} }
} }
if (ObjectUtils.isEmpty(this.includePatterns) && ObjectUtils.isEmpty(this.includeHttpMethods)) { if (!ObjectUtils.isEmpty(this.includePatterns)) {
return true; boolean match = false;
}
if (!ObjectUtils.isEmpty(this.includePatterns) && ObjectUtils.isEmpty(this.includeHttpMethods)) {
for (PatternAdapter adapter : this.includePatterns) { for (PatternAdapter adapter : this.includePatterns) {
if (adapter.match(path, isPathContainer, this.pathMatcher)) { if (adapter.match(path, isPathContainer, this.pathMatcher)) {
return true; match = true;
break;
} }
} }
} if (!match) {
if (!ObjectUtils.isEmpty(this.includeHttpMethods) && ObjectUtils.isEmpty(this.includePatterns)) { return false;
for (MethodAdapter adapter : this.includeHttpMethods) {
if (adapter.match(method)) {
return true;
}
} }
} }
if (!ObjectUtils.isEmpty(this.includePatterns) && !ObjectUtils.isEmpty(this.includeHttpMethods)) { if (!ObjectUtils.isEmpty(this.includeHttpMethods)) {
boolean match = false; boolean match = false;
for (MethodAdapter methodAdapter : this.includeHttpMethods) { for (HttpMethod included : this.includeHttpMethods) {
if (methodAdapter.match(method)) { if (included == httpMethod) {
match = true; match = true;
break; break;
} }
@ -275,13 +265,8 @@ public final class MappedInterceptor implements HandlerInterceptor {
if (!match) { if (!match) {
return false; return false;
} }
for (PatternAdapter pathAdapter : this.includePatterns) {
if (pathAdapter.match(path, isPathContainer, pathMatcher)) {
return true;
}
}
} }
return false; return true;
} }
@ -365,40 +350,4 @@ public final class MappedInterceptor implements HandlerInterceptor {
} }
} }
/**
* Adapts {@link HttpMethod} instances for internal matching purposes.
*
* <p>Encapsulates an {@link HttpMethod} and provides matching functionality.
* Also provides a utility method to initialize arrays of {@code MethodAdapter}
* instances from arrays of {@link HttpMethod}.</p>
*
* @since 7.0.x
*/
private static class MethodAdapter {
private final @Nullable HttpMethod httpMethod;
public MethodAdapter(@Nullable HttpMethod httpMethod) {
this.httpMethod = httpMethod;
}
public boolean match(HttpMethod method) {
return this.httpMethod == method;
}
public @Nullable HttpMethod getHttpMethod() {
return this.httpMethod;
}
private static MethodAdapter @Nullable [] initHttpMethods(HttpMethod @Nullable [] methods) {
if (ObjectUtils.isEmpty(methods)) {
return null;
}
return Arrays.stream(methods)
.map(MethodAdapter::new)
.toArray(MethodAdapter[]::new);
}
}
} }

128
spring-webmvc/src/test/java/org/springframework/web/servlet/handler/MappedInterceptorTests.java

@ -27,6 +27,7 @@ import org.junit.jupiter.api.Named;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.springframework.http.HttpMethod; import org.springframework.http.HttpMethod;
import org.springframework.util.ObjectUtils;
import org.springframework.util.PathMatcher; import org.springframework.util.PathMatcher;
import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
@ -52,23 +53,16 @@ class MappedInterceptorTests {
return PathPatternsTestUtils.requestArguments(); return PathPatternsTestUtils.requestArguments();
} }
private MockHttpServletRequest requestWithMethod(String method) {
MockHttpServletRequest request = new MockHttpServletRequest();
request.setRequestURI("/some/path");
request.setMethod(method);
ServletRequestPathUtils.parseAndCache(request);
return request;
}
@PathPatternsParameterizedTest @PathPatternsParameterizedTest
void noPatterns(Function<String, MockHttpServletRequest> requestFactory) { void noPatterns(Function<String, MockHttpServletRequest> requestFactory) {
MappedInterceptor interceptor = new MappedInterceptor(null, null,null,null, delegate); MappedInterceptor interceptor = new MappedInterceptor(null, null, delegate);
assertThat(interceptor.matches(requestFactory.apply("/foo"))).isTrue(); assertThat(interceptor.matches(requestFactory.apply("/foo"))).isTrue();
} }
@PathPatternsParameterizedTest @PathPatternsParameterizedTest
void includePattern(Function<String, MockHttpServletRequest> requestFactory) { void includePattern(Function<String, MockHttpServletRequest> requestFactory) {
MappedInterceptor interceptor = new MappedInterceptor(new String[] { "/foo/*" }, null,null,null, delegate); MappedInterceptor interceptor = new MappedInterceptor(new String[] { "/foo/*" }, null, delegate);
assertThat(interceptor.matches(requestFactory.apply("/foo/bar"))).isTrue(); assertThat(interceptor.matches(requestFactory.apply("/foo/bar"))).isTrue();
assertThat(interceptor.matches(requestFactory.apply("/bar/foo"))).isFalse(); assertThat(interceptor.matches(requestFactory.apply("/bar/foo"))).isFalse();
@ -76,13 +70,13 @@ class MappedInterceptorTests {
@PathPatternsParameterizedTest @PathPatternsParameterizedTest
void includePatternWithMatrixVariables(Function<String, MockHttpServletRequest> requestFactory) { void includePatternWithMatrixVariables(Function<String, MockHttpServletRequest> requestFactory) {
MappedInterceptor interceptor = new MappedInterceptor(new String[] { "/foo*/*" },null,null, null, delegate); MappedInterceptor interceptor = new MappedInterceptor(new String[] { "/foo*/*" }, null, delegate);
assertThat(interceptor.matches(requestFactory.apply("/foo;q=1/bar;s=2"))).isTrue(); assertThat(interceptor.matches(requestFactory.apply("/foo;q=1/bar;s=2"))).isTrue();
} }
@PathPatternsParameterizedTest @PathPatternsParameterizedTest
void excludePattern(Function<String, MockHttpServletRequest> requestFactory) { void excludePattern(Function<String, MockHttpServletRequest> requestFactory) {
MappedInterceptor interceptor = new MappedInterceptor(null, new String[] { "/admin/**" },null,null, delegate); MappedInterceptor interceptor = new MappedInterceptor(null, new String[] { "/admin/**" }, delegate);
assertThat(interceptor.matches(requestFactory.apply("/foo"))).isTrue(); assertThat(interceptor.matches(requestFactory.apply("/foo"))).isTrue();
assertThat(interceptor.matches(requestFactory.apply("/admin/foo"))).isFalse(); assertThat(interceptor.matches(requestFactory.apply("/admin/foo"))).isFalse();
@ -91,7 +85,7 @@ class MappedInterceptorTests {
@PathPatternsParameterizedTest @PathPatternsParameterizedTest
void includeAndExcludePatterns(Function<String, MockHttpServletRequest> requestFactory) { void includeAndExcludePatterns(Function<String, MockHttpServletRequest> requestFactory) {
MappedInterceptor interceptor = MappedInterceptor interceptor =
new MappedInterceptor(new String[] { "/**" }, new String[] { "/admin/**" },null,null, delegate); new MappedInterceptor(new String[] { "/**" }, new String[] { "/admin/**" }, delegate);
assertThat(interceptor.matches(requestFactory.apply("/foo"))).isTrue(); assertThat(interceptor.matches(requestFactory.apply("/foo"))).isTrue();
assertThat(interceptor.matches(requestFactory.apply("/admin/foo"))).isFalse(); assertThat(interceptor.matches(requestFactory.apply("/admin/foo"))).isFalse();
@ -99,7 +93,7 @@ class MappedInterceptorTests {
@PathPatternsParameterizedTest // gh-26690 @PathPatternsParameterizedTest // gh-26690
void includePatternWithFallbackOnPathMatcher(Function<String, MockHttpServletRequest> requestFactory) { void includePatternWithFallbackOnPathMatcher(Function<String, MockHttpServletRequest> requestFactory) {
MappedInterceptor interceptor = new MappedInterceptor(new String[] { "/path1/**/path2" },null,null, null, delegate); MappedInterceptor interceptor = new MappedInterceptor(new String[] { "/path1/**/path2" }, null, delegate);
assertThat(interceptor.matches(requestFactory.apply("/path1/foo/bar/path2"))).isTrue(); assertThat(interceptor.matches(requestFactory.apply("/path1/foo/bar/path2"))).isTrue();
assertThat(interceptor.matches(requestFactory.apply("/path1/foo/bar/path3"))).isFalse(); assertThat(interceptor.matches(requestFactory.apply("/path1/foo/bar/path3"))).isFalse();
@ -109,97 +103,65 @@ class MappedInterceptorTests {
@SuppressWarnings("removal") @SuppressWarnings("removal")
@PathPatternsParameterizedTest @PathPatternsParameterizedTest
void customPathMatcher(Function<String, MockHttpServletRequest> requestFactory) { void customPathMatcher(Function<String, MockHttpServletRequest> requestFactory) {
MappedInterceptor interceptor = new MappedInterceptor(new String[] { "/foo/[0-9]*" },null,null, null, delegate); MappedInterceptor interceptor = new MappedInterceptor(new String[] { "/foo/[0-9]*" }, null, delegate);
interceptor.setPathMatcher(new TestPathMatcher()); interceptor.setPathMatcher(new TestPathMatcher());
assertThat(interceptor.matches(requestFactory.apply("/foo/123"))).isTrue(); assertThat(interceptor.matches(requestFactory.apply("/foo/123"))).isTrue();
assertThat(interceptor.matches(requestFactory.apply("/foo/bar"))).isFalse(); assertThat(interceptor.matches(requestFactory.apply("/foo/bar"))).isFalse();
} }
@Test
void includeMethods(){
MappedInterceptor interceptor = new MappedInterceptor(null, null,new HttpMethod[]{HttpMethod.GET},null, delegate);
assertThat(interceptor.matches(requestWithMethod("GET"))).isTrue();
assertThat(interceptor.matches(requestWithMethod("HEAD"))).isFalse();
assertThat(interceptor.matches(requestWithMethod("POST"))).isFalse();
assertThat(interceptor.matches(requestWithMethod("PUT"))).isFalse();
assertThat(interceptor.matches(requestWithMethod("DELETE"))).isFalse();
assertThat(interceptor.matches(requestWithMethod("CONNECT"))).isFalse();
assertThat(interceptor.matches(requestWithMethod("OPTIONS"))).isFalse();
assertThat(interceptor.matches(requestWithMethod("TRACE"))).isFalse();
assertThat(interceptor.matches(requestWithMethod("PATCH"))).isFalse();
}
@Test @Test
void includeMultipleMethods(){ void includeMultipleMethods(){
MappedInterceptor interceptor = new MappedInterceptor(null, null,new HttpMethod[]{HttpMethod.GET,HttpMethod.POST},null, delegate); testHttpMethods(
assertThat(interceptor.matches(requestWithMethod("GET"))).isTrue(); new HttpMethod[] {HttpMethod.GET, HttpMethod.POST},
assertThat(interceptor.matches(requestWithMethod("HEAD"))).isFalse(); new HttpMethod[] {},
assertThat(interceptor.matches(requestWithMethod("POST"))).isTrue(); "GET", "POST");
assertThat(interceptor.matches(requestWithMethod("PUT"))).isFalse();
assertThat(interceptor.matches(requestWithMethod("DELETE"))).isFalse();
assertThat(interceptor.matches(requestWithMethod("CONNECT"))).isFalse();
assertThat(interceptor.matches(requestWithMethod("OPTIONS"))).isFalse();
assertThat(interceptor.matches(requestWithMethod("TRACE"))).isFalse();
assertThat(interceptor.matches(requestWithMethod("PATCH"))).isFalse();
}
@Test
void excludeMethods(){
MappedInterceptor interceptor = new MappedInterceptor(null, null,null,new HttpMethod[]{HttpMethod.GET}, delegate);
assertThat(interceptor.matches(requestWithMethod("GET"))).isFalse();
assertThat(interceptor.matches(requestWithMethod("HEAD"))).isTrue();
assertThat(interceptor.matches(requestWithMethod("POST"))).isTrue();
assertThat(interceptor.matches(requestWithMethod("PUT"))).isTrue();
assertThat(interceptor.matches(requestWithMethod("DELETE"))).isTrue();
assertThat(interceptor.matches(requestWithMethod("CONNECT"))).isTrue();
assertThat(interceptor.matches(requestWithMethod("OPTIONS"))).isTrue();
assertThat(interceptor.matches(requestWithMethod("TRACE"))).isTrue();
assertThat(interceptor.matches(requestWithMethod("PATCH"))).isTrue();
} }
@Test @Test
void excludeMultipleMethods(){ void excludeMultipleMethods() {
MappedInterceptor interceptor = new MappedInterceptor(null, null,null,new HttpMethod[]{HttpMethod.GET,HttpMethod.POST,HttpMethod.OPTIONS}, delegate); testHttpMethods(
assertThat(interceptor.matches(requestWithMethod("GET"))).isFalse(); new HttpMethod[] {},
assertThat(interceptor.matches(requestWithMethod("HEAD"))).isTrue(); new HttpMethod[] {HttpMethod.GET, HttpMethod.POST, HttpMethod.OPTIONS},
assertThat(interceptor.matches(requestWithMethod("POST"))).isFalse(); "HEAD", "PUT", "DELETE", "TRACE", "PATCH");
assertThat(interceptor.matches(requestWithMethod("PUT"))).isTrue(); }
assertThat(interceptor.matches(requestWithMethod("DELETE"))).isTrue();
assertThat(interceptor.matches(requestWithMethod("CONNECT"))).isTrue(); private void testHttpMethods(HttpMethod[] include, HttpMethod[] exclude, String... expected) {
assertThat(interceptor.matches(requestWithMethod("OPTIONS"))).isFalse(); MappedInterceptor interceptor = new MappedInterceptor(null, null, include, exclude, delegate, null);
assertThat(interceptor.matches(requestWithMethod("TRACE"))).isTrue(); for (HttpMethod httpMethod : HttpMethod.values()) {
assertThat(interceptor.matches(requestWithMethod("PATCH"))).isTrue(); boolean matches = ObjectUtils.containsElement(expected, httpMethod.name());
assertThat(interceptor.matches(requestWithMethod(httpMethod.name())))
.as("Expected " + httpMethod + " to " + (matches ? "" : "not ") + "match")
.isEqualTo(matches);
}
} }
@Test private MockHttpServletRequest requestWithMethod(String method) {
void includeMethodsAndExcludeMethods(){ MockHttpServletRequest request = new MockHttpServletRequest();
MappedInterceptor interceptor = new MappedInterceptor(null, null,new HttpMethod[]{HttpMethod.GET,HttpMethod.POST},new HttpMethod[]{HttpMethod.OPTIONS}, delegate); request.setRequestURI("/some/path");
assertThat(interceptor.matches(requestWithMethod("GET"))).isTrue(); request.setMethod(method);
assertThat(interceptor.matches(requestWithMethod("HEAD"))).isFalse(); ServletRequestPathUtils.parseAndCache(request);
assertThat(interceptor.matches(requestWithMethod("POST"))).isTrue(); return request;
assertThat(interceptor.matches(requestWithMethod("PUT"))).isFalse();
assertThat(interceptor.matches(requestWithMethod("DELETE"))).isFalse();
assertThat(interceptor.matches(requestWithMethod("CONNECT"))).isFalse();
assertThat(interceptor.matches(requestWithMethod("OPTIONS"))).isFalse();
assertThat(interceptor.matches(requestWithMethod("TRACE"))).isFalse();
assertThat(interceptor.matches(requestWithMethod("PATCH"))).isFalse();
} }
@PathPatternsParameterizedTest @PathPatternsParameterizedTest
void includePatternAndIncludeMethods(Function<String, MockHttpServletRequest> requestFactory) { void includePatternAndHttMethods(Function<String, MockHttpServletRequest> requestFactory) {
MappedInterceptor interceptor = new MappedInterceptor(new String[] { "/foo/*" }, null,new HttpMethod[]{HttpMethod.GET},null, delegate);
assertThat(interceptor.matches(requestFactory.apply("/foo/bar"))).isTrue(); MappedInterceptor getInterceptor = new MappedInterceptor(
assertThat(interceptor.matches(requestFactory.apply("/bar/foo"))).isFalse(); new String[] {"/foo/*"}, null, new HttpMethod[] {HttpMethod.GET}, null, delegate, null);
}
MappedInterceptor putInterceptor = new MappedInterceptor(
new String[] {"/foo/*"}, null, new HttpMethod[] {HttpMethod.PUT}, null, delegate, null);
assertThat(getInterceptor.matches(requestFactory.apply("/foo/bar"))).isTrue();
assertThat(putInterceptor.matches(requestFactory.apply("/foo/bar"))).isFalse();
}
@Test @Test
void preHandle() throws Exception { void preHandle() throws Exception {
HandlerInterceptor delegate = mock(); HandlerInterceptor delegate = mock();
new MappedInterceptor(null,null,null,null, delegate).preHandle(mock(), mock(), null); new MappedInterceptor(null,null, delegate).preHandle(mock(), mock(), null);
then(delegate).should().preHandle(any(HttpServletRequest.class), any(HttpServletResponse.class), any()); then(delegate).should().preHandle(any(HttpServletRequest.class), any(HttpServletResponse.class), any());
} }
@ -208,7 +170,7 @@ class MappedInterceptorTests {
void postHandle() throws Exception { void postHandle() throws Exception {
HandlerInterceptor delegate = mock(); HandlerInterceptor delegate = mock();
new MappedInterceptor(null,null,null,null, delegate).postHandle(mock(), mock(), null, mock()); new MappedInterceptor(null,null, delegate).postHandle(mock(), mock(), null, mock());
then(delegate).should().postHandle(any(), any(), any(), any()); then(delegate).should().postHandle(any(), any(), any(), any());
} }
@ -217,7 +179,7 @@ class MappedInterceptorTests {
void afterCompletion() throws Exception { void afterCompletion() throws Exception {
HandlerInterceptor delegate = mock(); HandlerInterceptor delegate = mock();
new MappedInterceptor(null,null,null,null, delegate).afterCompletion(mock(), mock(), null, mock()); new MappedInterceptor(null,null, delegate).afterCompletion(mock(), mock(), null, mock());
then(delegate).should().afterCompletion(any(), any(), any(), any()); then(delegate).should().afterCompletion(any(), any(), any(), any());
} }

Loading…
Cancel
Save