瀏覽代碼

fix #811 encode redirected url

Shinsuke Sugaya 8 年之前
父節點
當前提交
a570239960
共有 1 個文件被更改,包括 22 次插入2 次删除
  1. 22 2
      src/main/java/org/codelibs/fess/app/web/go/GoAction.java

+ 22 - 2
src/main/java/org/codelibs/fess/app/web/go/GoAction.java

@@ -21,6 +21,7 @@ import java.net.URLEncoder;
 import java.util.Map;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
 
 import org.codelibs.core.lang.StringUtil;
 import org.codelibs.core.net.URLUtil;
@@ -41,6 +42,7 @@ import org.lastaflute.web.Execute;
 import org.lastaflute.web.response.ActionResponse;
 import org.lastaflute.web.response.HtmlResponse;
 import org.lastaflute.web.response.StreamResponse;
+import org.lastaflute.web.util.LaRequestUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -152,13 +154,31 @@ public class GoAction extends FessSearchAction {
                     return redirect(ErrorAction.class);
                 }
             } else {
-                return HtmlResponse.fromRedirectPathAsIs(targetUrl + hash);
+                return redirect(targetUrl + hash);
             }
         } else {
-            return HtmlResponse.fromRedirectPathAsIs(targetUrl + hash);
+            return redirect(targetUrl + hash);
         }
     }
 
+    protected ActionResponse redirect(final String url) {
+        final HttpServletRequest request2 = LaRequestUtil.getRequest();
+        final String enc = request2.getCharacterEncoding() == null ? Constants.UTF_8 : request2.getCharacterEncoding();
+        final StringBuilder buf = new StringBuilder(url.length() + 100);
+        for (final char c : url.toCharArray()) {
+            if (CharUtil.isUrlChar(c)) {
+                buf.append(c);
+            } else {
+                try {
+                    buf.append(URLEncoder.encode(String.valueOf(c), enc));
+                } catch (final UnsupportedEncodingException e) {
+                    buf.append(c);
+                }
+            }
+        }
+        return HtmlResponse.fromRedirectPathAsIs(buf.toString());
+    }
+
     protected boolean isFileSystemPath(final String url) {
         return url.startsWith("file:") || url.startsWith("smb:") || url.startsWith("ftp:");
     }