Author: jukka
Date: Fri Nov 11 11:25:34 2011
New Revision: 1200815
URL: http://svn.apache.org/viewvc?rev=1200815&view=rev
Log:
TIKA-780: Optimize loading of the media type registry
Add a maximum size limit to the static set of simple media types kept in
memory. This prevents a potential DOS attack against the library.
Fix handling of media type parameters.
Modified:
tika/trunk/tika-core/src/main/java/org/apache/tika/mime/MediaType.java
Modified: tika/trunk/tika-core/src/main/java/org/apache/tika/mime/MediaType.java
URL:
http://svn.apache.org/viewvc/tika/trunk/tika-core/src/main/java/org/apache/tika/mime/MediaType.java?rev=1200815&r1=1200814&r2=1200815&view=diff
==============================================================================
--- tika/trunk/tika-core/src/main/java/org/apache/tika/mime/MediaType.java
(original)
+++ tika/trunk/tika-core/src/main/java/org/apache/tika/mime/MediaType.java Fri
Nov 11 11:25:34 2011
@@ -17,8 +17,10 @@
package org.apache.tika.mime;
import java.io.Serializable;
+import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
+import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.SortedMap;
@@ -115,7 +117,8 @@ public final class MediaType implements
int slash = string.indexOf('/');
if (slash == -1) {
return null;
- } else if (isSimpleName(string.substring(0, slash))
+ } else if (SIMPLE_TYPES.size() < 10000
+ && isSimpleName(string.substring(0, slash))
&& isSimpleName(string.substring(slash + 1))) {
type = new MediaType(string, slash);
SIMPLE_TYPES.put(string, type);
@@ -228,18 +231,15 @@ public final class MediaType implements
builder.append(subtype);
SortedMap<String, String> map = new TreeMap<String, String>();
- if (!(parameters instanceof SortedMap<?, ?>)) {
- parameters = new TreeMap<String, String>(parameters);
- }
for (Map.Entry<String, String> entry : parameters.entrySet()) {
String key = entry.getKey().trim().toLowerCase(Locale.ENGLISH);
- String value = entry.getValue();
-
- map.put(key, value);
-
+ map.put(key, entry.getValue());
+ }
+ for (Map.Entry<String, String> entry : map.entrySet()) {
builder.append("; ");
- builder.append(key);
+ builder.append(entry.getKey());
builder.append("=");
+ String value = entry.getValue();
if (SPECIAL_OR_WHITESPACE.matcher(value).find()) {
builder.append('"');
builder.append(SPECIAL.matcher(value).replaceAll("\\\\$0"));