Shinsuke Sugaya 10 роки тому
батько
коміт
04e1ffd15d

+ 24 - 12
src/main/java/jp/sf/fess/helper/CrawlingConfigHelper.java

@@ -27,6 +27,7 @@ import java.net.URLEncoder;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
+import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
 import jp.sf.fess.Constants;
@@ -47,6 +48,7 @@ import org.codelibs.robot.entity.ResponseData;
 import org.codelibs.robot.util.StreamUtil;
 import org.seasar.framework.container.SingletonS2Container;
 import org.seasar.framework.util.Base64Util;
+import org.seasar.struts.util.RequestUtil;
 import org.seasar.struts.util.ResponseUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -182,10 +184,11 @@ public class CrawlingConfigHelper implements Serializable {
         }
         final ResponseData responseData = client.execute(RequestDataBuilder
                 .newRequestData().get().url(url).build());
+        final HttpServletRequest request = RequestUtil.getRequest();
         final HttpServletResponse response = ResponseUtil.getResponse();
-        writeFileName(response, responseData);
-        writeContentType(response, responseData);
-        writeNoCache(response, responseData);
+        writeFileName(request, response, responseData);
+        writeContentType(request, response, responseData);
+        writeNoCache(request, response, responseData);
         InputStream is = null;
         OutputStream os = null;
         try {
@@ -208,18 +211,27 @@ public class CrawlingConfigHelper implements Serializable {
         }
     }
 
-    protected void writeNoCache(final HttpServletResponse response,
-            final ResponseData responseData) {
-        response.setHeader("Pragma", "no-cache");
-        response.setHeader("Cache-Control", "no-cache");
+    protected void writeNoCache(final HttpServletRequest request,
+            final HttpServletResponse response, final ResponseData responseData) {
+        final UserAgentHelper userAgentHelper = ComponentUtil
+                .getUserAgentHelper();
+        int ieMajorVersion = userAgentHelper.getIEMajorVersion(request);
+        if (ieMajorVersion == 0 || ieMajorVersion > 9) {
+            response.setHeader("Pragma", "no-cache");
+            response.setHeader("Cache-Control", "no-cache");
+        } else {
+            response.setHeader("Pragma", "public");
+            response.setHeader("Cache-Control", "public");
+        }
         response.setHeader("Expires", "Thu, 01 Dec 1994 16:00:00 GMT");
     }
 
-    protected void writeFileName(final HttpServletResponse response,
-            final ResponseData responseData) {
+    protected void writeFileName(final HttpServletRequest request,
+            final HttpServletResponse response, final ResponseData responseData) {
         final UserAgentHelper userAgentHelper = ComponentUtil
                 .getUserAgentHelper();
-        final UserAgentType userAgentType = userAgentHelper.getUserAgentType();
+        final UserAgentType userAgentType = userAgentHelper
+                .getUserAgentType(request);
         String charset = responseData.getCharSet();
         if (charset == null) {
             charset = Constants.UTF_8;
@@ -274,8 +286,8 @@ public class CrawlingConfigHelper implements Serializable {
         }
     }
 
-    protected void writeContentType(final HttpServletResponse response,
-            final ResponseData responseData) {
+    protected void writeContentType(final HttpServletRequest request,
+            final HttpServletResponse response, final ResponseData responseData) {
         final String mimeType = responseData.getMimeType();
         if (logger.isDebugEnabled()) {
             logger.debug("mimeType: " + mimeType);

+ 30 - 0
src/main/java/jp/sf/fess/helper/UserAgentHelper.java

@@ -19,14 +19,23 @@ package jp.sf.fess.helper;
 import javax.servlet.http.HttpServletRequest;
 
 import org.seasar.struts.util.RequestUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class UserAgentHelper {
+    private static final Logger logger = LoggerFactory
+            .getLogger(UserAgentHelper.class);
+
     private static final String USER_AGENT = "user-agent";
 
     private static final String USER_AGENT_TYPE = "ViewHelper.UserAgent";
 
     public UserAgentType getUserAgentType() {
         final HttpServletRequest request = RequestUtil.getRequest();
+        return getUserAgentType(request);
+    }
+
+    public UserAgentType getUserAgentType(final HttpServletRequest request) {
         UserAgentType uaType = (UserAgentType) request
                 .getAttribute(USER_AGENT_TYPE);
         if (uaType == null) {
@@ -53,6 +62,27 @@ public class UserAgentHelper {
         return uaType;
     }
 
+    public int getIEMajorVersion(final HttpServletRequest request) {
+        UserAgentType userAgentType = getUserAgentType(request);
+        if (userAgentType == UserAgentType.IE) {
+            final String userAgent = request.getHeader(USER_AGENT);
+            try {
+                if (userAgent.contains("MSIE")) {
+                    String substring = userAgent.substring(
+                            userAgent.indexOf("MSIE")).split(";")[0];
+                    return Integer.parseInt(substring.split("[ \\.]")[1]);
+                } else if (userAgent.contains("rv")) {
+                    String substring = userAgent.substring(
+                            userAgent.indexOf("rv"), userAgent.indexOf(")"));
+                    return Integer.parseInt(substring.split("[ :\\.]")[1]);
+                }
+            } catch (Exception e) {
+                logger.debug("Invalid request header: " + userAgent, e);
+            }
+        }
+        return 0;
+    }
+
     public enum UserAgentType {
         IE, FIREFOX, CHROME, SAFARI, OPERA, OTHER;
     }

+ 86 - 0
src/test/java/jp/sf/fess/helper/UserAgentHelperTest.java

@@ -0,0 +1,86 @@
+/*
+ * Copyright 2009-2015 the CodeLibs Project and the Others.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ * either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+package jp.sf.fess.helper;
+
+import org.seasar.extension.unit.S2TestCase;
+
+public class UserAgentHelperTest extends S2TestCase {
+
+    public UserAgentHelper userAgentHelper;
+
+    @Override
+    protected String getRootDicon() throws Throwable {
+        return "app.dicon";
+    }
+
+    public void test_getIEMajorVersion_none() {
+        assertEquals(0, userAgentHelper.getIEMajorVersion(getRequest()));
+    }
+
+    public void test_getIEMajorVersion_empty() {
+        assertEquals(0, userAgentHelper.getIEMajorVersion(getRequest()));
+    }
+
+    public void test_getIEMajorVersion_ie6() {
+        getRequest().addHeader("user-agent",
+                "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
+        assertEquals(6, userAgentHelper.getIEMajorVersion(getRequest()));
+    }
+
+    public void test_getIEMajorVersion_ie7() {
+        getRequest().addHeader("user-agent",
+                "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; SV1)");
+        assertEquals(7, userAgentHelper.getIEMajorVersion(getRequest()));
+    }
+
+    public void test_getIEMajorVersion_ie8() {
+        getRequest()
+                .addHeader(
+                        "user-agent",
+                        "Mozilla/4.0 (compatible; GoogleToolbar 5.0.2124.2070; Windows 6.0; MSIE 8.0.6001.18241)");
+        assertEquals(8, userAgentHelper.getIEMajorVersion(getRequest()));
+    }
+
+    public void test_getIEMajorVersion_ie9() {
+        getRequest()
+                .addHeader("user-agent",
+                        "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/5.0)");
+        assertEquals(9, userAgentHelper.getIEMajorVersion(getRequest()));
+    }
+
+    public void test_getIEMajorVersion_ie10() {
+        getRequest()
+                .addHeader("user-agent",
+                        "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)");
+        assertEquals(10, userAgentHelper.getIEMajorVersion(getRequest()));
+    }
+
+    public void test_getIEMajorVersion_ie11() {
+        getRequest()
+                .addHeader("user-agent",
+                        "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko)");
+        assertEquals(11, userAgentHelper.getIEMajorVersion(getRequest()));
+    }
+
+    public void test_getIEMajorVersion_chome() {
+        getRequest()
+                .addHeader(
+                        "user-agent",
+                        "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.52 Safari/537.36");
+        assertEquals(0, userAgentHelper.getIEMajorVersion(getRequest()));
+    }
+}