Alon Bar-Lev has uploaded a new change for review. Change subject: utils: ServletUtils: support If-Last-Modified header for static content ......................................................................
utils: ServletUtils: support If-Last-Modified header for static content Change-Id: I9b6c30f1ff8f51c5370074de1186a3f7a7cfeac7 Signed-off-by: Alon Bar-Lev <[email protected]> --- M backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/servlet/ServletUtils.java M backend/manager/modules/utils/src/test/java/org/ovirt/engine/core/utils/servlet/ServletUtilsTest.java 2 files changed, 69 insertions(+), 3 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/97/15997/1 diff --git a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/servlet/ServletUtils.java b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/servlet/ServletUtils.java index a831365..4e915da 100644 --- a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/servlet/ServletUtils.java +++ b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/servlet/ServletUtils.java @@ -55,12 +55,20 @@ * @throws IOException */ public static void sendFile(final HttpServletRequest request, final HttpServletResponse response, final File file, final String defaultType) throws IOException { + long ifModSince = -1; + // Make sure the file exits and is readable and send a 404 error // response if it doesn't: if (!canReadFile(file)) { - log.error("Can't read file \"" + file.getAbsolutePath() + "\" for request \"" + request.getRequestURI() + "\", will send a 404 error response."); + log.error("Can't read file \"" + (file != null ? file.getAbsolutePath() : "") + "\" for request \"" + request.getRequestURI() + "\", will send a 404 error response."); response.sendError(HttpServletResponse.SC_NOT_FOUND); return; + } + + try { + ifModSince = request.getDateHeader("If-Modified-Since"); + } catch (IllegalArgumentException e) { + log.error("Unable to parse If-Modified-Since header.", e); } // Find the MIME type: @@ -72,7 +80,15 @@ response.setContentType(mime); response.setContentLength((int) getFileSize(file)); - writeFileToStream(response.getOutputStream(), file); + // Set last modified: + response.setDateHeader("Last-Modified", file.lastModified()); + + if (ifModSince != -1 && ifModSince >= file.lastModified()) { + response.setStatus(HttpServletResponse.SC_NOT_MODIFIED); + } + else { + writeFileToStream(response.getOutputStream(), file); + } } /** @@ -81,7 +97,7 @@ * @return */ public static boolean canReadFile(final File file) { - return file != null && file.exists() && file.canRead(); + return file != null && file.exists() && file.canRead() && !file.isDirectory(); } /** diff --git a/backend/manager/modules/utils/src/test/java/org/ovirt/engine/core/utils/servlet/ServletUtilsTest.java b/backend/manager/modules/utils/src/test/java/org/ovirt/engine/core/utils/servlet/ServletUtilsTest.java index 9507882..7603071 100644 --- a/backend/manager/modules/utils/src/test/java/org/ovirt/engine/core/utils/servlet/ServletUtilsTest.java +++ b/backend/manager/modules/utils/src/test/java/org/ovirt/engine/core/utils/servlet/ServletUtilsTest.java @@ -221,4 +221,54 @@ return null; } } + + /** + * Test method for {@link org.ovirt.engine.core.utils.servlet.ServletUtils#sendFile(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.io.File, java.lang.String)}. + * @throws IOException + */ + @Test + public void testSendFile_Modified() throws IOException { + HttpServletRequest mockRequest = mock(HttpServletRequest.class); + HttpServletResponse mockResponse = mock(HttpServletResponse.class); + ServletOutputStream responseOut = mock(ServletOutputStream.class); + when(mockResponse.getOutputStream()).thenReturn(responseOut); + File file = createTempPng(); + ServletUtils.sendFile(mockRequest, mockResponse, file, null); + //Check modified header + verify(mockResponse).setDateHeader("Last-Modified", file.lastModified()); + } + + /** + * Test method for {@link org.ovirt.engine.core.utils.servlet.ServletUtils#sendFile(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.io.File, java.lang.String)}. + * @throws IOException + */ + @Test + public void testSendFile_IfModifiedSince_cache() throws IOException { + HttpServletRequest mockRequest = mock(HttpServletRequest.class); + HttpServletResponse mockResponse = mock(HttpServletResponse.class); + ServletOutputStream responseOut = mock(ServletOutputStream.class); + File file = createTempPng(); + when(mockResponse.getOutputStream()).thenReturn(responseOut); + when(mockRequest.getDateHeader("If-Modified-Since")).thenReturn(file.lastModified()); + ServletUtils.sendFile(mockRequest, mockResponse, file, null); + verify(mockResponse).setStatus(HttpServletResponse.SC_NOT_MODIFIED); + } + + /** + * Test method for {@link org.ovirt.engine.core.utils.servlet.ServletUtils#sendFile(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.io.File, java.lang.String)}. + * @throws IOException + */ + @Test + public void testSendFile_IfModifiedSince_modified() throws IOException { + HttpServletRequest mockRequest = mock(HttpServletRequest.class); + HttpServletResponse mockResponse = mock(HttpServletResponse.class); + ServletOutputStream responseOut = mock(ServletOutputStream.class); + File file = createTempPng(); + when(mockRequest.getDateHeader("If-Modified-Since")).thenReturn(file.lastModified()-100); + when(mockResponse.getOutputStream()).thenReturn(responseOut); + ServletUtils.sendFile(mockRequest, mockResponse, file, null); + //Make sure the stream is written to. + verify(responseOut).write((byte[]) anyObject(), eq(0), anyInt()); + } + } -- To view, visit http://gerrit.ovirt.org/15997 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I9b6c30f1ff8f51c5370074de1186a3f7a7cfeac7 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Alon Bar-Lev <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
