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

Reply via email to