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