Let MimeUtilFileTypeRegistry check InputStream
While MimeUtilFileTypeRegistry can take a byte array, for
large files we want to be able to give it an InputStream as well,
so that we don't run out of memory on large blobs.
Change-Id: Id566acb04220f89d529ac69de2618bc4d3e2b6f7
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mime/FileTypeRegistry.java b/gerrit-server/src/main/java/com/google/gerrit/server/mime/FileTypeRegistry.java
index e9e3c71..15ee1bd 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mime/FileTypeRegistry.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/mime/FileTypeRegistry.java
@@ -16,6 +16,7 @@
import eu.medsea.mimeutil.MimeType;
import eu.medsea.mimeutil.MimeUtil2;
+import java.io.InputStream;
public interface FileTypeRegistry {
/**
@@ -33,6 +34,20 @@
MimeType getMimeType(String path, byte[] content);
/**
+ * Get the most specific MIME type available for a file.
+ *
+ * @param path name of the file. The base name (component after the last '/') may be used to help
+ * determine the MIME type, such as by examining the extension (portion after the last '.' if
+ * present).
+ * @param is InputStream corresponding to the complete file content. The content may be used to
+ * guess the MIME type by examining the beginning for common file headers.
+ * @return the MIME type for this content. If the MIME type is not recognized or cannot be
+ * determined, {@link MimeUtil2#UNKNOWN_MIME_TYPE} which is an alias for {@code
+ * application/octet-stream}.
+ */
+ MimeType getMimeType(String path, InputStream is);
+
+ /**
* Is this content type safe to transmit to a browser directly?
*
* @param type the MIME type of the file content.
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mime/MimeUtilFileTypeRegistry.java b/gerrit-server/src/main/java/com/google/gerrit/server/mime/MimeUtilFileTypeRegistry.java
index 859363c..77ba79d 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mime/MimeUtilFileTypeRegistry.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/mime/MimeUtilFileTypeRegistry.java
@@ -20,6 +20,7 @@
import eu.medsea.mimeutil.MimeException;
import eu.medsea.mimeutil.MimeType;
import eu.medsea.mimeutil.MimeUtil2;
+import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@@ -87,6 +88,23 @@
log.warn("Unable to determine MIME type from content", e);
}
}
+ return getMimeType(mimeTypes, path);
+ }
+
+ @Override
+ @SuppressWarnings("unchecked")
+ public MimeType getMimeType(final String path, final InputStream is) {
+ Set<MimeType> mimeTypes = new HashSet<>();
+ try {
+ mimeTypes.addAll(mimeUtil.getMimeTypes(is));
+ } catch (MimeException e) {
+ log.warn("Unable to determine MIME type from content", e);
+ }
+ return getMimeType(mimeTypes, path);
+ }
+
+ @SuppressWarnings("unchecked")
+ private MimeType getMimeType(Set<MimeType> mimeTypes, final String path) {
try {
mimeTypes.addAll(mimeUtil.getMimeTypes(path));
} catch (MimeException e) {