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"))); } /**
