提交 fa4ba2a8 编写于 作者: R Rossen Stoyanchev

Polish resource handling tests

上级 859e1e80
......@@ -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);
List<ResourceResolver> resolvers = new ArrayList<ResourceResolver>();
resolvers.add(versionResolver);
resolvers.add(new PathResourceResolver());
ResourceResolverChain resolverChain = new DefaultResourceResolverChain(resolvers);
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<ResourceTransformer> 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);
}
}
/*
* 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");
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.<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.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.<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));
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);
......
......@@ -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;
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册