From fa4ba2a82bc5bad00010dbd96b43dd4019243859 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Tue, 14 Oct 2014 11:34:28 -0400 Subject: [PATCH] Polish resource handling tests --- .../resource/ResourceTransformerSupport.java | 10 +- .../CssLinkResourceTransformerTests.java | 42 ++-- .../ResourceHttpRequestHandlerTests.java | 229 ++++++++---------- .../ResourceTransformerSupportTests.java | 98 +++----- .../ResourceUrlProviderJavaConfigTests.java | 66 +++-- 5 files changed, 193 insertions(+), 252 deletions(-) diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceTransformerSupport.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceTransformerSupport.java index a382697476..1dc2f4cfaf 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceTransformerSupport.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceTransformerSupport.java @@ -76,15 +76,15 @@ public abstract class ResourceTransformerSupport implements ResourceTransformer protected String resolveUrlPath(String resourcePath, HttpServletRequest request, Resource resource, ResourceTransformerChain transformerChain) { - if (!resourcePath.startsWith("/")) { - // try resolving as relative path - return transformerChain.getResolverChain().resolveUrlPath(resourcePath, Arrays.asList(resource)); - } - else { + if (resourcePath.startsWith("/")) { // full resource path ResourceUrlProvider urlProvider = findResourceUrlProvider(request); return (urlProvider != null ? urlProvider.getForRequestUrl(request, resourcePath) : null); } + else { + // try resolving as relative path + return transformerChain.getResolverChain().resolveUrlPath(resourcePath, Arrays.asList(resource)); + } } private ResourceUrlProvider findResourceUrlProvider(HttpServletRequest request) { diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/CssLinkResourceTransformerTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/CssLinkResourceTransformerTests.java index 5f93358ddf..60dbe80ec2 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/CssLinkResourceTransformerTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/CssLinkResourceTransformerTests.java @@ -16,11 +16,9 @@ package org.springframework.web.servlet.resource; -import java.util.ArrayList; import java.util.Arrays; -import java.util.HashMap; +import java.util.Collections; import java.util.List; -import java.util.Map; import org.junit.Before; import org.junit.Test; @@ -49,36 +47,23 @@ public class CssLinkResourceTransformerTests { @Before public void setUp() { - Map versionStrategyMap = new HashMap<>(); - versionStrategyMap.put("/**", new ContentVersionStrategy()); - VersionResourceResolver versionResolver = new VersionResourceResolver(); - versionResolver.setStrategyMap(versionStrategyMap); - - List resolvers = new ArrayList(); - resolvers.add(versionResolver); - resolvers.add(new PathResourceResolver()); - ResourceResolverChain resolverChain = new DefaultResourceResolverChain(resolvers); + VersionResourceResolver resolver = new VersionResourceResolver(); + resolver.setStrategyMap(Collections.singletonMap("/**", new ContentVersionStrategy())); + + List resolvers = Arrays.asList(resolver, new PathResourceResolver()); + List transformers = Arrays.asList(new CssLinkResourceTransformer()); - List transformers = new ArrayList<>(); - transformers.add(new CssLinkResourceTransformer()); + ResourceResolverChain resolverChain = new DefaultResourceResolverChain(resolvers); this.transformerChain = new DefaultResourceTransformerChain(resolverChain, transformers); this.request = new MockHttpServletRequest(); } - @Test - public void transformNotCss() throws Exception { - Resource expected = new ClassPathResource("test/images/image.png", getClass()); - Resource actual = this.transformerChain.transform(this.request, expected); - assertSame(expected, actual); - } - @Test public void transform() throws Exception { - Resource mainCss = new ClassPathResource("test/main.css", getClass()); - Resource resource = this.transformerChain.transform(this.request, mainCss); - TransformedResource transformedResource = (TransformedResource) resource; + Resource css = new ClassPathResource("test/main.css", getClass()); + TransformedResource actual = (TransformedResource) this.transformerChain.transform(this.request, css); String expected = "\n" + "@import url(\"bar-11e16cf79faee7ac698c805cf28248d2.css\");\n" + @@ -88,7 +73,7 @@ public class CssLinkResourceTransformerTests { "@import 'foo-e36d2e05253c6c7085a91522ce43a0b4.css';\n\n" + "body { background: url(\"images/image-f448cd1d5dba82b774f3202c878230b3.png\") }\n"; - String result = new String(transformedResource.getByteArray(), "UTF-8"); + String result = new String(actual.getByteArray(), "UTF-8"); result = StringUtils.deleteAny(result, "\r"); assertEquals(expected, result); } @@ -122,4 +107,11 @@ public class CssLinkResourceTransformerTests { .resolveUrlPath("file:///home/spring/image.png", Arrays.asList(externalCss)); } + @Test + public void transformWithNonCssResource() throws Exception { + Resource expected = new ClassPathResource("test/images/image.png", getClass()); + Resource actual = this.transformerChain.transform(this.request, expected); + assertSame(expected, actual); + } + } diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceHttpRequestHandlerTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceHttpRequestHandlerTests.java index 5fe75ca2de..8eb9d8670e 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceHttpRequestHandlerTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceHttpRequestHandlerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2012 the original author or authors. + * Copyright 2002-2014 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. @@ -16,6 +16,7 @@ package org.springframework.web.servlet.resource; +import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -35,189 +36,171 @@ import org.springframework.web.servlet.HandlerMapping; import static org.junit.Assert.*; /** + * Unit tests for ResourceHttpRequestHandler. + * * @author Keith Donald * @author Jeremy Grelle + * @author Rossen Stoyanchev */ public class ResourceHttpRequestHandlerTests { private ResourceHttpRequestHandler handler; + private MockHttpServletRequest request; + + private MockHttpServletResponse response; + + @Before public void setUp() throws Exception { - List resourcePaths = new ArrayList(); - resourcePaths.add(new ClassPathResource("test/", getClass())); - resourcePaths.add(new ClassPathResource("testalternatepath/", getClass())); - handler = new ResourceHttpRequestHandler(); - handler.setLocations(resourcePaths); - handler.setCacheSeconds(3600); - handler.setServletContext(new TestServletContext()); - handler.afterPropertiesSet(); + List paths = new ArrayList<>(2); + paths.add(new ClassPathResource("test/", getClass())); + paths.add(new ClassPathResource("testalternatepath/", getClass())); + + this.handler = new ResourceHttpRequestHandler(); + this.handler.setLocations(paths); + this.handler.setCacheSeconds(3600); + this.handler.setServletContext(new TestServletContext()); + this.handler.afterPropertiesSet(); + + this.request = new MockHttpServletRequest("GET", ""); + this.response = new MockHttpServletResponse(); } @Test public void getResource() throws Exception { - MockHttpServletRequest request = new MockHttpServletRequest(); - request.setAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, "/foo.css"); - request.setMethod("GET"); - MockHttpServletResponse response = new MockHttpServletResponse(); - handler.handleRequest(request, response); - assertEquals("text/css", response.getContentType()); - assertEquals(17, response.getContentLength()); - assertTrue(Long.valueOf(response.getHeader("Expires")) >= System.currentTimeMillis() - 1000 + (3600 * 1000)); - assertEquals("max-age=3600, must-revalidate", response.getHeader("Cache-Control")); - assertTrue(response.containsHeader("Last-Modified")); - assertEquals(Long.valueOf(response.getHeader("Last-Modified")).longValue(), - new ClassPathResource("test/foo.css", getClass()).getFile().lastModified()); - assertEquals("h1 { color:red; }", response.getContentAsString()); + this.request.setAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, "/foo.css"); + this.handler.handleRequest(this.request, this.response); + + assertEquals("text/css", this.response.getContentType()); + assertEquals(17, this.response.getContentLength()); + assertTrue(headerAsLong("Expires") >= System.currentTimeMillis() - 1000 + (3600 * 1000)); + assertEquals("max-age=3600, must-revalidate", this.response.getHeader("Cache-Control")); + assertTrue(this.response.containsHeader("Last-Modified")); + assertEquals(headerAsLong("Last-Modified"), resourceLastModified("test/foo.css")); + assertEquals("h1 { color:red; }", this.response.getContentAsString()); } @Test public void getResourceWithHtmlMediaType() throws Exception { - MockHttpServletRequest request = new MockHttpServletRequest(); - request.setAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, "/foo.html"); - request.setMethod("GET"); - MockHttpServletResponse response = new MockHttpServletResponse(); - handler.handleRequest(request, response); - assertEquals("text/html", response.getContentType()); - assertTrue(Long.valueOf(response.getHeader("Expires")) >= System.currentTimeMillis() - 1000 + (3600 * 1000)); - assertEquals("max-age=3600, must-revalidate", response.getHeader("Cache-Control")); - assertTrue(response.containsHeader("Last-Modified")); - assertEquals(Long.valueOf(response.getHeader("Last-Modified")).longValue(), - new ClassPathResource("test/foo.html", getClass()).getFile().lastModified()); + this.request.setAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, "/foo.html"); + this.handler.handleRequest(this.request, this.response); + + assertEquals("text/html", this.response.getContentType()); + assertTrue(headerAsLong("Expires") >= System.currentTimeMillis() - 1000 + (3600 * 1000)); + assertEquals("max-age=3600, must-revalidate", this.response.getHeader("Cache-Control")); + assertTrue(this.response.containsHeader("Last-Modified")); + assertEquals(headerAsLong("Last-Modified"), resourceLastModified("test/foo.html")); } @Test public void getResourceFromAlternatePath() throws Exception { - MockHttpServletRequest request = new MockHttpServletRequest(); - request.setAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, "/baz.css"); - request.setMethod("GET"); - MockHttpServletResponse response = new MockHttpServletResponse(); - handler.handleRequest(request, response); - assertEquals("text/css", response.getContentType()); - assertEquals(17, response.getContentLength()); - assertTrue(Long.valueOf(response.getHeader("Expires")) >= System.currentTimeMillis() - 1000 + (3600 * 1000)); - assertEquals("max-age=3600, must-revalidate", response.getHeader("Cache-Control")); - assertTrue(response.containsHeader("Last-Modified")); - assertEquals(Long.valueOf(response.getHeader("Last-Modified")).longValue(), - new ClassPathResource("testalternatepath/baz.css", getClass()).getFile().lastModified()); - assertEquals("h1 { color:red; }", response.getContentAsString()); + this.request.setAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, "/baz.css"); + this.handler.handleRequest(this.request, this.response); + + assertEquals("text/css", this.response.getContentType()); + assertEquals(17, this.response.getContentLength()); + assertTrue(headerAsLong("Expires") >= System.currentTimeMillis() - 1000 + (3600 * 1000)); + assertEquals("max-age=3600, must-revalidate", this.response.getHeader("Cache-Control")); + assertTrue(this.response.containsHeader("Last-Modified")); + assertEquals(headerAsLong("Last-Modified"), resourceLastModified("testalternatepath/baz.css")); + assertEquals("h1 { color:red; }", this.response.getContentAsString()); } @Test public void getResourceFromSubDirectory() throws Exception { - MockHttpServletRequest request = new MockHttpServletRequest(); - request.setAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, "/js/foo.js"); - request.setMethod("GET"); - MockHttpServletResponse response = new MockHttpServletResponse(); - handler.handleRequest(request, response); - assertEquals("text/javascript", response.getContentType()); - assertEquals("function foo() { console.log(\"hello world\"); }", response.getContentAsString()); + this.request.setAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, "/js/foo.js"); + this.handler.handleRequest(this.request, this.response); + + assertEquals("text/javascript", this.response.getContentType()); + assertEquals("function foo() { console.log(\"hello world\"); }", this.response.getContentAsString()); } @Test public void getResourceFromSubDirectoryOfAlternatePath() throws Exception { - MockHttpServletRequest request = new MockHttpServletRequest(); - request.setAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, "/js/baz.js"); - request.setMethod("GET"); - MockHttpServletResponse response = new MockHttpServletResponse(); - handler.handleRequest(request, response); - assertEquals("text/javascript", response.getContentType()); - assertEquals("function foo() { console.log(\"hello world\"); }", response.getContentAsString()); + this.request.setAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, "/js/baz.js"); + this.handler.handleRequest(this.request, this.response); + + assertEquals("text/javascript", this.response.getContentType()); + assertEquals("function foo() { console.log(\"hello world\"); }", this.response.getContentAsString()); } @Test public void getResourceViaDirectoryTraversal() throws Exception { - MockHttpServletRequest request = new MockHttpServletRequest(); - request.setMethod("GET"); - - request.setAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, "../testsecret/secret.txt"); - MockHttpServletResponse response = new MockHttpServletResponse(); - handler.handleRequest(request, response); - assertEquals(404, response.getStatus()); - - request.setAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, "test/../../testsecret/secret.txt"); - response = new MockHttpServletResponse(); - handler.handleRequest(request, response); - assertEquals(404, response.getStatus()); - - handler.setLocations(Arrays.asList(new ClassPathResource("testsecret/", getClass()))); - request.setAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, "secret.txt"); - response = new MockHttpServletResponse(); - handler.handleRequest(request, response); - assertEquals(200, response.getStatus()); - assertEquals("text/plain", response.getContentType()); - assertEquals("big secret", response.getContentAsString()); + this.request.setAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, "../testsecret/secret.txt"); + this.handler.handleRequest(this.request, this.response); + assertEquals(404, this.response.getStatus()); + + this.request.setAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, "test/../../testsecret/secret.txt"); + this.response = new MockHttpServletResponse(); + this.handler.handleRequest(this.request, this.response); + assertEquals(404, this.response.getStatus()); + + this.handler.setLocations(Arrays.asList(new ClassPathResource("testsecret/", getClass()))); + this.request.setAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, "secret.txt"); + this.response = new MockHttpServletResponse(); + this.handler.handleRequest(this.request, this.response); + assertEquals(200, this.response.getStatus()); + assertEquals("text/plain", this.response.getContentType()); + assertEquals("big secret", this.response.getContentAsString()); } @Test public void notModified() throws Exception { - MockHttpServletRequest request = new MockHttpServletRequest(); - request.setAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, "/foo.css"); - request.addHeader("If-Modified-Since", new ClassPathResource("test/foo.css", getClass()).getFile().lastModified()); - request.setMethod("GET"); - MockHttpServletResponse response = new MockHttpServletResponse(); - handler.handleRequest(request, response); - assertEquals(HttpServletResponse.SC_NOT_MODIFIED, response.getStatus()); + this.request.setAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, "/foo.css"); + this.request.addHeader("If-Modified-Since", resourceLastModified("test/foo.css")); + this.handler.handleRequest(this.request, this.response); + assertEquals(HttpServletResponse.SC_NOT_MODIFIED, this.response.getStatus()); } @Test public void modified() throws Exception { - MockHttpServletRequest request = new MockHttpServletRequest(); - request.setAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, "/foo.css"); - request.addHeader("If-Modified-Since", - new ClassPathResource("test/foo.css", getClass()).getFile().lastModified() / 1000 * 1000 - 1); - request.setMethod("GET"); - MockHttpServletResponse response = new MockHttpServletResponse(); - handler.handleRequest(request, response); - assertEquals(HttpServletResponse.SC_OK, response.getStatus()); - assertEquals("h1 { color:red; }", response.getContentAsString()); + this.request.setAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, "/foo.css"); + this.request.addHeader("If-Modified-Since", resourceLastModified("test/foo.css") / 1000 * 1000 - 1); + this.handler.handleRequest(this.request, this.response); + assertEquals(HttpServletResponse.SC_OK, this.response.getStatus()); + assertEquals("h1 { color:red; }", this.response.getContentAsString()); } @Test public void directory() throws Exception { - MockHttpServletRequest request = new MockHttpServletRequest(); - request.setAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, "/js/"); - request.setMethod("GET"); - MockHttpServletResponse response = new MockHttpServletResponse(); - handler.handleRequest(request, response); - assertEquals(404, response.getStatus()); + this.request.setAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, "/js/"); + this.handler.handleRequest(this.request, this.response); + assertEquals(404, this.response.getStatus()); } @Test public void missingResourcePath() throws Exception { - MockHttpServletRequest request = new MockHttpServletRequest(); - request.setAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, ""); - request.setMethod("GET"); - MockHttpServletResponse response = new MockHttpServletResponse(); - handler.handleRequest(request, response); - assertEquals(404, response.getStatus()); + this.request.setAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, ""); + this.handler.handleRequest(this.request, this.response); + assertEquals(404, this.response.getStatus()); } @Test(expected=IllegalStateException.class) public void noPathWithinHandlerMappingAttribute() throws Exception { - MockHttpServletRequest request = new MockHttpServletRequest(); - request.setMethod("GET"); - MockHttpServletResponse response = new MockHttpServletResponse(); - handler.handleRequest(request, response); + this.handler.handleRequest(this.request, this.response); } @Test(expected=HttpRequestMethodNotSupportedException.class) public void unsupportedHttpMethod() throws Exception { - MockHttpServletRequest request = new MockHttpServletRequest(); - request.setAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, "/foo.css"); - request.setMethod("POST"); - MockHttpServletResponse response = new MockHttpServletResponse(); - handler.handleRequest(request, response); + this.request.setAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, "/foo.css"); + this.request.setMethod("POST"); + this.handler.handleRequest(this.request, this.response); } @Test public void resourceNotFound() throws Exception { - MockHttpServletRequest request = new MockHttpServletRequest(); - request.setAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, "/not-there.css"); - request.setMethod("GET"); - MockHttpServletResponse response = new MockHttpServletResponse(); - handler.handleRequest(request, response); - assertEquals(404, response.getStatus()); + this.request.setAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, "/not-there.css"); + this.handler.handleRequest(this.request, this.response); + assertEquals(404, this.response.getStatus()); + } + + private long headerAsLong(String responseHeaderName) { + return Long.valueOf(this.response.getHeader(responseHeaderName)); + } + + private long resourceLastModified(String resourceName) throws IOException { + return new ClassPathResource(resourceName, getClass()).getFile().lastModified(); } diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceTransformerSupportTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceTransformerSupportTests.java index f3f2f96082..dd5511d590 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceTransformerSupportTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceTransformerSupportTests.java @@ -17,7 +17,7 @@ package org.springframework.web.servlet.resource; import static org.junit.Assert.assertEquals; -import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -48,93 +48,61 @@ public class ResourceTransformerSupportTests { @Before public void setUp() { - VersionResourceResolver versionResolver = new VersionResourceResolver(); - versionResolver.setStrategyMap(Collections.singletonMap("/**", new ContentVersionStrategy())); - - List resolvers = new ArrayList<>(); - resolvers.add(versionResolver); - resolvers.add(new PathResourceResolver()); + VersionResourceResolver resolver = new VersionResourceResolver(); + resolver.setStrategyMap(Collections.singletonMap("/**", new ContentVersionStrategy())); + List resolvers = Arrays.asList(resolver, new PathResourceResolver()); this.transformerChain = new DefaultResourceTransformerChain(new DefaultResourceResolverChain(resolvers), null); - List locations = new ArrayList<>(); - locations.add(new ClassPathResource("test/", getClass())); + this.transformer = new TestResourceTransformerSupport(); + this.transformer.setResourceUrlProvider(createResourceUrlProvider(resolvers)); + + this.request = new MockHttpServletRequest("GET", ""); + } + protected ResourceUrlProvider createResourceUrlProvider(List resolvers) { ResourceHttpRequestHandler handler = new ResourceHttpRequestHandler(); - handler.setLocations(locations); + handler.setLocations(Arrays.asList(new ClassPathResource("test/", getClass()))); handler.setResourceResolvers(resolvers); - ResourceUrlProvider urlProvider = new ResourceUrlProvider(); urlProvider.setHandlerMap(Collections.singletonMap("/resources/**", handler)); - - this.transformer = new TestResourceTransformerSupport(); - this.transformer.setResourceUrlProvider(urlProvider); - - this.request = new MockHttpServletRequest(); + return urlProvider; } - @Test - public void rewriteAbsolutePathWithContext() throws Exception { - this.request.setRequestURI("/servlet/context/resources/main.css"); - this.request.setMethod("GET"); - this.request.setServletPath("/servlet"); - this.request.setContextPath("/context"); - this.request.setAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, "/resources/main.css"); - - String resourcePath = "/servlet/context/resources/bar.css"; - Resource mainCss = new ClassPathResource("test/main.css", getClass()); - String actual = this.transformer.resolveUrlPath(resourcePath, this.request, mainCss, this.transformerChain); - assertEquals("/servlet/context/resources/bar-11e16cf79faee7ac698c805cf28248d2.css", actual); - } @Test - public void rewriteAbsolutePath() throws Exception { - this.request.setRequestURI("/resources/main.css"); - this.request.setMethod("GET"); + public void resolveUrlPath() throws Exception { + this.request.setRequestURI("/context/servlet/resources/main.css"); this.request.setAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, "/resources/main.css"); - String resourcePath = "/resources/bar.css"; - Resource mainCss = new ClassPathResource("test/main.css", getClass()); - String actual = this.transformer.resolveUrlPath(resourcePath, this.request, mainCss, this.transformerChain); - assertEquals("/resources/bar-11e16cf79faee7ac698c805cf28248d2.css", actual); - - actual = this.transformer.resolveUrlPath("bar.css", this.request, mainCss, this.transformerChain); - assertEquals("bar-11e16cf79faee7ac698c805cf28248d2.css", actual); + String resourcePath = "/context/servlet/resources/bar.css"; + Resource css = new ClassPathResource("test/main.css", getClass()); + String actual = this.transformer.resolveUrlPath(resourcePath, this.request, css, this.transformerChain); + assertEquals("/context/servlet/resources/bar-11e16cf79faee7ac698c805cf28248d2.css", actual); } @Test - public void rewriteRelativePath() throws Exception { - this.request.setRequestURI("/servlet/context/resources/main.css"); - this.request.setMethod("GET"); - this.request.setServletPath("/servlet"); + public void resolveUrlPathWithoutHandlerMappingAttribute() throws Exception { + this.request.setRequestURI("/context/servlet/resources/main.css"); this.request.setContextPath("/context"); - this.request.setAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, "/resources/main.css"); - - Resource mainCss = new ClassPathResource("test/main.css", getClass()); - String actual = this.transformer.resolveUrlPath("bar.css", this.request, mainCss, this.transformerChain); - assertEquals("bar-11e16cf79faee7ac698c805cf28248d2.css", actual); - } - - @Test(expected = IllegalStateException.class) - public void rewriteAbsolutePathWrongPath() throws Exception { - this.request.setRequestURI("/servlet/context/resources/main.css"); - this.request.setMethod("GET"); this.request.setServletPath("/servlet"); - this.request.setContextPath("/context"); - this.request.setAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, "/wrong/main.css"); - String resourcePath = "/servlet/context/resources/bar.css"; - Resource mainCss = new ClassPathResource("test/main.css", getClass()); - this.transformer.resolveUrlPath(resourcePath, this.request, mainCss, this.transformerChain); + String resourcePath = "/context/servlet/resources/bar.css"; + Resource css = new ClassPathResource("test/main.css", getClass()); + String actual = this.transformer.resolveUrlPath(resourcePath, this.request, css, this.transformerChain); + assertEquals("/context/servlet/resources/bar-11e16cf79faee7ac698c805cf28248d2.css", actual); } @Test - public void rewriteRelativePathUpperLevel() throws Exception { - this.request.setRequestURI("/servlet/context/resources/images/image.png"); - this.request.setMethod("GET"); - this.request.setServletPath("/servlet"); - this.request.setContextPath("/context"); - this.request.setAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, "/resources/images/image.png"); + public void resolveUrlPathWithRelativePath() throws Exception { + this.request.setRequestURI("/context/servlet/resources/main.css"); + Resource css = new ClassPathResource("test/main.css", getClass()); + String actual = this.transformer.resolveUrlPath("bar.css", this.request, css, this.transformerChain); + assertEquals("bar-11e16cf79faee7ac698c805cf28248d2.css", actual); + } + @Test + public void resolveUrlPathWithRelativePathInParentDirectory() throws Exception { + this.request.setRequestURI("/context/servlet/resources/images/image.png"); Resource imagePng = new ClassPathResource("test/images/image.png", getClass()); String actual = this.transformer.resolveUrlPath("../bar.css", this.request, imagePng, this.transformerChain); assertEquals("../bar-11e16cf79faee7ac698c805cf28248d2.css", actual); diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceUrlProviderJavaConfigTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceUrlProviderJavaConfigTests.java index 7cfbcafa63..1531928c3a 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceUrlProviderJavaConfigTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceUrlProviderJavaConfigTests.java @@ -47,68 +47,66 @@ public class ResourceUrlProviderJavaConfigTests { private MockHttpServletRequest request; + private MockHttpServletResponse response; + @Before @SuppressWarnings("resource") public void setup() throws Exception { - this.filterChain = new MockFilterChain(this.servlet, new ResourceUrlEncodingFilter()); - AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); - ctx.setServletContext(new MockServletContext()); - ctx.register(WebConfig.class); - ctx.refresh(); - - ResourceUrlProvider urlProvider = ctx.getBean(ResourceUrlProvider.class); + AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); + context.setServletContext(new MockServletContext()); + context.register(WebConfig.class); + context.refresh(); this.request = new MockHttpServletRequest("GET", "/"); - request.setAttribute(ResourceUrlProviderExposingInterceptor.RESOURCE_URL_PROVIDER_ATTR, urlProvider); + this.request.setContextPath("/myapp"); + this.response = new MockHttpServletResponse(); + + Object urlProvider = context.getBean(ResourceUrlProvider.class); + this.request.setAttribute(ResourceUrlProviderExposingInterceptor.RESOURCE_URL_PROVIDER_ATTR, urlProvider); } @Test - public void rootServletMapping() throws Exception { - - this.request.setRequestURI("/"); - this.request.setMethod("GET"); - this.request.setRequestURI("/myapp/index.html"); - this.request.setContextPath("/myapp"); - this.request.setServletPath("/index.html"); - this.filterChain.doFilter(request, new MockHttpServletResponse()); + public void resolvePathWithRootServletMapping() throws Exception { + this.request.setRequestURI("/myapp/index"); + this.request.setServletPath("/index"); + this.filterChain.doFilter(this.request, this.response); - String actual = this.servlet.response.encodeURL("/myapp/resources/foo.css"); - assertEquals("/myapp/resources/foo-e36d2e05253c6c7085a91522ce43a0b4.css", actual); + assertEquals("/myapp/resources/foo-e36d2e05253c6c7085a91522ce43a0b4.css", + resolvePublicResourceUrlPath("/myapp/resources/foo.css")); } @Test - public void prefixServletMapping() throws Exception { - - this.request.setRequestURI("/myapp/myservlet/index.html"); - this.request.setContextPath("/myapp"); + public void resolvePathWithPrefixServletMapping() throws Exception { + this.request.setRequestURI("/myapp/myservlet/index"); this.request.setServletPath("/myservlet"); - this.filterChain.doFilter(request, new MockHttpServletResponse()); + this.filterChain.doFilter(this.request, this.response); - String actual = this.servlet.response.encodeURL("/myapp/myservlet/resources/foo.css"); - assertEquals("/myapp/myservlet/resources/foo-e36d2e05253c6c7085a91522ce43a0b4.css", actual); + assertEquals("/myapp/myservlet/resources/foo-e36d2e05253c6c7085a91522ce43a0b4.css", + resolvePublicResourceUrlPath("/myapp/myservlet/resources/foo.css")); } @Test - public void extensionServletMapping() throws Exception { - + public void resolvePathWithExtensionServletMapping() throws Exception { this.request.setRequestURI("/myapp/index.html"); - this.request.setContextPath("/myapp"); this.request.setServletPath("/index.html"); - this.filterChain.doFilter(request, new MockHttpServletResponse()); + this.filterChain.doFilter(this.request, this.response); + + assertEquals("/myapp/resources/foo-e36d2e05253c6c7085a91522ce43a0b4.css", + resolvePublicResourceUrlPath("/myapp/resources/foo.css")); + } - String actual = this.servlet.response.encodeURL("/myapp/resources/foo.css"); - assertEquals("/myapp/resources/foo-e36d2e05253c6c7085a91522ce43a0b4.css", actual); + private String resolvePublicResourceUrlPath(String path) { + return this.servlet.wrappedResponse.encodeURL(path); } @Configuration static class WebConfig extends WebMvcConfigurationSupport { - @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/resources/**") @@ -120,11 +118,11 @@ public class ResourceUrlProviderJavaConfigTests { @SuppressWarnings("serial") private static class TestServlet extends HttpServlet { - private HttpServletResponse response; + private HttpServletResponse wrappedResponse; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) { - this.response = response; + this.wrappedResponse = response; } } -- GitLab