From d7284ccfe40f7028e880328566bb825ea31ad619 Mon Sep 17 00:00:00 2001
From: Anna Miroshnik <anna.miroshnik@arcadia.spb.ru>
Date: Thu, 12 Mar 2015 18:56:10 +0300
Subject: Format UTF-8 filenames correctly for download (#16556)

The code is the same for both FileDownloader and DownloadStream except
that FileDownloader forces the content-type to be an "attachment".

Change-Id: I50abf3b0f019b773bc0a44b16536a9479f9f472f
---
 .../src/com/vaadin/server/DownloadStreamTest.java  | 39 ++++++++++++++++++++++
 1 file changed, 39 insertions(+)
 create mode 100644 server/tests/src/com/vaadin/server/DownloadStreamTest.java

(limited to 'server/tests/src')

diff --git a/server/tests/src/com/vaadin/server/DownloadStreamTest.java b/server/tests/src/com/vaadin/server/DownloadStreamTest.java
new file mode 100644
index 0000000000..180b2e348b
--- /dev/null
+++ b/server/tests/src/com/vaadin/server/DownloadStreamTest.java
@@ -0,0 +1,39 @@
+package com.vaadin.server;
+
+import static org.mockito.Matchers.contains;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URLEncoder;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class DownloadStreamTest {
+    private String filename = "日本語.png";
+    private DownloadStream stream;
+
+    @Before
+    public void setup() {
+        stream = new DownloadStream(mock(InputStream.class), "", filename);
+    }
+
+    @Test
+    public void contentDispositionFilenameIsUtf8Encoded() throws IOException {
+        VaadinResponse response = mock(VaadinResponse.class);
+
+        stream.writeResponse(mock(VaadinRequest.class), response);
+
+        String encodedFileName = URLEncoder.encode(filename, "utf-8");
+        verify(response).setHeader(eq(DownloadStream.CONTENT_DISPOSITION),
+                contains(String.format("filename=\"%s\";", encodedFileName)));
+        verify(response)
+                .setHeader(
+                        eq(DownloadStream.CONTENT_DISPOSITION),
+                        contains(String.format("filename*=utf-8''%s",
+                                encodedFileName)));
+    }
+}
-- 
cgit v1.2.3