Polish resource handling tests
This commit is contained in:
parent
859e1e8003
commit
fa4ba2a82b
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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<String, VersionStrategy> versionStrategyMap = new HashMap<>();
|
||||
versionStrategyMap.put("/**", new ContentVersionStrategy());
|
||||
VersionResourceResolver versionResolver = new VersionResourceResolver();
|
||||
versionResolver.setStrategyMap(versionStrategyMap);
|
||||
VersionResourceResolver resolver = new VersionResourceResolver();
|
||||
resolver.setStrategyMap(Collections.singletonMap("/**", new ContentVersionStrategy()));
|
||||
|
||||
List<ResourceResolver> resolvers = Arrays.asList(resolver, new PathResourceResolver());
|
||||
List<ResourceTransformer> transformers = Arrays.asList(new CssLinkResourceTransformer());
|
||||
|
||||
List<ResourceResolver> resolvers = new ArrayList<ResourceResolver>();
|
||||
resolvers.add(versionResolver);
|
||||
resolvers.add(new PathResourceResolver());
|
||||
ResourceResolverChain resolverChain = new DefaultResourceResolverChain(resolvers);
|
||||
|
||||
List<ResourceTransformer> transformers = new ArrayList<>();
|
||||
transformers.add(new CssLinkResourceTransformer());
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<Resource> resourcePaths = new ArrayList<Resource>();
|
||||
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<Resource> 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");
|
||||
this.request.setAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, "../testsecret/secret.txt");
|
||||
this.handler.handleRequest(this.request, this.response);
|
||||
assertEquals(404, this.response.getStatus());
|
||||
|
||||
request.setAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, "../testsecret/secret.txt");
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
handler.handleRequest(request, response);
|
||||
assertEquals(404, 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());
|
||||
|
||||
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.<Resource>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.handler.setLocations(Arrays.<Resource>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();
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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<ResourceResolver> resolvers = new ArrayList<>();
|
||||
resolvers.add(versionResolver);
|
||||
resolvers.add(new PathResourceResolver());
|
||||
VersionResourceResolver resolver = new VersionResourceResolver();
|
||||
resolver.setStrategyMap(Collections.singletonMap("/**", new ContentVersionStrategy()));
|
||||
List<ResourceResolver> resolvers = Arrays.asList(resolver, new PathResourceResolver());
|
||||
this.transformerChain = new DefaultResourceTransformerChain(new DefaultResourceResolverChain(resolvers), null);
|
||||
|
||||
List<Resource> 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<ResourceResolver> 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));
|
||||
return urlProvider;
|
||||
}
|
||||
|
||||
this.transformer = new TestResourceTransformerSupport();
|
||||
this.transformer.setResourceUrlProvider(urlProvider);
|
||||
|
||||
this.request = new MockHttpServletRequest();
|
||||
@Test
|
||||
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 = "/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 rewriteAbsolutePathWithContext() 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");
|
||||
this.request.setServletPath("/servlet");
|
||||
|
||||
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);
|
||||
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 rewriteAbsolutePath() throws Exception {
|
||||
this.request.setRequestURI("/resources/main.css");
|
||||
this.request.setMethod("GET");
|
||||
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);
|
||||
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 rewriteRelativePath() 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");
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
@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 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);
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
public void resolvePathWithRootServletMapping() throws Exception {
|
||||
this.request.setRequestURI("/myapp/index");
|
||||
this.request.setServletPath("/index");
|
||||
this.filterChain.doFilter(this.request, this.response);
|
||||
|
||||
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());
|
||||
|
||||
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);
|
||||
|
||||
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"));
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue