From b0153ada19f165b0d402641b503e2fc7f0c45a19 Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Thu, 20 Sep 2012 17:38:28 -0700 Subject: [PATCH 1/2] Polish trailing whitespace --- .../RequestMethodsRequestCondition.java | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/RequestMethodsRequestCondition.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/RequestMethodsRequestCondition.java index 3670a7f0cf..902d3fb3ad 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/RequestMethodsRequestCondition.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/RequestMethodsRequestCondition.java @@ -28,9 +28,9 @@ import javax.servlet.http.HttpServletRequest; import org.springframework.web.bind.annotation.RequestMethod; /** - * A logical disjunction (' || ') request condition that matches a request + * A logical disjunction (' || ') request condition that matches a request * against a set of {@link RequestMethod}s. - * + * * @author Arjen Poutsma * @author Rossen Stoyanchev * @since 3.1 @@ -41,7 +41,7 @@ public final class RequestMethodsRequestCondition extends AbstractRequestConditi /** * Create a new instance with the given request methods. - * @param requestMethods 0 or more HTTP request methods; + * @param requestMethods 0 or more HTTP request methods; * if, 0 the condition will match to every request. */ public RequestMethodsRequestCondition(RequestMethod... requestMethods) { @@ -51,13 +51,13 @@ public final class RequestMethodsRequestCondition extends AbstractRequestConditi private static List asList(RequestMethod... requestMethods) { return requestMethods != null ? Arrays.asList(requestMethods) : Collections.emptyList(); } - + /** * Private constructor. */ private RequestMethodsRequestCondition(Collection requestMethods) { this.methods = Collections.unmodifiableSet(new LinkedHashSet(requestMethods)); - } + } /** * Returns all {@link RequestMethod}s contained in this condition. @@ -75,9 +75,9 @@ public final class RequestMethodsRequestCondition extends AbstractRequestConditi protected String getToStringInfix() { return " || "; } - + /** - * Returns a new instance with a union of the HTTP request methods + * Returns a new instance with a union of the HTTP request methods * from "this" and the "other" instance. */ public RequestMethodsRequestCondition combine(RequestMethodsRequestCondition other) { @@ -87,11 +87,11 @@ public final class RequestMethodsRequestCondition extends AbstractRequestConditi } /** - * Checks if any of the HTTP request methods match the given request and returns - * an instance that contains the matching request method only. + * Checks if any of the HTTP request methods match the given request and returns + * an instance that contains the matching request method only. * @param request the current request - * @return the same instance if the condition contains no request method; - * or a new condition with the matching request method; + * @return the same instance if the condition contains no request method; + * or a new condition with the matching request method; * or {@code null} if no request methods match. */ public RequestMethodsRequestCondition getMatchingCondition(HttpServletRequest request) { @@ -113,10 +113,10 @@ public final class RequestMethodsRequestCondition extends AbstractRequestConditi *
  • 0 if the two conditions contain the same number of HTTP request methods. *
  • Less than 0 if "this" instance has an HTTP request method but "other" doesn't. *
  • Greater than 0 "other" has an HTTP request method but "this" doesn't. - * - * - *

    It is assumed that both instances have been obtained via - * {@link #getMatchingCondition(HttpServletRequest)} and therefore each instance + * + * + *

    It is assumed that both instances have been obtained via + * {@link #getMatchingCondition(HttpServletRequest)} and therefore each instance * contains the matching HTTP request method only or is otherwise empty. */ public int compareTo(RequestMethodsRequestCondition other, HttpServletRequest request) { From c0729756d76c355829ec63921a2ba0f6aebfebfc Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Thu, 20 Sep 2012 17:39:07 -0700 Subject: [PATCH 2/2] Protect RequestCondition against unkown HTTP methods The RequestMethodsRequestCondition is now protected against HTTP request method values not present in the RequestMethod enumeration (e.g. PROPFIND). Issue: SPR-9815 --- .../RequestMethodsRequestCondition.java | 37 ++++++++++++------- .../RequestMethodsRequestConditionTests.java | 14 ++++++- 2 files changed, 36 insertions(+), 15 deletions(-) diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/RequestMethodsRequestCondition.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/RequestMethodsRequestCondition.java index 902d3fb3ad..22d5e3b8b5 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/RequestMethodsRequestCondition.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/RequestMethodsRequestCondition.java @@ -87,32 +87,43 @@ public final class RequestMethodsRequestCondition extends AbstractRequestConditi } /** - * Checks if any of the HTTP request methods match the given request and returns - * an instance that contains the matching request method only. + * Check if any of the HTTP request methods match the given request and + * return an instance that contains the matching HTTP request method only. + * * @param request the current request - * @return the same instance if the condition contains no request method; - * or a new condition with the matching request method; - * or {@code null} if no request methods match. + * @return the same instance if the condition is empty, a new condition with + * the matched request method, or {@code null} if no request methods match */ public RequestMethodsRequestCondition getMatchingCondition(HttpServletRequest request) { - if (methods.isEmpty()) { + if (this.methods.isEmpty()) { return this; } - RequestMethod incomingRequestMethod = RequestMethod.valueOf(request.getMethod()); - for (RequestMethod method : methods) { - if (method.equals(incomingRequestMethod)) { - return new RequestMethodsRequestCondition(method); + RequestMethod incomingRequestMethod = getRequestMethod(request); + if(incomingRequestMethod != null) { + for (RequestMethod method : this.methods) { + if (method.equals(incomingRequestMethod)) { + return new RequestMethodsRequestCondition(method); + } } } return null; } + private RequestMethod getRequestMethod(HttpServletRequest request) { + try { + return RequestMethod.valueOf(request.getMethod()); + } + catch (IllegalArgumentException e) { + return null; + } + } + /** * Returns: *

      - *
    • 0 if the two conditions contain the same number of HTTP request methods. - *
    • Less than 0 if "this" instance has an HTTP request method but "other" doesn't. - *
    • Greater than 0 "other" has an HTTP request method but "this" doesn't. + *
    • 0 if the two conditions contain the same number of HTTP request methods + *
    • Less than 0 if "this" instance has an HTTP request method but "other" doesn't + *
    • Greater than 0 "other" has an HTTP request method but "this" doesn't *
    * *

    It is assumed that both instances have been obtained via diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/condition/RequestMethodsRequestConditionTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/condition/RequestMethodsRequestConditionTests.java index b8aa875359..b31b403183 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/condition/RequestMethodsRequestConditionTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/condition/RequestMethodsRequestConditionTests.java @@ -16,6 +16,7 @@ package org.springframework.web.servlet.mvc.condition; +import static org.junit.Assert.*; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; @@ -47,7 +48,7 @@ public class RequestMethodsRequestConditionTests { assertNull(condition.getMatchingCondition(request)); } - + @Test public void multipleMethodsMatch() { RequestMethodsRequestCondition condition = new RequestMethodsRequestCondition(RequestMethod.GET, RequestMethod.POST); @@ -66,6 +67,15 @@ public class RequestMethodsRequestConditionTests { assertNotNull(condition.getMatchingCondition(new MockHttpServletRequest("HEAD", ""))); } + @Test + public void unknownMethodType() throws Exception { + RequestMethodsRequestCondition condition = new RequestMethodsRequestCondition(RequestMethod.GET, RequestMethod.POST); + + MockHttpServletRequest request = new MockHttpServletRequest("PROPFIND", "/foo"); + + assertNull(condition.getMatchingCondition(request)); + } + @Test public void compareTo() { RequestMethodsRequestCondition condition1 = new RequestMethodsRequestCondition(RequestMethod.GET, RequestMethod.HEAD); @@ -73,7 +83,7 @@ public class RequestMethodsRequestConditionTests { RequestMethodsRequestCondition condition3 = new RequestMethodsRequestCondition(); MockHttpServletRequest request = new MockHttpServletRequest(); - + int result = condition1.compareTo(condition2, request); assertTrue("Invalid comparison result: " + result, result < 0);