diff --git a/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/RepositoryRestHandlerMapping.java b/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/RepositoryRestHandlerMapping.java index 325a6bfa2..f22bc4111 100644 --- a/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/RepositoryRestHandlerMapping.java +++ b/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/RepositoryRestHandlerMapping.java @@ -113,14 +113,13 @@ public class RepositoryRestHandlerMapping extends RequestMappingHandlerMapping { acceptType = config.getDefaultMediaType().toString(); } - HttpServletRequest request = new DefaultAcceptTypeHttpServletRequest(origRequest, acceptType); + String uri = extractRepositoryLookupPath(lookupPath, config.getBaseUri()); - if (!hasText(lookupPath)) { - return super.lookupHandlerMethod(lookupPath, request); + if (uri == null) { + return null; } - String uri = extractRepositoryLookupPath(lookupPath, config.getBaseUri()); - request = new DefaultAcceptTypeHttpServletRequest(request, acceptType, uri); + HttpServletRequest request = new DefaultAcceptTypeHttpServletRequest(origRequest, acceptType, uri); // Root request if (!StringUtils.hasText(uri) || uri.equals("/")) { @@ -129,7 +128,7 @@ public class RepositoryRestHandlerMapping extends RequestMappingHandlerMapping { String[] parts = uri.split("/"); - if (mappings.exportsTopLevelResourceFor(parts[1])) { + if (mappings.exportsTopLevelResourceFor(parts[uri.startsWith("/") ? 1 : 0])) { return super.lookupHandlerMethod(uri, request); } @@ -142,7 +141,8 @@ public class RepositoryRestHandlerMapping extends RequestMappingHandlerMapping { * * @param lookupPath must not be {@literal null}. * @param baseUri must not be {@literal null}. - * @return + * @return the stripped lookup path with then the repository URI space or {@literal null} in case the lookup path is + * not pointing into the repository URI space. */ private static String extractRepositoryLookupPath(String lookupPath, URI baseUri) { @@ -160,7 +160,7 @@ public class RepositoryRestHandlerMapping extends RequestMappingHandlerMapping { } uri = uri.startsWith("/") ? uri : "/".concat(uri); - return lookupPath.substring(uri.length(), lookupPath.length()); + return lookupPath.startsWith(uri) ? lookupPath.substring(uri.length(), lookupPath.length()) : null; } List baseUriSegments = UriComponentsBuilder.fromUri(baseUri).build().getPathSegments(); @@ -176,7 +176,7 @@ public class RepositoryRestHandlerMapping extends RequestMappingHandlerMapping { } } - return lookupPath; + return null; } /* diff --git a/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/RepositoryRestHandlerMappingUnitTests.java b/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/RepositoryRestHandlerMappingUnitTests.java index d22e0bf72..a3d2a903a 100644 --- a/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/RepositoryRestHandlerMappingUnitTests.java +++ b/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/RepositoryRestHandlerMappingUnitTests.java @@ -163,16 +163,57 @@ public class RepositoryRestHandlerMappingUnitTests { public void returnsRepositoryHandlerMethodForAbsoluteBaseUriWithServletMapping() throws Exception { String baseUri = "http://localhost/base"; + String uri = baseUri.concat("/people/"); when(mappings.exportsTopLevelResourceFor("people")).thenReturn(true); - mockRequest = new MockHttpServletRequest("GET", baseUri.concat("/people/")); - mockRequest.setServletPath(baseUri.concat("/people/")); + mockRequest = new MockHttpServletRequest("GET", uri); + mockRequest.setServletPath(uri); configuration.setBaseUri(URI.create(baseUri)); - HandlerMethod method = handlerMapping.lookupHandlerMethod("/people/", mockRequest); + HandlerMethod method = handlerMapping.lookupHandlerMethod("/base/people/", mockRequest); assertThat(method, is(notNullValue())); assertThat(method.getMethod(), is(listEntitiesMethod)); } + + /** + * @see DATAREST-276 + */ + @Test + public void refrainsFromMappingIfTheRequestDoesNotPointIntoAbsolutelyDefinedUriSpace() throws Exception { + + String baseUri = "http://localhost/base"; + String uri = baseUri.concat("/people/"); + + when(mappings.exportsTopLevelResourceFor("people")).thenReturn(true); + mockRequest = new MockHttpServletRequest("GET", uri); + mockRequest.setServletPath(uri); + + configuration.setBaseUri(URI.create(baseUri)); + + HandlerMethod method = handlerMapping.lookupHandlerMethod("/people", mockRequest); + + assertThat(method, is(nullValue())); + } + + /** + * @see DATAREST-276 + */ + @Test + public void refrainsFromMappingWhenUrisDontMatch() throws Exception { + + String baseUri = "foo"; + String uri = baseUri.concat("/people"); + + when(mappings.exportsTopLevelResourceFor("people")).thenReturn(true); + mockRequest = new MockHttpServletRequest("GET", uri); + mockRequest.setServletPath(uri); + + configuration.setBaseUri(URI.create(baseUri)); + + HandlerMethod method = handlerMapping.lookupHandlerMethod("/people", mockRequest); + + assertThat(method, is(nullValue())); + } }