You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by mg...@apache.org on 2013/05/02 17:25:02 UTC

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

Updated Branches:
  refs/heads/master 05f7207fc -> 46f1835d6


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/master
Commit: 46f1835d67fa94392007e8b07c91f218cf954433
Parents: 05f7207
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Thu May 2 17:24:41 2013 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
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")));
 	}
 
 	/**