WICKET-4934 DownloadLink uses wrong encoding for spaces/non-ASCII characters


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/46f1835d
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/46f1835d
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/46f1835d

Branch: refs/heads/wicket-4774
Commit: 46f1835d67fa94392007e8b07c91f218cf954433
Parents: 05f7207
Author: Martin Tzvetanov Grigorov <[email protected]>
Authored: Thu May 2 17:24:41 2013 +0200
Committer: Martin Tzvetanov Grigorov <[email protected]>
Committed: Thu May 2 17:24:41 2013 +0200

----------------------------------------------------------------------
 .../wicket/markup/html/link/DownloadLink.java      |    3 -
 .../apache/wicket/examples/linkomatic/Home.java    |    2 +-
 .../apache/wicket/request/http/WebResponse.java    |   31 ++++++++++++---
 3 files changed, 26 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/46f1835d/wicket-core/src/main/java/org/apache/wicket/markup/html/link/DownloadLink.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/main/java/org/apache/wicket/markup/html/link/DownloadLink.java
 
b/wicket-core/src/main/java/org/apache/wicket/markup/html/link/DownloadLink.java
index 293a239..593c2a0 100644
--- 
a/wicket-core/src/main/java/org/apache/wicket/markup/html/link/DownloadLink.java
+++ 
b/wicket-core/src/main/java/org/apache/wicket/markup/html/link/DownloadLink.java
@@ -24,7 +24,6 @@ import org.apache.wicket.request.IRequestCycle;
 import org.apache.wicket.request.handler.resource.ResourceStreamRequestHandler;
 import org.apache.wicket.request.resource.ContentDisposition;
 import org.apache.wicket.settings.IResourceSettings;
-import org.apache.wicket.util.encoding.UrlEncoder;
 import org.apache.wicket.util.file.Files;
 import org.apache.wicket.util.lang.Args;
 import org.apache.wicket.util.resource.FileResourceStream;
@@ -165,8 +164,6 @@ public class DownloadLink extends Link<File>
                        fileName = file.getName();
                }
 
-               fileName = UrlEncoder.QUERY_INSTANCE.encode(fileName, 
getRequest().getCharset());
-
                IResourceStream resourceStream = new FileResourceStream(
                        new org.apache.wicket.util.file.File(file));
                getRequestCycle().scheduleRequestHandlerAfterCurrent(

http://git-wip-us.apache.org/repos/asf/wicket/blob/46f1835d/wicket-examples/src/main/java/org/apache/wicket/examples/linkomatic/Home.java
----------------------------------------------------------------------
diff --git 
a/wicket-examples/src/main/java/org/apache/wicket/examples/linkomatic/Home.java 
b/wicket-examples/src/main/java/org/apache/wicket/examples/linkomatic/Home.java
index 4d9bd27..4dbb982 100644
--- 
a/wicket-examples/src/main/java/org/apache/wicket/examples/linkomatic/Home.java
+++ 
b/wicket-examples/src/main/java/org/apache/wicket/examples/linkomatic/Home.java
@@ -176,7 +176,7 @@ public class Home extends WicketExamplePage
 
                                return tempFile;
                        }
-               
}).setCacheDuration(Duration.NONE).setDeleteAfterDownload(true));
+               }, "Downlöad\"here 
now.tmp").setCacheDuration(Duration.NONE).setDeleteAfterDownload(true));
 
                // redirect to external url form
                FeedbackPanel feedbackPanel = new FeedbackPanel("feedback");

http://git-wip-us.apache.org/repos/asf/wicket/blob/46f1835d/wicket-request/src/main/java/org/apache/wicket/request/http/WebResponse.java
----------------------------------------------------------------------
diff --git 
a/wicket-request/src/main/java/org/apache/wicket/request/http/WebResponse.java 
b/wicket-request/src/main/java/org/apache/wicket/request/http/WebResponse.java
index 3b1cd9a..0566d0c 100644
--- 
a/wicket-request/src/main/java/org/apache/wicket/request/http/WebResponse.java
+++ 
b/wicket-request/src/main/java/org/apache/wicket/request/http/WebResponse.java
@@ -21,6 +21,7 @@ import java.io.IOException;
 import javax.servlet.http.Cookie;
 
 import org.apache.wicket.request.Response;
+import org.apache.wicket.util.encoding.UrlEncoder;
 import org.apache.wicket.util.lang.Args;
 import org.apache.wicket.util.string.Strings;
 import org.apache.wicket.util.time.Duration;
@@ -110,28 +111,46 @@ public abstract class WebResponse extends Response
         * Convenience method for setting the content-disposition:attachment 
header. This header is used
         * if the response should prompt the user to download it as a file 
instead of opening in a
         * browser.
-        * 
+        * <p>
+        * The file name will be <a 
href="http://greenbytes.de/tech/tc2231/";>encoded</a>
+        *
         * @param filename
         *            file name of the attachment
         */
        public void setAttachmentHeader(final String filename)
        {
-               setHeader("Content-Disposition", "attachment" +
-                       ((!Strings.isEmpty(filename)) ? ("; filename=\"" + 
filename + "\"") : ""));
+               setHeader("Content-Disposition", "attachment" + 
encodeDispositionHeaderValue(filename));
        }
 
        /**
         * Convenience method for setting the content-disposition:inline 
header. This header is used if
         * the response should be shown embedded in browser window while having 
custom file name when
         * user saves the response. browser.
-        * 
+        * <p>
+        * The file name will be <a 
href="http://greenbytes.de/tech/tc2231/";>encoded</a>
+        *
         * @param filename
         *            file name of the attachment
         */
        public void setInlineHeader(final String filename)
        {
-               setHeader("Content-Disposition", "inline" +
-                       ((!Strings.isEmpty(filename)) ? ("; filename=\"" + 
filename + "\"") : ""));
+               setHeader("Content-Disposition", "inline" + 
encodeDispositionHeaderValue(filename));
+       }
+
+       /**
+        * <a href="http://greenbytes.de/tech/tc2231/";>Encodes</a> the value of 
the filename
+        * used in "Content-Disposition" response header
+        *
+        * @param filename
+        *          the non-encoded file name
+        * @return encoded filename
+        */
+       private String encodeDispositionHeaderValue(final String filename)
+       {
+               return  (Strings.isEmpty(filename) ?
+                                               "" :
+                                               String.format("; 
filename=\"%1$s\"; filename*=UTF-8''%1$s",
+                                                               
UrlEncoder.PATH_INSTANCE.encode(filename, "UTF-8")));
        }
 
        /**

Reply via email to