aboutsummaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
authorritchie <ritchie@gmx.at>2015-10-03 07:31:10 +0200
committerritchie <ritchie@gmx.at>2015-10-03 07:31:10 +0200
commit14d6e72cc194ace40662bdf9d81806f14e96d212 (patch)
tree68317044110f62451fc44b8eb066dc4f939e3db2 /core
parent8f5edfe4109511a25ccb16f526823435284481ad (diff)
downloadnanohttpd-14d6e72cc194ace40662bdf9d81806f14e96d212.tar.gz
easy way to add mime types fix #204
Diffstat (limited to 'core')
-rw-r--r--core/src/main/java/fi/iki/elonen/NanoHTTPD.java58
-rw-r--r--core/src/main/resources/META-INF/nanohttpd/default-mimetypes.properties30
-rw-r--r--core/src/main/resources/META-INF/nanohttpd/mimetypes.properties1
-rw-r--r--core/src/test/java/fi/iki/elonen/HttpSSLServerTest.java2
-rw-r--r--core/src/test/java/fi/iki/elonen/MimeTest.java62
-rw-r--r--core/src/test/resources/META-INF/nanohttpd/mimetypes.properties3
6 files changed, 155 insertions, 1 deletions
diff --git a/core/src/main/java/fi/iki/elonen/NanoHTTPD.java b/core/src/main/java/fi/iki/elonen/NanoHTTPD.java
index 3b3d019..0d30d9f 100644
--- a/core/src/main/java/fi/iki/elonen/NanoHTTPD.java
+++ b/core/src/main/java/fi/iki/elonen/NanoHTTPD.java
@@ -58,6 +58,7 @@ import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.net.SocketTimeoutException;
+import java.net.URL;
import java.net.URLDecoder;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
@@ -68,11 +69,13 @@ import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
+import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
+import java.util.Properties;
import java.util.StringTokenizer;
import java.util.TimeZone;
import java.util.logging.Level;
@@ -1574,6 +1577,45 @@ public abstract class NanoHTTPD {
private static final Logger LOG = Logger.getLogger(NanoHTTPD.class.getName());
/**
+ * Hashtable mapping (String)FILENAME_EXTENSION -> (String)MIME_TYPE
+ */
+ protected static Map<String, String> MIME_TYPES;
+
+ public static Map<String, String> mimeTypes() {
+ if (MIME_TYPES == null) {
+ MIME_TYPES = new HashMap<String, String>();
+ loadMimeTypes(MIME_TYPES, "META-INF/nanohttpd/default-mimetypes.properties");
+ loadMimeTypes(MIME_TYPES, "META-INF/nanohttpd/mimetypes.properties");
+ if (MIME_TYPES.isEmpty()) {
+ LOG.log(Level.WARNING, "no mime types found in the classpath! please provide mimetypes.properties");
+ }
+ }
+ return MIME_TYPES;
+ }
+
+ private static void loadMimeTypes(Map<String, String> result, String resourceName) {
+ try {
+ Enumeration<URL> resources = NanoHTTPD.class.getClassLoader().getResources(resourceName);
+ while (resources.hasMoreElements()) {
+ URL url = (URL) resources.nextElement();
+ Properties properties = new Properties();
+ InputStream stream = null;
+ try {
+ stream = url.openStream();
+ properties.load(url.openStream());
+ } catch (IOException e) {
+ LOG.log(Level.SEVERE, "could not load mimetypes from " + url, e);
+ } finally {
+ safeClose(stream);
+ }
+ result.putAll((Map) properties);
+ }
+ } catch (IOException e) {
+ LOG.log(Level.INFO, "no mime types available at " + resourceName);
+ }
+ };
+
+ /**
* Creates an SSLSocketFactory for HTTPS. Pass a loaded KeyStore and an
* array of loaded KeyManagers. These objects must properly
* loaded/initialized by the caller.
@@ -1622,6 +1664,22 @@ public abstract class NanoHTTPD {
}
}
+ /**
+ * Get MIME type from file name extension, if possible
+ *
+ * @param uri
+ * the string representing a file
+ * @return the connected mime/type
+ */
+ public static String getMimeTypeForFile(String uri) {
+ int dot = uri.lastIndexOf('.');
+ String mime = null;
+ if (dot >= 0) {
+ mime = mimeTypes().get(uri.substring(dot + 1).toLowerCase());
+ }
+ return mime == null ? "application/octet-stream" : mime;
+ }
+
private static final void safeClose(Object closeable) {
try {
if (closeable != null) {
diff --git a/core/src/main/resources/META-INF/nanohttpd/default-mimetypes.properties b/core/src/main/resources/META-INF/nanohttpd/default-mimetypes.properties
new file mode 100644
index 0000000..3fb242f
--- /dev/null
+++ b/core/src/main/resources/META-INF/nanohttpd/default-mimetypes.properties
@@ -0,0 +1,30 @@
+#default mime types for nanohttpd, use META-INF/mimetypes.properties for user defined mimetypes
+css=text/css
+htm=text/html
+html=text/html
+xml=text/xml
+java=text/x-java-source, text/java
+md=text/plain
+txt=text/plain
+asc=text/plain
+gif=image/gif
+jpg=image/jpeg
+jpeg=image/jpeg
+png=image/png
+svg=image/svg+xml
+mp3=audio/mpeg
+m3u=audio/mpeg-url
+mp4=video/mp4
+ogv=video/ogg
+flv=video/x-flv
+mov=video/quicktime
+swf=application/x-shockwave-flash
+js=application/javascript
+pdf=application/pdf
+doc=application/msword
+ogg=application/x-ogg
+zip=application/octet-stream
+exe=application/octet-stream
+class=application/octet-stream
+m3u8=application/vnd.apple.mpegurl
+ts=video/mp2t \ No newline at end of file
diff --git a/core/src/main/resources/META-INF/nanohttpd/mimetypes.properties b/core/src/main/resources/META-INF/nanohttpd/mimetypes.properties
new file mode 100644
index 0000000..7166a88
--- /dev/null
+++ b/core/src/main/resources/META-INF/nanohttpd/mimetypes.properties
@@ -0,0 +1 @@
+#mime types for nanohttpd, use a file like this for user defined mimetypes \ No newline at end of file
diff --git a/core/src/test/java/fi/iki/elonen/HttpSSLServerTest.java b/core/src/test/java/fi/iki/elonen/HttpSSLServerTest.java
index f6b1999..30fb48c 100644
--- a/core/src/test/java/fi/iki/elonen/HttpSSLServerTest.java
+++ b/core/src/test/java/fi/iki/elonen/HttpSSLServerTest.java
@@ -57,7 +57,7 @@ public class HttpSSLServerTest extends HttpServerTest {
HttpResponse response = httpclient.execute(httphead);
HttpEntity entity = response.getEntity();
Assert.assertEquals(200, response.getStatusLine().getStatusCode());
-
+
Assert.assertEquals(9043, this.testServer.getListeningPort());
Assert.assertTrue(this.testServer.isAlive());
}
diff --git a/core/src/test/java/fi/iki/elonen/MimeTest.java b/core/src/test/java/fi/iki/elonen/MimeTest.java
new file mode 100644
index 0000000..046ef00
--- /dev/null
+++ b/core/src/test/java/fi/iki/elonen/MimeTest.java
@@ -0,0 +1,62 @@
+package fi.iki.elonen;
+
+/*
+ * #%L
+ * NanoHttpd-Core
+ * %%
+ * Copyright (C) 2012 - 2015 nanohttpd
+ * %%
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the nanohttpd nor the names of its contributors
+ * may be used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ * #L%
+ */
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class MimeTest {
+
+ @Test
+ public void testExistingMimeType() throws Exception {
+ Assert.assertEquals("text/html", NanoHTTPD.getMimeTypeForFile("xxxx.html"));
+ }
+
+ @Test
+ public void testNotExistingMimeType() throws Exception {
+ Assert.assertNull(NanoHTTPD.mimeTypes().get("notExistent"));
+ Assert.assertEquals("application/octet-stream", NanoHTTPD.getMimeTypeForFile("xxxx.notExistent"));
+ }
+
+ @Test
+ public void testOverwritenMimeType() throws Exception {
+ Assert.assertEquals("video/wrongOverwrite", NanoHTTPD.getMimeTypeForFile("xxxx.ts"));
+ }
+
+ @Test
+ public void testManualMimeType() throws Exception {
+ NanoHTTPD.mimeTypes().put("flv", "video/manualOverwrite");
+ Assert.assertEquals("video/manualOverwrite", NanoHTTPD.getMimeTypeForFile("xxxx.flv"));
+ }
+}
diff --git a/core/src/test/resources/META-INF/nanohttpd/mimetypes.properties b/core/src/test/resources/META-INF/nanohttpd/mimetypes.properties
new file mode 100644
index 0000000..2f353d8
--- /dev/null
+++ b/core/src/test/resources/META-INF/nanohttpd/mimetypes.properties
@@ -0,0 +1,3 @@
+#test mime types for nanohttpd
+blabla=text/blabla
+ts=video/wrongOverwrite \ No newline at end of file