Breaks AppResource404, BrowserFrameIsVisible and FlashIsVisible
This reverts commit af6dd56e89
.
Change-Id: I82fc9ef4c9d08dc8aa48e0fa137fae5782701389
tags/7.4.1^0
@@ -20,8 +20,6 @@ import java.io.IOException; | |||
import java.io.InputStream; | |||
import java.io.OutputStream; | |||
import java.io.Serializable; | |||
import java.io.UnsupportedEncodingException; | |||
import java.net.URLEncoder; | |||
import java.util.HashMap; | |||
import java.util.Iterator; | |||
import java.util.Map; | |||
@@ -282,9 +280,16 @@ public class DownloadStream implements Serializable { | |||
} | |||
} | |||
// Content-Disposition: attachment generally forces download | |||
response.setHeader("Content-Disposition", | |||
getContentDispositionValue()); | |||
// suggest local filename from DownloadStream if | |||
// Content-Disposition | |||
// not explicitly set | |||
String contentDispositionValue = getParameter("Content-Disposition"); | |||
if (contentDispositionValue == null) { | |||
contentDispositionValue = "filename=\"" + getFileName() | |||
+ "\""; | |||
response.setHeader("Content-Disposition", | |||
contentDispositionValue); | |||
} | |||
int bufferSize = getBufferSize(); | |||
if (bufferSize <= 0 || bufferSize > Constants.MAX_BUFFER_SIZE) { | |||
@@ -312,21 +317,6 @@ public class DownloadStream implements Serializable { | |||
} | |||
} | |||
private String getContentDispositionValue() | |||
throws UnsupportedEncodingException { | |||
String contentDispositionValue = getParameter("Content-Disposition"); | |||
if (contentDispositionValue == null) { | |||
String encodedFilename = URLEncoder.encode(getFileName(), "utf-8"); | |||
contentDispositionValue = String.format( | |||
"attachment; filename=\"%s\"; filename*=utf-8''%s", | |||
encodedFilename, encodedFilename); | |||
} | |||
return contentDispositionValue; | |||
} | |||
/** | |||
* Helper method that tries to close an output stream and ignores any | |||
* exceptions. |
@@ -141,6 +141,12 @@ public class FileDownloader extends AbstractExtension { | |||
} | |||
stream = ((ConnectorResource) resource).getStream(); | |||
if (stream.getParameter("Content-Disposition") == null) { | |||
// Content-Disposition: attachment generally forces download | |||
stream.setParameter("Content-Disposition", | |||
"attachment; filename=\"" + stream.getFileName() + "\""); | |||
} | |||
// Content-Type to block eager browser plug-ins from hijacking | |||
// the file | |||
if (isOverrideContentType()) { |
@@ -1,41 +0,0 @@ | |||
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 FileDownloaderTests { | |||
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); | |||
verify(response).setHeader(eq("Content-Disposition"), | |||
contains("attachment;")); | |||
String encodedFileName = URLEncoder.encode(filename, "utf-8"); | |||
verify(response).setHeader(eq("Content-Disposition"), | |||
contains(String.format("filename=\"%s\";", encodedFileName))); | |||
verify(response) | |||
.setHeader( | |||
eq("Content-Disposition"), | |||
contains(String.format("filename*=utf-8''%s", | |||
encodedFileName))); | |||
} | |||
} |