|
|
|
|
@@ -14,6 +14,7 @@ import org.springframework.core.io.ClassPathResource;
|
|
|
|
|
import org.springframework.core.io.Resource;
|
|
|
|
|
import org.springframework.mock.web.MockHttpServletRequest;
|
|
|
|
|
import org.springframework.mock.web.MockHttpServletResponse;
|
|
|
|
|
import org.springframework.mock.web.MockServletContext;
|
|
|
|
|
import org.springframework.web.HttpRequestMethodNotSupportedException;
|
|
|
|
|
import org.springframework.web.servlet.HandlerMapping;
|
|
|
|
|
|
|
|
|
|
@@ -27,6 +28,7 @@ public class ResourceHttpRequestHandlerTests {
|
|
|
|
|
resourcePaths.add(new ClassPathResource("test/", getClass()));
|
|
|
|
|
resourcePaths.add(new ClassPathResource("testalternatepath/", getClass()));
|
|
|
|
|
handler = new ResourceHttpRequestHandler(resourcePaths);
|
|
|
|
|
handler.setServletContext(new TestServletContext());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
@@ -45,6 +47,30 @@ public class ResourceHttpRequestHandlerTests {
|
|
|
|
|
assertEquals("h1 { color:red; }", response.getContentAsString());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
public void getResourceWithJafProvidedMediaType() 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)response.getHeader("Expires")) > System.currentTimeMillis() + (31556926 * 1000) - 10000);
|
|
|
|
|
assertEquals("max-age=31556926", response.getHeader("Cache-Control"));
|
|
|
|
|
assertTrue(response.containsHeader("Last-Modified"));
|
|
|
|
|
assertEquals(response.getHeader("Last-Modified"), new ClassPathResource("test/foo.html", getClass()).getFile().lastModified());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
public void getResourceWithUnknownMediaType() throws Exception {
|
|
|
|
|
MockHttpServletRequest request = new MockHttpServletRequest();
|
|
|
|
|
request.setAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, "/test.unknown");
|
|
|
|
|
request.setMethod("GET");
|
|
|
|
|
MockHttpServletResponse response = new MockHttpServletResponse();
|
|
|
|
|
handler.handleRequest(request, response);
|
|
|
|
|
assertEquals(404, response.getStatus());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
public void getResourceFromAlternatePath() throws Exception {
|
|
|
|
|
MockHttpServletRequest request = new MockHttpServletRequest();
|
|
|
|
|
@@ -84,12 +110,14 @@ public class ResourceHttpRequestHandlerTests {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
public void lastModified() throws Exception {
|
|
|
|
|
public void notModified() throws Exception {
|
|
|
|
|
MockHttpServletRequest request = new MockHttpServletRequest();
|
|
|
|
|
request.setAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, "/foo.css");
|
|
|
|
|
long expected = new ClassPathResource("test/foo.css", getClass()).lastModified();
|
|
|
|
|
long lastModified = handler.getLastModified(request);
|
|
|
|
|
assertEquals(expected, lastModified);
|
|
|
|
|
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());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
@@ -150,4 +178,75 @@ public class ResourceHttpRequestHandlerTests {
|
|
|
|
|
handler.handleRequest(request, response);
|
|
|
|
|
assertEquals(404, response.getStatus());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test(expected=IllegalArgumentException.class)
|
|
|
|
|
public void invalidPath() throws Exception {
|
|
|
|
|
List<Resource> resourcePaths = new ArrayList<Resource>();
|
|
|
|
|
resourcePaths.add(new ClassPathResource("testalternatepath", getClass()));
|
|
|
|
|
handler = new ResourceHttpRequestHandler(resourcePaths);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test(expected=IllegalArgumentException.class)
|
|
|
|
|
public void pathDoesNotExist() throws Exception {
|
|
|
|
|
List<Resource> resourcePaths = new ArrayList<Resource>();
|
|
|
|
|
resourcePaths.add(new ClassPathResource("bogus/"));
|
|
|
|
|
handler = new ResourceHttpRequestHandler(resourcePaths);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
public void getResourceOfAddedAllowedMimeType() throws Exception{
|
|
|
|
|
List<Resource> resourcePaths = new ArrayList<Resource>();
|
|
|
|
|
resourcePaths.add(new ClassPathResource("test/", getClass()));
|
|
|
|
|
handler = new ResourceHttpRequestHandler(resourcePaths, "text/plain");
|
|
|
|
|
handler.setServletContext(new TestServletContext());
|
|
|
|
|
|
|
|
|
|
MockHttpServletRequest request = new MockHttpServletRequest();
|
|
|
|
|
request.setAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, "/foo.txt");
|
|
|
|
|
request.setMethod("GET");
|
|
|
|
|
MockHttpServletResponse response = new MockHttpServletResponse();
|
|
|
|
|
handler.handleRequest(request, response);
|
|
|
|
|
assertEquals("text/plain", response.getContentType());
|
|
|
|
|
assertTrue(((Long)response.getHeader("Expires")) > System.currentTimeMillis() + (31556926 * 1000) - 10000);
|
|
|
|
|
assertEquals("max-age=31556926", response.getHeader("Cache-Control"));
|
|
|
|
|
assertTrue(response.containsHeader("Last-Modified"));
|
|
|
|
|
assertEquals(response.getHeader("Last-Modified"), new ClassPathResource("test/foo.txt", getClass()).getFile().lastModified());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
public void getResourceWithDefaultMimeTypesOverriden() throws Exception{
|
|
|
|
|
List<Resource> resourcePaths = new ArrayList<Resource>();
|
|
|
|
|
resourcePaths.add(new ClassPathResource("test/", getClass()));
|
|
|
|
|
handler = new ResourceHttpRequestHandler(resourcePaths, "text/plain", true);
|
|
|
|
|
handler.setServletContext(new TestServletContext());
|
|
|
|
|
|
|
|
|
|
MockHttpServletRequest request = new MockHttpServletRequest();
|
|
|
|
|
request.setAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, "/foo.txt");
|
|
|
|
|
request.setMethod("GET");
|
|
|
|
|
MockHttpServletResponse response = new MockHttpServletResponse();
|
|
|
|
|
handler.handleRequest(request, response);
|
|
|
|
|
assertEquals("text/plain", response.getContentType());
|
|
|
|
|
assertTrue(((Long)response.getHeader("Expires")) > System.currentTimeMillis() + (31556926 * 1000) - 10000);
|
|
|
|
|
assertEquals("max-age=31556926", response.getHeader("Cache-Control"));
|
|
|
|
|
assertTrue(response.containsHeader("Last-Modified"));
|
|
|
|
|
assertEquals(response.getHeader("Last-Modified"), new ClassPathResource("test/foo.txt", getClass()).getFile().lastModified());
|
|
|
|
|
|
|
|
|
|
request = new MockHttpServletRequest();
|
|
|
|
|
request.setAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, "/foo.css");
|
|
|
|
|
request.setMethod("GET");
|
|
|
|
|
response = new MockHttpServletResponse();
|
|
|
|
|
handler.handleRequest(request, response);
|
|
|
|
|
assertEquals(404, response.getStatus());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static class TestServletContext extends MockServletContext {
|
|
|
|
|
@Override
|
|
|
|
|
public String getMimeType(String filePath) {
|
|
|
|
|
if(filePath.endsWith(".css")) {
|
|
|
|
|
return "text/css";
|
|
|
|
|
} else if (filePath.endsWith(".js")) {
|
|
|
|
|
return "text/javascript";
|
|
|
|
|
}
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|