You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by lq...@apache.org on 2016/09/13 13:47:24 UTC
svn commit: r1760546 - in
/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server:
model/Queue.java queue/AbstractQueue.java
Author: lquack
Date: Tue Sep 13 13:47:24 2016
New Revision: 1760546
URL: http://svn.apache.org/viewvc?rev=1760546&view=rev
Log:
QPID-7382: [Java Broker] Use correct encoding in Content-Disposition header.
When downloading a message ensure the filename in the Content-Disposition
header is ASCII and provide a filename* field with the UTF8 name.
Modified:
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Queue.java
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/AbstractQueue.java
Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Queue.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Queue.java?rev=1760546&r1=1760545&r2=1760546&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Queue.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Queue.java Tue Sep 13 13:47:24 2016
@@ -94,6 +94,16 @@ public interface Queue<X extends Queue<X
@ManagedContextDefault(name = MAX_ASYNCHRONOUS_DELIVERIES )
int DEFAULT_MAX_ASYNCHRONOUS_DELIVERIES = 80;
+ String MIME_TYPE_TO_FILE_EXTENSION = "qpid.mimeTypeToFileExtension";
+ @SuppressWarnings("unused")
+ @ManagedContextDefault(name = MIME_TYPE_TO_FILE_EXTENSION, description = "A mapping of MIME types to file extensions.")
+ String DEFAULT_MIME_TYPE_TO_FILE_EXTENSION = "{\"application/json\":\".json\","
+ + "\"application/pdf\":\".pdf\","
+ + "\"application/xml\":\".xml\","
+ + "\"image/jpeg\":\".jpg\","
+ + "\"image/tiff\":\".tiff\","
+ + "\"text/plain\":\".txt\"}";
+
@ManagedAttribute
Exchange getAlternateExchange();
Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/AbstractQueue.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/AbstractQueue.java?rev=1760546&r1=1760545&r2=1760546&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/AbstractQueue.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/AbstractQueue.java Tue Sep 13 13:47:24 2016
@@ -18,6 +18,8 @@
*/
package org.apache.qpid.server.queue;
+import static org.apache.qpid.server.util.ParameterizedTypes.MAP_OF_STRING_STRING;
+
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
@@ -282,6 +284,7 @@ public abstract class AbstractQueue<X ex
private boolean _closing;
private final ConcurrentMap<String, Callable<MessageFilter>> _defaultFiltersMap = new ConcurrentHashMap<>();
private final List<HoldMethod> _holdMethods = new CopyOnWriteArrayList<>();
+ private Map<String, String> _mimeTypeToFileExtension = Collections.emptyMap();
private interface HoldMethod
{
@@ -487,6 +490,7 @@ public abstract class AbstractQueue<X ex
_estimatedAverageMessageHeaderSize = getContextValue(Long.class, QUEUE_ESTIMATED_MESSAGE_MEMORY_OVERHEAD);
_maxAsyncDeliveries = getContextValue(Integer.class, Queue.MAX_ASYNCHRONOUS_DELIVERIES);
+ _mimeTypeToFileExtension = getContextValue(Map.class, MAP_OF_STRING_STRING, MIME_TYPE_TO_FILE_EXTENSION);
if(_defaultFilters != null)
{
@@ -2752,10 +2756,22 @@ public abstract class AbstractQueue<X ex
{
try
{
- String disposition = String.format("attachment; filename=\"%s_msg%09d%s\"",
- URLEncoder.encode(getName(), UTF8),
- _messageReference.getMessage().getMessageNumber(),
- getContentType().startsWith("text") ? ".txt" : "");
+ String queueName = getName();
+ // replace all non-ascii and non-printable characters and all backslashes and percent encoded characters
+ // as suggested by rfc6266 Appendix D
+ String asciiQueueName = queueName.replaceAll("[^\\x20-\\x7E]", "?")
+ .replace('\\', '?')
+ .replaceAll("%[0-9a-fA-F]{2}", "?");
+ long messageNumber = _messageReference.getMessage().getMessageNumber();
+ String filenameExtension = _mimeTypeToFileExtension.get(getContentType());
+ filenameExtension = (filenameExtension == null ? "" : filenameExtension);
+ String disposition = String.format("attachment; filename=\"%s_msg%09d%s\"; filename*=\"UTF-8''%s_msg%09d%s\"",
+ asciiQueueName,
+ messageNumber,
+ filenameExtension,
+ URLEncoder.encode(queueName, UTF8),
+ messageNumber,
+ filenameExtension);
return disposition;
}
catch (UnsupportedEncodingException e)
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org