mirror of
https://github.com/spring-projects/spring-boot.git
synced 2024-08-29 03:06:45 +08:00
Merge pull request #32101 from terminux
* pr/32101: Polish 'Align MimeMappings with Tomcat's defaults' Align MimeMappings with Tomcat's defaults Closes gh-32101
This commit is contained in:
commit
90b68d8465
@ -17,6 +17,7 @@
|
|||||||
package org.springframework.boot.web.embedded.tomcat;
|
package org.springframework.boot.web.embedded.tomcat;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.TreeMap;
|
import java.util.TreeMap;
|
||||||
@ -30,6 +31,7 @@ import org.apache.catalina.core.StandardContext;
|
|||||||
import org.apache.catalina.core.StandardWrapper;
|
import org.apache.catalina.core.StandardWrapper;
|
||||||
import org.apache.catalina.session.ManagerBase;
|
import org.apache.catalina.session.ManagerBase;
|
||||||
|
|
||||||
|
import org.springframework.boot.web.server.MimeMappings;
|
||||||
import org.springframework.boot.web.server.WebServerException;
|
import org.springframework.boot.web.server.WebServerException;
|
||||||
import org.springframework.util.ClassUtils;
|
import org.springframework.util.ClassUtils;
|
||||||
|
|
||||||
@ -44,6 +46,8 @@ class TomcatEmbeddedContext extends StandardContext {
|
|||||||
|
|
||||||
private TomcatStarter starter;
|
private TomcatStarter starter;
|
||||||
|
|
||||||
|
private MimeMappings mimeMappings;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean loadOnStartup(Container[] children) {
|
public boolean loadOnStartup(Container[] children) {
|
||||||
// deferred until later (see deferredLoadOnStartup)
|
// deferred until later (see deferredLoadOnStartup)
|
||||||
@ -118,4 +122,27 @@ class TomcatEmbeddedContext extends StandardContext {
|
|||||||
return this.starter;
|
return this.starter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void setMimeMappings(MimeMappings mimeMappings) {
|
||||||
|
this.mimeMappings = mimeMappings;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String[] findMimeMappings() {
|
||||||
|
List<String> mappings = new ArrayList<>();
|
||||||
|
mappings.addAll(Arrays.asList(super.findMimeMappings()));
|
||||||
|
if (this.mimeMappings != null) {
|
||||||
|
this.mimeMappings.forEach((mapping) -> mappings.add(mapping.getExtension()));
|
||||||
|
}
|
||||||
|
return mappings.toArray(String[]::new);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String findMimeMapping(String extension) {
|
||||||
|
String mimeMapping = super.findMimeMapping(extension);
|
||||||
|
if (mimeMapping != null) {
|
||||||
|
return mimeMapping;
|
||||||
|
}
|
||||||
|
return (this.mimeMappings != null) ? this.mimeMappings.get(extension) : null;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -389,9 +389,7 @@ public class TomcatServletWebServerFactory extends AbstractServletWebServerFacto
|
|||||||
tomcatErrorPage.setExceptionType(errorPage.getExceptionName());
|
tomcatErrorPage.setExceptionType(errorPage.getExceptionName());
|
||||||
context.addErrorPage(tomcatErrorPage);
|
context.addErrorPage(tomcatErrorPage);
|
||||||
}
|
}
|
||||||
for (MimeMappings.Mapping mapping : getMimeMappings()) {
|
setMimeMappings(context);
|
||||||
context.addMimeMapping(mapping.getExtension(), mapping.getMimeType());
|
|
||||||
}
|
|
||||||
configureSession(context);
|
configureSession(context);
|
||||||
configureCookieProcessor(context);
|
configureCookieProcessor(context);
|
||||||
new DisableReferenceClearingContextCustomizer().customize(context);
|
new DisableReferenceClearingContextCustomizer().customize(context);
|
||||||
@ -423,6 +421,16 @@ public class TomcatServletWebServerFactory extends AbstractServletWebServerFacto
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void setMimeMappings(Context context) {
|
||||||
|
if (context instanceof TomcatEmbeddedContext embeddedContext) {
|
||||||
|
embeddedContext.setMimeMappings(getMimeMappings());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (MimeMappings.Mapping mapping : getMimeMappings()) {
|
||||||
|
context.addMimeMapping(mapping.getExtension(), mapping.getMimeType());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void configureCookieProcessor(Context context) {
|
private void configureCookieProcessor(Context context) {
|
||||||
SameSite sessionSameSite = getSession().getCookie().getSameSite();
|
SameSite sessionSameSite = getSession().getCookie().getSameSite();
|
||||||
List<CookieSameSiteSupplier> suppliers = new ArrayList<>();
|
List<CookieSameSiteSupplier> suppliers = new ArrayList<>();
|
||||||
|
@ -16,12 +16,20 @@
|
|||||||
|
|
||||||
package org.springframework.boot.web.server;
|
package org.springframework.boot.web.server;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.Locale;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
|
||||||
|
import org.springframework.aot.hint.RuntimeHints;
|
||||||
|
import org.springframework.aot.hint.RuntimeHintsRegistrar;
|
||||||
|
import org.springframework.core.io.ClassPathResource;
|
||||||
|
import org.springframework.core.io.support.PropertiesLoaderUtils;
|
||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -29,196 +37,15 @@ import org.springframework.util.Assert;
|
|||||||
* {@literal <mime-mapping>} element traditionally found in web.xml.
|
* {@literal <mime-mapping>} element traditionally found in web.xml.
|
||||||
*
|
*
|
||||||
* @author Phillip Webb
|
* @author Phillip Webb
|
||||||
|
* @author Guirong Hu
|
||||||
* @since 2.0.0
|
* @since 2.0.0
|
||||||
*/
|
*/
|
||||||
public final class MimeMappings implements Iterable<MimeMappings.Mapping> {
|
public sealed class MimeMappings implements Iterable<MimeMappings.Mapping> {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default mime mapping commonly used.
|
* Default mime mapping commonly used.
|
||||||
*/
|
*/
|
||||||
public static final MimeMappings DEFAULT;
|
public static final MimeMappings DEFAULT = new DefaultMimeMappings();
|
||||||
|
|
||||||
static {
|
|
||||||
MimeMappings mappings = new MimeMappings();
|
|
||||||
mappings.add("abs", "audio/x-mpeg");
|
|
||||||
mappings.add("ai", "application/postscript");
|
|
||||||
mappings.add("aif", "audio/x-aiff");
|
|
||||||
mappings.add("aifc", "audio/x-aiff");
|
|
||||||
mappings.add("aiff", "audio/x-aiff");
|
|
||||||
mappings.add("aim", "application/x-aim");
|
|
||||||
mappings.add("art", "image/x-jg");
|
|
||||||
mappings.add("asf", "video/x-ms-asf");
|
|
||||||
mappings.add("asx", "video/x-ms-asf");
|
|
||||||
mappings.add("au", "audio/basic");
|
|
||||||
mappings.add("avi", "video/x-msvideo");
|
|
||||||
mappings.add("avx", "video/x-rad-screenplay");
|
|
||||||
mappings.add("bcpio", "application/x-bcpio");
|
|
||||||
mappings.add("bin", "application/octet-stream");
|
|
||||||
mappings.add("bmp", "image/bmp");
|
|
||||||
mappings.add("body", "text/html");
|
|
||||||
mappings.add("cdf", "application/x-cdf");
|
|
||||||
mappings.add("cer", "application/pkix-cert");
|
|
||||||
mappings.add("class", "application/java");
|
|
||||||
mappings.add("cpio", "application/x-cpio");
|
|
||||||
mappings.add("csh", "application/x-csh");
|
|
||||||
mappings.add("css", "text/css");
|
|
||||||
mappings.add("dib", "image/bmp");
|
|
||||||
mappings.add("doc", "application/msword");
|
|
||||||
mappings.add("dtd", "application/xml-dtd");
|
|
||||||
mappings.add("dv", "video/x-dv");
|
|
||||||
mappings.add("dvi", "application/x-dvi");
|
|
||||||
mappings.add("eot", "application/vnd.ms-fontobject");
|
|
||||||
mappings.add("eps", "application/postscript");
|
|
||||||
mappings.add("etx", "text/x-setext");
|
|
||||||
mappings.add("exe", "application/octet-stream");
|
|
||||||
mappings.add("gif", "image/gif");
|
|
||||||
mappings.add("gtar", "application/x-gtar");
|
|
||||||
mappings.add("gz", "application/x-gzip");
|
|
||||||
mappings.add("hdf", "application/x-hdf");
|
|
||||||
mappings.add("hqx", "application/mac-binhex40");
|
|
||||||
mappings.add("htc", "text/x-component");
|
|
||||||
mappings.add("htm", "text/html");
|
|
||||||
mappings.add("html", "text/html");
|
|
||||||
mappings.add("ief", "image/ief");
|
|
||||||
mappings.add("jad", "text/vnd.sun.j2me.app-descriptor");
|
|
||||||
mappings.add("jar", "application/java-archive");
|
|
||||||
mappings.add("java", "text/x-java-source");
|
|
||||||
mappings.add("jnlp", "application/x-java-jnlp-file");
|
|
||||||
mappings.add("jpe", "image/jpeg");
|
|
||||||
mappings.add("jpeg", "image/jpeg");
|
|
||||||
mappings.add("jpg", "image/jpeg");
|
|
||||||
mappings.add("js", "application/javascript");
|
|
||||||
mappings.add("jsf", "text/plain");
|
|
||||||
mappings.add("json", "application/json");
|
|
||||||
mappings.add("jspf", "text/plain");
|
|
||||||
mappings.add("kar", "audio/midi");
|
|
||||||
mappings.add("latex", "application/x-latex");
|
|
||||||
mappings.add("m3u", "audio/x-mpegurl");
|
|
||||||
mappings.add("mac", "image/x-macpaint");
|
|
||||||
mappings.add("man", "text/troff");
|
|
||||||
mappings.add("mathml", "application/mathml+xml");
|
|
||||||
mappings.add("me", "text/troff");
|
|
||||||
mappings.add("mid", "audio/midi");
|
|
||||||
mappings.add("midi", "audio/midi");
|
|
||||||
mappings.add("mif", "application/x-mif");
|
|
||||||
mappings.add("mov", "video/quicktime");
|
|
||||||
mappings.add("movie", "video/x-sgi-movie");
|
|
||||||
mappings.add("mp1", "audio/mpeg");
|
|
||||||
mappings.add("mp2", "audio/mpeg");
|
|
||||||
mappings.add("mp3", "audio/mpeg");
|
|
||||||
mappings.add("mp4", "video/mp4");
|
|
||||||
mappings.add("mpa", "audio/mpeg");
|
|
||||||
mappings.add("mpe", "video/mpeg");
|
|
||||||
mappings.add("mpeg", "video/mpeg");
|
|
||||||
mappings.add("mpega", "audio/x-mpeg");
|
|
||||||
mappings.add("mpg", "video/mpeg");
|
|
||||||
mappings.add("mpv2", "video/mpeg2");
|
|
||||||
mappings.add("ms", "application/x-wais-source");
|
|
||||||
mappings.add("nc", "application/x-netcdf");
|
|
||||||
mappings.add("oda", "application/oda");
|
|
||||||
mappings.add("odb", "application/vnd.oasis.opendocument.database");
|
|
||||||
mappings.add("odc", "application/vnd.oasis.opendocument.chart");
|
|
||||||
mappings.add("odf", "application/vnd.oasis.opendocument.formula");
|
|
||||||
mappings.add("odg", "application/vnd.oasis.opendocument.graphics");
|
|
||||||
mappings.add("odi", "application/vnd.oasis.opendocument.image");
|
|
||||||
mappings.add("odm", "application/vnd.oasis.opendocument.text-master");
|
|
||||||
mappings.add("odp", "application/vnd.oasis.opendocument.presentation");
|
|
||||||
mappings.add("ods", "application/vnd.oasis.opendocument.spreadsheet");
|
|
||||||
mappings.add("odt", "application/vnd.oasis.opendocument.text");
|
|
||||||
mappings.add("otg", "application/vnd.oasis.opendocument.graphics-template");
|
|
||||||
mappings.add("oth", "application/vnd.oasis.opendocument.text-web");
|
|
||||||
mappings.add("otp", "application/vnd.oasis.opendocument.presentation-template");
|
|
||||||
mappings.add("ots", "application/vnd.oasis.opendocument.spreadsheet-template");
|
|
||||||
mappings.add("ott", "application/vnd.oasis.opendocument.text-template");
|
|
||||||
mappings.add("ogx", "application/ogg");
|
|
||||||
mappings.add("ogv", "video/ogg");
|
|
||||||
mappings.add("oga", "audio/ogg");
|
|
||||||
mappings.add("ogg", "audio/ogg");
|
|
||||||
mappings.add("otf", "application/x-font-opentype");
|
|
||||||
mappings.add("spx", "audio/ogg");
|
|
||||||
mappings.add("flac", "audio/flac");
|
|
||||||
mappings.add("anx", "application/annodex");
|
|
||||||
mappings.add("axa", "audio/annodex");
|
|
||||||
mappings.add("axv", "video/annodex");
|
|
||||||
mappings.add("xspf", "application/xspf+xml");
|
|
||||||
mappings.add("pbm", "image/x-portable-bitmap");
|
|
||||||
mappings.add("pct", "image/pict");
|
|
||||||
mappings.add("pdf", "application/pdf");
|
|
||||||
mappings.add("pgm", "image/x-portable-graymap");
|
|
||||||
mappings.add("pic", "image/pict");
|
|
||||||
mappings.add("pict", "image/pict");
|
|
||||||
mappings.add("pls", "audio/x-scpls");
|
|
||||||
mappings.add("png", "image/png");
|
|
||||||
mappings.add("pnm", "image/x-portable-anymap");
|
|
||||||
mappings.add("pnt", "image/x-macpaint");
|
|
||||||
mappings.add("ppm", "image/x-portable-pixmap");
|
|
||||||
mappings.add("ppt", "application/vnd.ms-powerpoint");
|
|
||||||
mappings.add("pps", "application/vnd.ms-powerpoint");
|
|
||||||
mappings.add("ps", "application/postscript");
|
|
||||||
mappings.add("psd", "image/vnd.adobe.photoshop");
|
|
||||||
mappings.add("qt", "video/quicktime");
|
|
||||||
mappings.add("qti", "image/x-quicktime");
|
|
||||||
mappings.add("qtif", "image/x-quicktime");
|
|
||||||
mappings.add("ras", "image/x-cmu-raster");
|
|
||||||
mappings.add("rdf", "application/rdf+xml");
|
|
||||||
mappings.add("rgb", "image/x-rgb");
|
|
||||||
mappings.add("rm", "application/vnd.rn-realmedia");
|
|
||||||
mappings.add("roff", "text/troff");
|
|
||||||
mappings.add("rtf", "application/rtf");
|
|
||||||
mappings.add("rtx", "text/richtext");
|
|
||||||
mappings.add("sfnt", "application/font-sfnt");
|
|
||||||
mappings.add("sh", "application/x-sh");
|
|
||||||
mappings.add("shar", "application/x-shar");
|
|
||||||
mappings.add("sit", "application/x-stuffit");
|
|
||||||
mappings.add("snd", "audio/basic");
|
|
||||||
mappings.add("src", "application/x-wais-source");
|
|
||||||
mappings.add("sv4cpio", "application/x-sv4cpio");
|
|
||||||
mappings.add("sv4crc", "application/x-sv4crc");
|
|
||||||
mappings.add("svg", "image/svg+xml");
|
|
||||||
mappings.add("svgz", "image/svg+xml");
|
|
||||||
mappings.add("swf", "application/x-shockwave-flash");
|
|
||||||
mappings.add("t", "text/troff");
|
|
||||||
mappings.add("tar", "application/x-tar");
|
|
||||||
mappings.add("tcl", "application/x-tcl");
|
|
||||||
mappings.add("tex", "application/x-tex");
|
|
||||||
mappings.add("texi", "application/x-texinfo");
|
|
||||||
mappings.add("texinfo", "application/x-texinfo");
|
|
||||||
mappings.add("tif", "image/tiff");
|
|
||||||
mappings.add("tiff", "image/tiff");
|
|
||||||
mappings.add("tr", "text/troff");
|
|
||||||
mappings.add("tsv", "text/tab-separated-values");
|
|
||||||
mappings.add("ttf", "application/x-font-ttf");
|
|
||||||
mappings.add("txt", "text/plain");
|
|
||||||
mappings.add("ulw", "audio/basic");
|
|
||||||
mappings.add("ustar", "application/x-ustar");
|
|
||||||
mappings.add("vxml", "application/voicexml+xml");
|
|
||||||
mappings.add("xbm", "image/x-xbitmap");
|
|
||||||
mappings.add("xht", "application/xhtml+xml");
|
|
||||||
mappings.add("xhtml", "application/xhtml+xml");
|
|
||||||
mappings.add("xls", "application/vnd.ms-excel");
|
|
||||||
mappings.add("xml", "application/xml");
|
|
||||||
mappings.add("xpm", "image/x-xpixmap");
|
|
||||||
mappings.add("xsl", "application/xml");
|
|
||||||
mappings.add("xslt", "application/xslt+xml");
|
|
||||||
mappings.add("xul", "application/vnd.mozilla.xul+xml");
|
|
||||||
mappings.add("xwd", "image/x-xwindowdump");
|
|
||||||
mappings.add("vsd", "application/vnd.visio");
|
|
||||||
mappings.add("wasm", "application/wasm");
|
|
||||||
mappings.add("wav", "audio/x-wav");
|
|
||||||
mappings.add("wbmp", "image/vnd.wap.wbmp");
|
|
||||||
mappings.add("wml", "text/vnd.wap.wml");
|
|
||||||
mappings.add("wmlc", "application/vnd.wap.wmlc");
|
|
||||||
mappings.add("wmls", "text/vnd.wap.wmlsc");
|
|
||||||
mappings.add("wmlscriptc", "application/vnd.wap.wmlscriptc");
|
|
||||||
mappings.add("wmv", "video/x-ms-wmv");
|
|
||||||
mappings.add("woff", "application/font-woff");
|
|
||||||
mappings.add("woff2", "application/font-woff2");
|
|
||||||
mappings.add("wrl", "model/vrml");
|
|
||||||
mappings.add("wspolicy", "application/wspolicy+xml");
|
|
||||||
mappings.add("z", "application/x-compress");
|
|
||||||
mappings.add("zip", "application/zip");
|
|
||||||
DEFAULT = unmodifiableMappings(mappings);
|
|
||||||
}
|
|
||||||
|
|
||||||
private final Map<String, Mapping> map;
|
private final Map<String, Mapping> map;
|
||||||
|
|
||||||
@ -253,14 +80,44 @@ public final class MimeMappings implements Iterable<MimeMappings.Mapping> {
|
|||||||
* @param mappings source mappings
|
* @param mappings source mappings
|
||||||
* @param mutable if the new object should be mutable.
|
* @param mutable if the new object should be mutable.
|
||||||
*/
|
*/
|
||||||
private MimeMappings(MimeMappings mappings, boolean mutable) {
|
MimeMappings(MimeMappings mappings, boolean mutable) {
|
||||||
Assert.notNull(mappings, "Mappings must not be null");
|
Assert.notNull(mappings, "Mappings must not be null");
|
||||||
this.map = (mutable ? new LinkedHashMap<>(mappings.map) : Collections.unmodifiableMap(mappings.map));
|
this.map = (mutable ? new LinkedHashMap<>(mappings.map) : Collections.unmodifiableMap(mappings.map));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
/**
|
||||||
public Iterator<Mapping> iterator() {
|
* Add a new mime mapping.
|
||||||
return getAll().iterator();
|
* @param extension the file extension (excluding '.')
|
||||||
|
* @param mimeType the mime type to map
|
||||||
|
* @return any previous mapping or {@code null}
|
||||||
|
*/
|
||||||
|
public String add(String extension, String mimeType) {
|
||||||
|
Assert.notNull(extension, "Extension must not be null");
|
||||||
|
Assert.notNull(mimeType, "MimeType must not be null");
|
||||||
|
Mapping previous = this.map.put(extension.toLowerCase(Locale.ENGLISH), new Mapping(extension, mimeType));
|
||||||
|
return (previous != null) ? previous.getMimeType() : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove an existing mapping.
|
||||||
|
* @param extension the file extension (excluding '.')
|
||||||
|
* @return the removed mime mapping or {@code null} if no item was removed
|
||||||
|
*/
|
||||||
|
public String remove(String extension) {
|
||||||
|
Assert.notNull(extension, "Extension must not be null");
|
||||||
|
Mapping previous = this.map.remove(extension.toLowerCase(Locale.ENGLISH));
|
||||||
|
return (previous != null) ? previous.getMimeType() : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a mime mapping for the given extension.
|
||||||
|
* @param extension the file extension (excluding '.')
|
||||||
|
* @return a mime mapping or {@code null}
|
||||||
|
*/
|
||||||
|
public String get(String extension) {
|
||||||
|
Assert.notNull(extension, "Extension must not be null");
|
||||||
|
Mapping mapping = this.map.get(extension.toLowerCase(Locale.ENGLISH));
|
||||||
|
return (mapping != null) ? mapping.getMimeType() : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -271,35 +128,9 @@ public final class MimeMappings implements Iterable<MimeMappings.Mapping> {
|
|||||||
return this.map.values();
|
return this.map.values();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
@Override
|
||||||
* Add a new mime mapping.
|
public final Iterator<Mapping> iterator() {
|
||||||
* @param extension the file extension (excluding '.')
|
return getAll().iterator();
|
||||||
* @param mimeType the mime type to map
|
|
||||||
* @return any previous mapping or {@code null}
|
|
||||||
*/
|
|
||||||
public String add(String extension, String mimeType) {
|
|
||||||
Mapping previous = this.map.put(extension, new Mapping(extension, mimeType));
|
|
||||||
return (previous != null) ? previous.getMimeType() : null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get a mime mapping for the given extension.
|
|
||||||
* @param extension the file extension (excluding '.')
|
|
||||||
* @return a mime mapping or {@code null}
|
|
||||||
*/
|
|
||||||
public String get(String extension) {
|
|
||||||
Mapping mapping = this.map.get(extension);
|
|
||||||
return (mapping != null) ? mapping.getMimeType() : null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Remove an existing mapping.
|
|
||||||
* @param extension the file extension (excluding '.')
|
|
||||||
* @return the removed mime mapping or {@code null} if no item was removed
|
|
||||||
*/
|
|
||||||
public String remove(String extension) {
|
|
||||||
Mapping previous = this.map.remove(extension);
|
|
||||||
return (previous != null) ? previous.getMimeType() : null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -311,14 +142,18 @@ public final class MimeMappings implements Iterable<MimeMappings.Mapping> {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (obj instanceof MimeMappings other) {
|
if (obj instanceof MimeMappings other) {
|
||||||
return this.map.equals(other.map);
|
return getMap().equals(other.map);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
return this.map.hashCode();
|
return getMap().hashCode();
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, Mapping> getMap() {
|
||||||
|
return this.map;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -328,9 +163,22 @@ public final class MimeMappings implements Iterable<MimeMappings.Mapping> {
|
|||||||
* @return an unmodifiable view of the specified mappings.
|
* @return an unmodifiable view of the specified mappings.
|
||||||
*/
|
*/
|
||||||
public static MimeMappings unmodifiableMappings(MimeMappings mappings) {
|
public static MimeMappings unmodifiableMappings(MimeMappings mappings) {
|
||||||
|
Assert.notNull(mappings, "Mappings must not be null");
|
||||||
return new MimeMappings(mappings, false);
|
return new MimeMappings(mappings, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Crate a new lazy copy of the given mappings will only copy entries if the mappings
|
||||||
|
* are mutated.
|
||||||
|
* @param mappings the source mappings
|
||||||
|
* @return a new mappings instance
|
||||||
|
* @since 3.0.0
|
||||||
|
*/
|
||||||
|
public static MimeMappings lazyCopy(MimeMappings mappings) {
|
||||||
|
Assert.notNull(mappings, "Mappings must not be null");
|
||||||
|
return new LazyMimeMappingsCopy(mappings);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A single mime mapping.
|
* A single mime mapping.
|
||||||
*/
|
*/
|
||||||
@ -381,4 +229,175 @@ public final class MimeMappings implements Iterable<MimeMappings.Mapping> {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@link MimeMappings} implementation used for {@link MimeMappings#DEFAULT}. Provides
|
||||||
|
* in-memory access for common mappings and lazily loads the complete set when
|
||||||
|
* necessary.
|
||||||
|
*/
|
||||||
|
static final class DefaultMimeMappings extends MimeMappings {
|
||||||
|
|
||||||
|
static final String MIME_MAPPINGS_PROPERTIES = "mime-mappings.properties";
|
||||||
|
|
||||||
|
private static final MimeMappings COMMON;
|
||||||
|
|
||||||
|
static {
|
||||||
|
MimeMappings mappings = new MimeMappings();
|
||||||
|
mappings.add("avi", "video/x-msvideo");
|
||||||
|
mappings.add("bin", "application/octet-stream");
|
||||||
|
mappings.add("body", "text/html");
|
||||||
|
mappings.add("class", "application/java");
|
||||||
|
mappings.add("css", "text/css");
|
||||||
|
mappings.add("dtd", "application/xml-dtd");
|
||||||
|
mappings.add("gif", "image/gif");
|
||||||
|
mappings.add("gtar", "application/x-gtar");
|
||||||
|
mappings.add("gz", "application/x-gzip");
|
||||||
|
mappings.add("htm", "text/html");
|
||||||
|
mappings.add("html", "text/html");
|
||||||
|
mappings.add("jar", "application/java-archive");
|
||||||
|
mappings.add("java", "text/x-java-source");
|
||||||
|
mappings.add("jnlp", "application/x-java-jnlp-file");
|
||||||
|
mappings.add("jpe", "image/jpeg");
|
||||||
|
mappings.add("jpeg", "image/jpeg");
|
||||||
|
mappings.add("jpg", "image/jpeg");
|
||||||
|
mappings.add("js", "application/javascript");
|
||||||
|
mappings.add("json", "application/json");
|
||||||
|
mappings.add("otf", "application/x-font-opentype");
|
||||||
|
mappings.add("pdf", "application/pdf");
|
||||||
|
mappings.add("png", "image/png");
|
||||||
|
mappings.add("ps", "application/postscript");
|
||||||
|
mappings.add("tar", "application/x-tar");
|
||||||
|
mappings.add("tif", "image/tiff");
|
||||||
|
mappings.add("tiff", "image/tiff");
|
||||||
|
mappings.add("ttf", "application/x-font-ttf");
|
||||||
|
mappings.add("txt", "text/plain");
|
||||||
|
mappings.add("xht", "application/xhtml+xml");
|
||||||
|
mappings.add("xhtml", "application/xhtml+xml");
|
||||||
|
mappings.add("xls", "application/vnd.ms-excel");
|
||||||
|
mappings.add("xml", "application/xml");
|
||||||
|
mappings.add("xsl", "application/xml");
|
||||||
|
mappings.add("xslt", "application/xslt+xml");
|
||||||
|
mappings.add("wasm", "application/wasm");
|
||||||
|
mappings.add("zip", "application/zip");
|
||||||
|
COMMON = unmodifiableMappings(mappings);
|
||||||
|
}
|
||||||
|
|
||||||
|
private volatile Map<String, Mapping> loaded;
|
||||||
|
|
||||||
|
DefaultMimeMappings() {
|
||||||
|
super(new MimeMappings(), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Collection<Mapping> getAll() {
|
||||||
|
return load().values();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String get(String extension) {
|
||||||
|
Assert.notNull(extension, "Extension must not be null");
|
||||||
|
extension = extension.toLowerCase(Locale.ENGLISH);
|
||||||
|
Map<String, Mapping> loaded = this.loaded;
|
||||||
|
if (loaded != null) {
|
||||||
|
return get(loaded, extension);
|
||||||
|
}
|
||||||
|
String commonMimeType = COMMON.get(extension);
|
||||||
|
if (commonMimeType != null) {
|
||||||
|
return commonMimeType;
|
||||||
|
}
|
||||||
|
loaded = load();
|
||||||
|
return get(loaded, extension);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String get(Map<String, Mapping> mappings, String extension) {
|
||||||
|
Mapping mapping = mappings.get(extension);
|
||||||
|
return (mapping != null) ? mapping.getMimeType() : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
Map<String, Mapping> getMap() {
|
||||||
|
return load();
|
||||||
|
}
|
||||||
|
|
||||||
|
private Map<String, Mapping> load() {
|
||||||
|
Map<String, Mapping> loaded = this.loaded;
|
||||||
|
if (loaded != null) {
|
||||||
|
return loaded;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
loaded = new LinkedHashMap<>();
|
||||||
|
for (Entry<?, ?> entry : PropertiesLoaderUtils
|
||||||
|
.loadProperties(new ClassPathResource(MIME_MAPPINGS_PROPERTIES, getClass())).entrySet()) {
|
||||||
|
loaded.put((String) entry.getKey(),
|
||||||
|
new Mapping((String) entry.getKey(), (String) entry.getValue()));
|
||||||
|
}
|
||||||
|
loaded = Collections.unmodifiableMap(loaded);
|
||||||
|
this.loaded = loaded;
|
||||||
|
return loaded;
|
||||||
|
}
|
||||||
|
catch (IOException ex) {
|
||||||
|
throw new IllegalArgumentException("Unable to load the default MIME types", ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@link MimeMappings} implementation used to create a lazy copy only when the
|
||||||
|
* mappings are mutated.
|
||||||
|
*/
|
||||||
|
static final class LazyMimeMappingsCopy extends MimeMappings {
|
||||||
|
|
||||||
|
private final MimeMappings source;
|
||||||
|
|
||||||
|
private AtomicBoolean copied = new AtomicBoolean();
|
||||||
|
|
||||||
|
LazyMimeMappingsCopy(MimeMappings source) {
|
||||||
|
this.source = source;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String add(String extension, String mimeType) {
|
||||||
|
copyIfNecessary();
|
||||||
|
return super.add(extension, mimeType);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String remove(String extension) {
|
||||||
|
copyIfNecessary();
|
||||||
|
return super.remove(extension);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void copyIfNecessary() {
|
||||||
|
if (this.copied.compareAndSet(false, true)) {
|
||||||
|
this.source.forEach((mapping) -> add(mapping.getExtension(), mapping.getMimeType()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String get(String extension) {
|
||||||
|
return !this.copied.get() ? this.source.get(extension) : super.get(extension);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Collection<Mapping> getAll() {
|
||||||
|
return !this.copied.get() ? this.source.getAll() : super.getAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
Map<String, Mapping> getMap() {
|
||||||
|
return !this.copied.get() ? this.source.getMap() : super.getMap();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static class MimeMappingsRuntimeHints implements RuntimeHintsRegistrar {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void registerHints(RuntimeHints hints, ClassLoader classLoader) {
|
||||||
|
hints.resources().registerPattern(
|
||||||
|
"org/springframework/boot/web/server/" + DefaultMimeMappings.MIME_MAPPINGS_PROPERTIES);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -69,7 +69,7 @@ public abstract class AbstractServletWebServerFactory extends AbstractConfigurab
|
|||||||
|
|
||||||
private boolean registerDefaultServlet = false;
|
private boolean registerDefaultServlet = false;
|
||||||
|
|
||||||
private MimeMappings mimeMappings = new MimeMappings(MimeMappings.DEFAULT);
|
private MimeMappings mimeMappings = MimeMappings.lazyCopy(MimeMappings.DEFAULT);
|
||||||
|
|
||||||
private List<ServletContextInitializer> initializers = new ArrayList<>();
|
private List<ServletContextInitializer> initializers = new ArrayList<>();
|
||||||
|
|
||||||
@ -173,6 +173,7 @@ public abstract class AbstractServletWebServerFactory extends AbstractConfigurab
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setMimeMappings(MimeMappings mimeMappings) {
|
public void setMimeMappings(MimeMappings mimeMappings) {
|
||||||
|
Assert.notNull(mimeMappings, "MimeMappings must not be null");
|
||||||
this.mimeMappings = new MimeMappings(mimeMappings);
|
this.mimeMappings = new MimeMappings(mimeMappings);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,11 +1,12 @@
|
|||||||
org.springframework.aot.hint.RuntimeHintsRegistrar=\
|
org.springframework.aot.hint.RuntimeHintsRegistrar=\
|
||||||
|
org.springframework.boot.SpringApplication.SpringApplicationRuntimeHints,\
|
||||||
|
org.springframework.boot.WebApplicationType.WebApplicationTypeRuntimeHints,\
|
||||||
org.springframework.boot.context.config.ConfigDataLocationRuntimeHints,\
|
org.springframework.boot.context.config.ConfigDataLocationRuntimeHints,\
|
||||||
org.springframework.boot.env.PropertySourceRuntimeHints,\
|
org.springframework.boot.env.PropertySourceRuntimeHints,\
|
||||||
org.springframework.boot.json.JacksonRuntimeHints,\
|
org.springframework.boot.json.JacksonRuntimeHints,\
|
||||||
org.springframework.boot.logging.java.JavaLoggingSystemRuntimeHints,\
|
org.springframework.boot.logging.java.JavaLoggingSystemRuntimeHints,\
|
||||||
org.springframework.boot.logging.logback.LogbackRuntimeHints,\
|
org.springframework.boot.logging.logback.LogbackRuntimeHints,\
|
||||||
org.springframework.boot.SpringApplication.SpringApplicationRuntimeHints,\
|
org.springframework.boot.web.server.MimeMappings.MimeMappingsRuntimeHints
|
||||||
org.springframework.boot.WebApplicationType.WebApplicationTypeRuntimeHints
|
|
||||||
|
|
||||||
org.springframework.beans.factory.aot.BeanFactoryInitializationAotProcessor=\
|
org.springframework.beans.factory.aot.BeanFactoryInitializationAotProcessor=\
|
||||||
org.springframework.boot.context.properties.ConfigurationPropertiesBeanFactoryInitializationAotProcessor
|
org.springframework.boot.context.properties.ConfigurationPropertiesBeanFactoryInitializationAotProcessor
|
||||||
|
@ -0,0 +1,1025 @@
|
|||||||
|
# Copyright 2012-2022 the original author or authors.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
|
||||||
|
123=application/vnd.lotus-1-2-3
|
||||||
|
3dml=text/vnd.in3d.3dml
|
||||||
|
3ds=image/x-3ds
|
||||||
|
3g2=video/3gpp2
|
||||||
|
3gp=video/3gpp
|
||||||
|
7z=application/x-7z-compressed
|
||||||
|
aab=application/x-authorware-bin
|
||||||
|
aac=audio/x-aac
|
||||||
|
aam=application/x-authorware-map
|
||||||
|
aas=application/x-authorware-seg
|
||||||
|
abs=audio/x-mpeg
|
||||||
|
abw=application/x-abiword
|
||||||
|
ac=application/pkix-attr-cert
|
||||||
|
acc=application/vnd.americandynamics.acc
|
||||||
|
ace=application/x-ace-compressed
|
||||||
|
acu=application/vnd.acucobol
|
||||||
|
acutc=application/vnd.acucorp
|
||||||
|
adp=audio/adpcm
|
||||||
|
aep=application/vnd.audiograph
|
||||||
|
afm=application/x-font-type1
|
||||||
|
afp=application/vnd.ibm.modcap
|
||||||
|
ahead=application/vnd.ahead.space
|
||||||
|
ai=application/postscript
|
||||||
|
aif=audio/x-aiff
|
||||||
|
aifc=audio/x-aiff
|
||||||
|
aiff=audio/x-aiff
|
||||||
|
aim=application/x-aim
|
||||||
|
air=application/vnd.adobe.air-application-installer-package+zip
|
||||||
|
ait=application/vnd.dvb.ait
|
||||||
|
ami=application/vnd.amiga.ami
|
||||||
|
anx=application/annodex
|
||||||
|
apk=application/vnd.android.package-archive
|
||||||
|
appcache=text/cache-manifest
|
||||||
|
application=application/x-ms-application
|
||||||
|
apr=application/vnd.lotus-approach
|
||||||
|
arc=application/x-freearc
|
||||||
|
art=image/x-jg
|
||||||
|
asc=application/pgp-signature
|
||||||
|
asf=video/x-ms-asf
|
||||||
|
asm=text/x-asm
|
||||||
|
aso=application/vnd.accpac.simply.aso
|
||||||
|
asx=video/x-ms-asf
|
||||||
|
atc=application/vnd.acucorp
|
||||||
|
atom=application/atom+xml
|
||||||
|
atomcat=application/atomcat+xml
|
||||||
|
atomsvc=application/atomsvc+xml
|
||||||
|
atx=application/vnd.antix.game-component
|
||||||
|
au=audio/basic
|
||||||
|
avi=video/x-msvideo
|
||||||
|
avx=video/x-rad-screenplay
|
||||||
|
aw=application/applixware
|
||||||
|
axa=audio/annodex
|
||||||
|
axv=video/annodex
|
||||||
|
azf=application/vnd.airzip.filesecure.azf
|
||||||
|
azs=application/vnd.airzip.filesecure.azs
|
||||||
|
azw=application/vnd.amazon.ebook
|
||||||
|
bat=application/x-msdownload
|
||||||
|
bcpio=application/x-bcpio
|
||||||
|
bdf=application/x-font-bdf
|
||||||
|
bdm=application/vnd.syncml.dm+wbxml
|
||||||
|
bed=application/vnd.realvnc.bed
|
||||||
|
bh2=application/vnd.fujitsu.oasysprs
|
||||||
|
bin=application/octet-stream
|
||||||
|
blb=application/x-blorb
|
||||||
|
blorb=application/x-blorb
|
||||||
|
bmi=application/vnd.bmi
|
||||||
|
bmp=image/bmp
|
||||||
|
body=text/html
|
||||||
|
book=application/vnd.framemaker
|
||||||
|
box=application/vnd.previewsystems.box
|
||||||
|
boz=application/x-bzip2
|
||||||
|
bpk=application/octet-stream
|
||||||
|
btif=image/prs.btif
|
||||||
|
bz=application/x-bzip
|
||||||
|
bz2=application/x-bzip2
|
||||||
|
c=text/x-c
|
||||||
|
c11amc=application/vnd.cluetrust.cartomobile-config
|
||||||
|
c11amz=application/vnd.cluetrust.cartomobile-config-pkg
|
||||||
|
c4d=application/vnd.clonk.c4group
|
||||||
|
c4f=application/vnd.clonk.c4group
|
||||||
|
c4g=application/vnd.clonk.c4group
|
||||||
|
c4p=application/vnd.clonk.c4group
|
||||||
|
c4u=application/vnd.clonk.c4group
|
||||||
|
cab=application/vnd.ms-cab-compressed
|
||||||
|
caf=audio/x-caf
|
||||||
|
cap=application/vnd.tcpdump.pcap
|
||||||
|
car=application/vnd.curl.car
|
||||||
|
cat=application/vnd.ms-pki.seccat
|
||||||
|
cb7=application/x-cbr
|
||||||
|
cba=application/x-cbr
|
||||||
|
cbr=application/x-cbr
|
||||||
|
cbt=application/x-cbr
|
||||||
|
cbz=application/x-cbr
|
||||||
|
cc=text/x-c
|
||||||
|
cct=application/x-director
|
||||||
|
ccxml=application/ccxml+xml
|
||||||
|
cdbcmsg=application/vnd.contact.cmsg
|
||||||
|
cdf=application/x-cdf
|
||||||
|
cdkey=application/vnd.mediastation.cdkey
|
||||||
|
cdmia=application/cdmi-capability
|
||||||
|
cdmic=application/cdmi-container
|
||||||
|
cdmid=application/cdmi-domain
|
||||||
|
cdmio=application/cdmi-object
|
||||||
|
cdmiq=application/cdmi-queue
|
||||||
|
cdx=chemical/x-cdx
|
||||||
|
cdxml=application/vnd.chemdraw+xml
|
||||||
|
cdy=application/vnd.cinderella
|
||||||
|
cer=application/pkix-cert
|
||||||
|
cfs=application/x-cfs-compressed
|
||||||
|
cgm=image/cgm
|
||||||
|
chat=application/x-chat
|
||||||
|
chm=application/vnd.ms-htmlhelp
|
||||||
|
chrt=application/vnd.kde.kchart
|
||||||
|
cif=chemical/x-cif
|
||||||
|
cii=application/vnd.anser-web-certificate-issue-initiation
|
||||||
|
cil=application/vnd.ms-artgalry
|
||||||
|
cla=application/vnd.claymore
|
||||||
|
class=application/java
|
||||||
|
clkk=application/vnd.crick.clicker.keyboard
|
||||||
|
clkp=application/vnd.crick.clicker.palette
|
||||||
|
clkt=application/vnd.crick.clicker.template
|
||||||
|
clkw=application/vnd.crick.clicker.wordbank
|
||||||
|
clkx=application/vnd.crick.clicker
|
||||||
|
clp=application/x-msclip
|
||||||
|
cmc=application/vnd.cosmocaller
|
||||||
|
cmdf=chemical/x-cmdf
|
||||||
|
cml=chemical/x-cml
|
||||||
|
cmp=application/vnd.yellowriver-custom-menu
|
||||||
|
cmx=image/x-cmx
|
||||||
|
cod=application/vnd.rim.cod
|
||||||
|
com=application/x-msdownload
|
||||||
|
conf=text/plain
|
||||||
|
cpio=application/x-cpio
|
||||||
|
cpp=text/x-c
|
||||||
|
cpt=application/mac-compactpro
|
||||||
|
crd=application/x-mscardfile
|
||||||
|
crl=application/pkix-crl
|
||||||
|
crt=application/x-x509-ca-cert
|
||||||
|
cryptonote=application/vnd.rig.cryptonote
|
||||||
|
csh=application/x-csh
|
||||||
|
csml=chemical/x-csml
|
||||||
|
csp=application/vnd.commonspace
|
||||||
|
css=text/css
|
||||||
|
cst=application/x-director
|
||||||
|
csv=text/csv
|
||||||
|
cu=application/cu-seeme
|
||||||
|
curl=text/vnd.curl
|
||||||
|
cww=application/prs.cww
|
||||||
|
cxt=application/x-director
|
||||||
|
cxx=text/x-c
|
||||||
|
dae=model/vnd.collada+xml
|
||||||
|
daf=application/vnd.mobius.daf
|
||||||
|
dart=application/vnd.dart
|
||||||
|
dataless=application/vnd.fdsn.seed
|
||||||
|
davmount=application/davmount+xml
|
||||||
|
dbk=application/docbook+xml
|
||||||
|
dcr=application/x-director
|
||||||
|
dcurl=text/vnd.curl.dcurl
|
||||||
|
dd2=application/vnd.oma.dd2+xml
|
||||||
|
ddd=application/vnd.fujixerox.ddd
|
||||||
|
deb=application/x-debian-package
|
||||||
|
def=text/plain
|
||||||
|
deploy=application/octet-stream
|
||||||
|
der=application/x-x509-ca-cert
|
||||||
|
dfac=application/vnd.dreamfactory
|
||||||
|
dgc=application/x-dgc-compressed
|
||||||
|
dib=image/bmp
|
||||||
|
dic=text/x-c
|
||||||
|
dir=application/x-director
|
||||||
|
dis=application/vnd.mobius.dis
|
||||||
|
dist=application/octet-stream
|
||||||
|
distz=application/octet-stream
|
||||||
|
djv=image/vnd.djvu
|
||||||
|
djvu=image/vnd.djvu
|
||||||
|
dll=application/x-msdownload
|
||||||
|
dmg=application/x-apple-diskimage
|
||||||
|
dmp=application/vnd.tcpdump.pcap
|
||||||
|
dms=application/octet-stream
|
||||||
|
dna=application/vnd.dna
|
||||||
|
doc=application/msword
|
||||||
|
docm=application/vnd.ms-word.document.macroenabled.12
|
||||||
|
docx=application/vnd.openxmlformats-officedocument.wordprocessingml.document
|
||||||
|
dot=application/msword
|
||||||
|
dotm=application/vnd.ms-word.template.macroenabled.12
|
||||||
|
dotx=application/vnd.openxmlformats-officedocument.wordprocessingml.template
|
||||||
|
dp=application/vnd.osgi.dp
|
||||||
|
dpg=application/vnd.dpgraph
|
||||||
|
dra=audio/vnd.dra
|
||||||
|
dsc=text/prs.lines.tag
|
||||||
|
dssc=application/dssc+der
|
||||||
|
dtb=application/x-dtbook+xml
|
||||||
|
dtd=application/xml-dtd
|
||||||
|
dts=audio/vnd.dts
|
||||||
|
dtshd=audio/vnd.dts.hd
|
||||||
|
dump=application/octet-stream
|
||||||
|
dv=video/x-dv
|
||||||
|
dvb=video/vnd.dvb.file
|
||||||
|
dvi=application/x-dvi
|
||||||
|
dwf=model/vnd.dwf
|
||||||
|
dwg=image/vnd.dwg
|
||||||
|
dxf=image/vnd.dxf
|
||||||
|
dxp=application/vnd.spotfire.dxp
|
||||||
|
dxr=application/x-director
|
||||||
|
ecelp4800=audio/vnd.nuera.ecelp4800
|
||||||
|
ecelp7470=audio/vnd.nuera.ecelp7470
|
||||||
|
ecelp9600=audio/vnd.nuera.ecelp9600
|
||||||
|
ecma=application/ecmascript
|
||||||
|
edm=application/vnd.novadigm.edm
|
||||||
|
edx=application/vnd.novadigm.edx
|
||||||
|
efif=application/vnd.picsel
|
||||||
|
ei6=application/vnd.pg.osasli
|
||||||
|
elc=application/octet-stream
|
||||||
|
emf=application/x-msmetafile
|
||||||
|
eml=message/rfc822
|
||||||
|
emma=application/emma+xml
|
||||||
|
emz=application/x-msmetafile
|
||||||
|
eol=audio/vnd.digital-winds
|
||||||
|
eot=application/vnd.ms-fontobject
|
||||||
|
eps=application/postscript
|
||||||
|
epub=application/epub+zip
|
||||||
|
es3=application/vnd.eszigno3+xml
|
||||||
|
esa=application/vnd.osgi.subsystem
|
||||||
|
esf=application/vnd.epson.esf
|
||||||
|
et3=application/vnd.eszigno3+xml
|
||||||
|
etx=text/x-setext
|
||||||
|
eva=application/x-eva
|
||||||
|
evy=application/x-envoy
|
||||||
|
exe=application/octet-stream
|
||||||
|
exi=application/exi
|
||||||
|
ext=application/vnd.novadigm.ext
|
||||||
|
ez=application/andrew-inset
|
||||||
|
ez2=application/vnd.ezpix-album
|
||||||
|
ez3=application/vnd.ezpix-package
|
||||||
|
f=text/x-fortran
|
||||||
|
f4v=video/x-f4v
|
||||||
|
f77=text/x-fortran
|
||||||
|
f90=text/x-fortran
|
||||||
|
fbs=image/vnd.fastbidsheet
|
||||||
|
fcdt=application/vnd.adobe.formscentral.fcdt
|
||||||
|
fcs=application/vnd.isac.fcs
|
||||||
|
fdf=application/vnd.fdf
|
||||||
|
fe_launch=application/vnd.denovo.fcselayout-link
|
||||||
|
fg5=application/vnd.fujitsu.oasysgp
|
||||||
|
fgd=application/x-director
|
||||||
|
fh=image/x-freehand
|
||||||
|
fh4=image/x-freehand
|
||||||
|
fh5=image/x-freehand
|
||||||
|
fh7=image/x-freehand
|
||||||
|
fhc=image/x-freehand
|
||||||
|
fig=application/x-xfig
|
||||||
|
flac=audio/flac
|
||||||
|
fli=video/x-fli
|
||||||
|
flo=application/vnd.micrografx.flo
|
||||||
|
flv=video/x-flv
|
||||||
|
flw=application/vnd.kde.kivio
|
||||||
|
flx=text/vnd.fmi.flexstor
|
||||||
|
fly=text/vnd.fly
|
||||||
|
fm=application/vnd.framemaker
|
||||||
|
fnc=application/vnd.frogans.fnc
|
||||||
|
for=text/x-fortran
|
||||||
|
fpx=image/vnd.fpx
|
||||||
|
frame=application/vnd.framemaker
|
||||||
|
fsc=application/vnd.fsc.weblaunch
|
||||||
|
fst=image/vnd.fst
|
||||||
|
ftc=application/vnd.fluxtime.clip
|
||||||
|
fti=application/vnd.anser-web-funds-transfer-initiation
|
||||||
|
fvt=video/vnd.fvt
|
||||||
|
fxp=application/vnd.adobe.fxp
|
||||||
|
fxpl=application/vnd.adobe.fxp
|
||||||
|
fzs=application/vnd.fuzzysheet
|
||||||
|
g2w=application/vnd.geoplan
|
||||||
|
g3=image/g3fax
|
||||||
|
g3w=application/vnd.geospace
|
||||||
|
gac=application/vnd.groove-account
|
||||||
|
gam=application/x-tads
|
||||||
|
gbr=application/rpki-ghostbusters
|
||||||
|
gca=application/x-gca-compressed
|
||||||
|
gdl=model/vnd.gdl
|
||||||
|
geo=application/vnd.dynageo
|
||||||
|
gex=application/vnd.geometry-explorer
|
||||||
|
ggb=application/vnd.geogebra.file
|
||||||
|
ggt=application/vnd.geogebra.tool
|
||||||
|
ghf=application/vnd.groove-help
|
||||||
|
gif=image/gif
|
||||||
|
gim=application/vnd.groove-identity-message
|
||||||
|
gml=application/gml+xml
|
||||||
|
gmx=application/vnd.gmx
|
||||||
|
gnumeric=application/x-gnumeric
|
||||||
|
gph=application/vnd.flographit
|
||||||
|
gpx=application/gpx+xml
|
||||||
|
gqf=application/vnd.grafeq
|
||||||
|
gqs=application/vnd.grafeq
|
||||||
|
gram=application/srgs
|
||||||
|
gramps=application/x-gramps-xml
|
||||||
|
gre=application/vnd.geometry-explorer
|
||||||
|
grv=application/vnd.groove-injector
|
||||||
|
grxml=application/srgs+xml
|
||||||
|
gsf=application/x-font-ghostscript
|
||||||
|
gtar=application/x-gtar
|
||||||
|
gtm=application/vnd.groove-tool-message
|
||||||
|
gtw=model/vnd.gtw
|
||||||
|
gv=text/vnd.graphviz
|
||||||
|
gxf=application/gxf
|
||||||
|
gxt=application/vnd.geonext
|
||||||
|
gz=application/x-gzip
|
||||||
|
h=text/x-c
|
||||||
|
h261=video/h261
|
||||||
|
h263=video/h263
|
||||||
|
h264=video/h264
|
||||||
|
hal=application/vnd.hal+xml
|
||||||
|
hbci=application/vnd.hbci
|
||||||
|
hdf=application/x-hdf
|
||||||
|
hh=text/x-c
|
||||||
|
hlp=application/winhlp
|
||||||
|
hpgl=application/vnd.hp-hpgl
|
||||||
|
hpid=application/vnd.hp-hpid
|
||||||
|
hps=application/vnd.hp-hps
|
||||||
|
hqx=application/mac-binhex40
|
||||||
|
htc=text/x-component
|
||||||
|
htke=application/vnd.kenameaapp
|
||||||
|
htm=text/html
|
||||||
|
html=text/html
|
||||||
|
hvd=application/vnd.yamaha.hv-dic
|
||||||
|
hvp=application/vnd.yamaha.hv-voice
|
||||||
|
hvs=application/vnd.yamaha.hv-script
|
||||||
|
i2g=application/vnd.intergeo
|
||||||
|
icc=application/vnd.iccprofile
|
||||||
|
ice=x-conference/x-cooltalk
|
||||||
|
icm=application/vnd.iccprofile
|
||||||
|
ico=image/x-icon
|
||||||
|
ics=text/calendar
|
||||||
|
ief=image/ief
|
||||||
|
ifb=text/calendar
|
||||||
|
ifm=application/vnd.shana.informed.formdata
|
||||||
|
iges=model/iges
|
||||||
|
igl=application/vnd.igloader
|
||||||
|
igm=application/vnd.insors.igm
|
||||||
|
igs=model/iges
|
||||||
|
igx=application/vnd.micrografx.igx
|
||||||
|
iif=application/vnd.shana.informed.interchange
|
||||||
|
imp=application/vnd.accpac.simply.imp
|
||||||
|
ims=application/vnd.ms-ims
|
||||||
|
in=text/plain
|
||||||
|
ink=application/inkml+xml
|
||||||
|
inkml=application/inkml+xml
|
||||||
|
install=application/x-install-instructions
|
||||||
|
iota=application/vnd.astraea-software.iota
|
||||||
|
ipfix=application/ipfix
|
||||||
|
ipk=application/vnd.shana.informed.package
|
||||||
|
irm=application/vnd.ibm.rights-management
|
||||||
|
irp=application/vnd.irepository.package+xml
|
||||||
|
iso=application/x-iso9660-image
|
||||||
|
itp=application/vnd.shana.informed.formtemplate
|
||||||
|
ivp=application/vnd.immervision-ivp
|
||||||
|
ivu=application/vnd.immervision-ivu
|
||||||
|
jad=text/vnd.sun.j2me.app-descriptor
|
||||||
|
jam=application/vnd.jam
|
||||||
|
jar=application/java-archive
|
||||||
|
java=text/x-java-source
|
||||||
|
jisp=application/vnd.jisp
|
||||||
|
jlt=application/vnd.hp-jlyt
|
||||||
|
jnlp=application/x-java-jnlp-file
|
||||||
|
joda=application/vnd.joost.joda-archive
|
||||||
|
jpe=image/jpeg
|
||||||
|
jpeg=image/jpeg
|
||||||
|
jpg=image/jpeg
|
||||||
|
jpgm=video/jpm
|
||||||
|
jpgv=video/jpeg
|
||||||
|
jpm=video/jpm
|
||||||
|
js=application/javascript
|
||||||
|
jsf=text/plain
|
||||||
|
json=application/json
|
||||||
|
jsonml=application/jsonml+json
|
||||||
|
jspf=text/plain
|
||||||
|
kar=audio/midi
|
||||||
|
karbon=application/vnd.kde.karbon
|
||||||
|
kfo=application/vnd.kde.kformula
|
||||||
|
kia=application/vnd.kidspiration
|
||||||
|
kml=application/vnd.google-earth.kml+xml
|
||||||
|
kmz=application/vnd.google-earth.kmz
|
||||||
|
kne=application/vnd.kinar
|
||||||
|
knp=application/vnd.kinar
|
||||||
|
kon=application/vnd.kde.kontour
|
||||||
|
kpr=application/vnd.kde.kpresenter
|
||||||
|
kpt=application/vnd.kde.kpresenter
|
||||||
|
kpxx=application/vnd.ds-keypoint
|
||||||
|
ksp=application/vnd.kde.kspread
|
||||||
|
ktr=application/vnd.kahootz
|
||||||
|
ktx=image/ktx
|
||||||
|
ktz=application/vnd.kahootz
|
||||||
|
kwd=application/vnd.kde.kword
|
||||||
|
kwt=application/vnd.kde.kword
|
||||||
|
lasxml=application/vnd.las.las+xml
|
||||||
|
latex=application/x-latex
|
||||||
|
lbd=application/vnd.llamagraphics.life-balance.desktop
|
||||||
|
lbe=application/vnd.llamagraphics.life-balance.exchange+xml
|
||||||
|
les=application/vnd.hhe.lesson-player
|
||||||
|
lha=application/x-lzh-compressed
|
||||||
|
link66=application/vnd.route66.link66+xml
|
||||||
|
list=text/plain
|
||||||
|
list3820=application/vnd.ibm.modcap
|
||||||
|
listafp=application/vnd.ibm.modcap
|
||||||
|
lnk=application/x-ms-shortcut
|
||||||
|
log=text/plain
|
||||||
|
lostxml=application/lost+xml
|
||||||
|
lrf=application/octet-stream
|
||||||
|
lrm=application/vnd.ms-lrm
|
||||||
|
ltf=application/vnd.frogans.ltf
|
||||||
|
lvp=audio/vnd.lucent.voice
|
||||||
|
lwp=application/vnd.lotus-wordpro
|
||||||
|
lzh=application/x-lzh-compressed
|
||||||
|
m13=application/x-msmediaview
|
||||||
|
m14=application/x-msmediaview
|
||||||
|
m1v=video/mpeg
|
||||||
|
m21=application/mp21
|
||||||
|
m2a=audio/mpeg
|
||||||
|
m2v=video/mpeg
|
||||||
|
m3a=audio/mpeg
|
||||||
|
m3u=audio/x-mpegurl
|
||||||
|
m3u8=application/vnd.apple.mpegurl
|
||||||
|
m4a=audio/mp4
|
||||||
|
m4b=audio/mp4
|
||||||
|
m4r=audio/mp4
|
||||||
|
m4u=video/vnd.mpegurl
|
||||||
|
m4v=video/mp4
|
||||||
|
ma=application/mathematica
|
||||||
|
mac=image/x-macpaint
|
||||||
|
mads=application/mads+xml
|
||||||
|
mag=application/vnd.ecowin.chart
|
||||||
|
maker=application/vnd.framemaker
|
||||||
|
man=text/troff
|
||||||
|
mar=application/octet-stream
|
||||||
|
mathml=application/mathml+xml
|
||||||
|
mb=application/mathematica
|
||||||
|
mbk=application/vnd.mobius.mbk
|
||||||
|
mbox=application/mbox
|
||||||
|
mc1=application/vnd.medcalcdata
|
||||||
|
mcd=application/vnd.mcd
|
||||||
|
mcurl=text/vnd.curl.mcurl
|
||||||
|
mdb=application/x-msaccess
|
||||||
|
mdi=image/vnd.ms-modi
|
||||||
|
me=text/troff
|
||||||
|
mesh=model/mesh
|
||||||
|
meta4=application/metalink4+xml
|
||||||
|
metalink=application/metalink+xml
|
||||||
|
mets=application/mets+xml
|
||||||
|
mfm=application/vnd.mfmp
|
||||||
|
mft=application/rpki-manifest
|
||||||
|
mgp=application/vnd.osgeo.mapguide.package
|
||||||
|
mgz=application/vnd.proteus.magazine
|
||||||
|
mid=audio/midi
|
||||||
|
midi=audio/midi
|
||||||
|
mie=application/x-mie
|
||||||
|
mif=application/x-mif
|
||||||
|
mime=message/rfc822
|
||||||
|
mj2=video/mj2
|
||||||
|
mjp2=video/mj2
|
||||||
|
mk3d=video/x-matroska
|
||||||
|
mka=audio/x-matroska
|
||||||
|
mks=video/x-matroska
|
||||||
|
mkv=video/x-matroska
|
||||||
|
mlp=application/vnd.dolby.mlp
|
||||||
|
mmd=application/vnd.chipnuts.karaoke-mmd
|
||||||
|
mmf=application/vnd.smaf
|
||||||
|
mmr=image/vnd.fujixerox.edmics-mmr
|
||||||
|
mng=video/x-mng
|
||||||
|
mny=application/x-msmoney
|
||||||
|
mobi=application/x-mobipocket-ebook
|
||||||
|
mods=application/mods+xml
|
||||||
|
mov=video/quicktime
|
||||||
|
movie=video/x-sgi-movie
|
||||||
|
mp1=audio/mpeg
|
||||||
|
mp2=audio/mpeg
|
||||||
|
mp21=application/mp21
|
||||||
|
mp2a=audio/mpeg
|
||||||
|
mp3=audio/mpeg
|
||||||
|
mp4=video/mp4
|
||||||
|
mp4a=audio/mp4
|
||||||
|
mp4s=application/mp4
|
||||||
|
mp4v=video/mp4
|
||||||
|
mpa=audio/mpeg
|
||||||
|
mpc=application/vnd.mophun.certificate
|
||||||
|
mpe=video/mpeg
|
||||||
|
mpeg=video/mpeg
|
||||||
|
mpega=audio/x-mpeg
|
||||||
|
mpg=video/mpeg
|
||||||
|
mpg4=video/mp4
|
||||||
|
mpga=audio/mpeg
|
||||||
|
mpkg=application/vnd.apple.installer+xml
|
||||||
|
mpm=application/vnd.blueice.multipass
|
||||||
|
mpn=application/vnd.mophun.application
|
||||||
|
mpp=application/vnd.ms-project
|
||||||
|
mpt=application/vnd.ms-project
|
||||||
|
mpv2=video/mpeg2
|
||||||
|
mpy=application/vnd.ibm.minipay
|
||||||
|
mqy=application/vnd.mobius.mqy
|
||||||
|
mrc=application/marc
|
||||||
|
mrcx=application/marcxml+xml
|
||||||
|
ms=text/troff
|
||||||
|
mscml=application/mediaservercontrol+xml
|
||||||
|
mseed=application/vnd.fdsn.mseed
|
||||||
|
mseq=application/vnd.mseq
|
||||||
|
msf=application/vnd.epson.msf
|
||||||
|
msh=model/mesh
|
||||||
|
msi=application/x-msdownload
|
||||||
|
msl=application/vnd.mobius.msl
|
||||||
|
msty=application/vnd.muvee.style
|
||||||
|
mts=model/vnd.mts
|
||||||
|
mus=application/vnd.musician
|
||||||
|
musicxml=application/vnd.recordare.musicxml+xml
|
||||||
|
mvb=application/x-msmediaview
|
||||||
|
mwf=application/vnd.mfer
|
||||||
|
mxf=application/mxf
|
||||||
|
mxl=application/vnd.recordare.musicxml
|
||||||
|
mxml=application/xv+xml
|
||||||
|
mxs=application/vnd.triscape.mxs
|
||||||
|
mxu=video/vnd.mpegurl
|
||||||
|
n-gage=application/vnd.nokia.n-gage.symbian.install
|
||||||
|
n3=text/n3
|
||||||
|
nb=application/mathematica
|
||||||
|
nbp=application/vnd.wolfram.player
|
||||||
|
nc=application/x-netcdf
|
||||||
|
ncx=application/x-dtbncx+xml
|
||||||
|
nfo=text/x-nfo
|
||||||
|
ngdat=application/vnd.nokia.n-gage.data
|
||||||
|
nitf=application/vnd.nitf
|
||||||
|
nlu=application/vnd.neurolanguage.nlu
|
||||||
|
nml=application/vnd.enliven
|
||||||
|
nnd=application/vnd.noblenet-directory
|
||||||
|
nns=application/vnd.noblenet-sealer
|
||||||
|
nnw=application/vnd.noblenet-web
|
||||||
|
npx=image/vnd.net-fpx
|
||||||
|
nsc=application/x-conference
|
||||||
|
nsf=application/vnd.lotus-notes
|
||||||
|
ntf=application/vnd.nitf
|
||||||
|
nzb=application/x-nzb
|
||||||
|
oa2=application/vnd.fujitsu.oasys2
|
||||||
|
oa3=application/vnd.fujitsu.oasys3
|
||||||
|
oas=application/vnd.fujitsu.oasys
|
||||||
|
obd=application/x-msbinder
|
||||||
|
obj=application/x-tgif
|
||||||
|
oda=application/oda
|
||||||
|
odb=application/vnd.oasis.opendocument.database
|
||||||
|
odc=application/vnd.oasis.opendocument.chart
|
||||||
|
odf=application/vnd.oasis.opendocument.formula
|
||||||
|
odft=application/vnd.oasis.opendocument.formula-template
|
||||||
|
odg=application/vnd.oasis.opendocument.graphics
|
||||||
|
odi=application/vnd.oasis.opendocument.image
|
||||||
|
odm=application/vnd.oasis.opendocument.text-master
|
||||||
|
odp=application/vnd.oasis.opendocument.presentation
|
||||||
|
ods=application/vnd.oasis.opendocument.spreadsheet
|
||||||
|
odt=application/vnd.oasis.opendocument.text
|
||||||
|
oga=audio/ogg
|
||||||
|
ogg=audio/ogg
|
||||||
|
ogv=video/ogg
|
||||||
|
ogx=application/ogg
|
||||||
|
omdoc=application/omdoc+xml
|
||||||
|
onepkg=application/onenote
|
||||||
|
onetmp=application/onenote
|
||||||
|
onetoc=application/onenote
|
||||||
|
onetoc2=application/onenote
|
||||||
|
opf=application/oebps-package+xml
|
||||||
|
opml=text/x-opml
|
||||||
|
oprc=application/vnd.palm
|
||||||
|
org=application/vnd.lotus-organizer
|
||||||
|
osf=application/vnd.yamaha.openscoreformat
|
||||||
|
osfpvg=application/vnd.yamaha.openscoreformat.osfpvg+xml
|
||||||
|
otc=application/vnd.oasis.opendocument.chart-template
|
||||||
|
otf=font/otf
|
||||||
|
otg=application/vnd.oasis.opendocument.graphics-template
|
||||||
|
oth=application/vnd.oasis.opendocument.text-web
|
||||||
|
oti=application/vnd.oasis.opendocument.image-template
|
||||||
|
otp=application/vnd.oasis.opendocument.presentation-template
|
||||||
|
ots=application/vnd.oasis.opendocument.spreadsheet-template
|
||||||
|
ott=application/vnd.oasis.opendocument.text-template
|
||||||
|
oxps=application/oxps
|
||||||
|
oxt=application/vnd.openofficeorg.extension
|
||||||
|
p=text/x-pascal
|
||||||
|
p10=application/pkcs10
|
||||||
|
p12=application/x-pkcs12
|
||||||
|
p7b=application/x-pkcs7-certificates
|
||||||
|
p7c=application/pkcs7-mime
|
||||||
|
p7m=application/pkcs7-mime
|
||||||
|
p7r=application/x-pkcs7-certreqresp
|
||||||
|
p7s=application/pkcs7-signature
|
||||||
|
p8=application/pkcs8
|
||||||
|
pas=text/x-pascal
|
||||||
|
paw=application/vnd.pawaafile
|
||||||
|
pbd=application/vnd.powerbuilder6
|
||||||
|
pbm=image/x-portable-bitmap
|
||||||
|
pcap=application/vnd.tcpdump.pcap
|
||||||
|
pcf=application/x-font-pcf
|
||||||
|
pcl=application/vnd.hp-pcl
|
||||||
|
pclxl=application/vnd.hp-pclxl
|
||||||
|
pct=image/pict
|
||||||
|
pcurl=application/vnd.curl.pcurl
|
||||||
|
pcx=image/x-pcx
|
||||||
|
pdb=application/vnd.palm
|
||||||
|
pdf=application/pdf
|
||||||
|
pfa=application/x-font-type1
|
||||||
|
pfb=application/x-font-type1
|
||||||
|
pfm=application/x-font-type1
|
||||||
|
pfr=application/font-tdpfr
|
||||||
|
pfx=application/x-pkcs12
|
||||||
|
pgm=image/x-portable-graymap
|
||||||
|
pgn=application/x-chess-pgn
|
||||||
|
pgp=application/pgp-encrypted
|
||||||
|
pic=image/pict
|
||||||
|
pict=image/pict
|
||||||
|
pkg=application/octet-stream
|
||||||
|
pki=application/pkixcmp
|
||||||
|
pkipath=application/pkix-pkipath
|
||||||
|
plb=application/vnd.3gpp.pic-bw-large
|
||||||
|
plc=application/vnd.mobius.plc
|
||||||
|
plf=application/vnd.pocketlearn
|
||||||
|
pls=audio/x-scpls
|
||||||
|
pml=application/vnd.ctc-posml
|
||||||
|
png=image/png
|
||||||
|
pnm=image/x-portable-anymap
|
||||||
|
pnt=image/x-macpaint
|
||||||
|
portpkg=application/vnd.macports.portpkg
|
||||||
|
pot=application/vnd.ms-powerpoint
|
||||||
|
potm=application/vnd.ms-powerpoint.template.macroenabled.12
|
||||||
|
potx=application/vnd.openxmlformats-officedocument.presentationml.template
|
||||||
|
ppam=application/vnd.ms-powerpoint.addin.macroenabled.12
|
||||||
|
ppd=application/vnd.cups-ppd
|
||||||
|
ppm=image/x-portable-pixmap
|
||||||
|
pps=application/vnd.ms-powerpoint
|
||||||
|
ppsm=application/vnd.ms-powerpoint.slideshow.macroenabled.12
|
||||||
|
ppsx=application/vnd.openxmlformats-officedocument.presentationml.slideshow
|
||||||
|
ppt=application/vnd.ms-powerpoint
|
||||||
|
pptm=application/vnd.ms-powerpoint.presentation.macroenabled.12
|
||||||
|
pptx=application/vnd.openxmlformats-officedocument.presentationml.presentation
|
||||||
|
pqa=application/vnd.palm
|
||||||
|
prc=application/x-mobipocket-ebook
|
||||||
|
pre=application/vnd.lotus-freelance
|
||||||
|
prf=application/pics-rules
|
||||||
|
ps=application/postscript
|
||||||
|
psb=application/vnd.3gpp.pic-bw-small
|
||||||
|
psd=image/vnd.adobe.photoshop
|
||||||
|
psf=application/x-font-linux-psf
|
||||||
|
pskcxml=application/pskc+xml
|
||||||
|
ptid=application/vnd.pvi.ptid1
|
||||||
|
pub=application/x-mspublisher
|
||||||
|
pvb=application/vnd.3gpp.pic-bw-var
|
||||||
|
pwn=application/vnd.3m.post-it-notes
|
||||||
|
pya=audio/vnd.ms-playready.media.pya
|
||||||
|
pyv=video/vnd.ms-playready.media.pyv
|
||||||
|
qam=application/vnd.epson.quickanime
|
||||||
|
qbo=application/vnd.intu.qbo
|
||||||
|
qfx=application/vnd.intu.qfx
|
||||||
|
qps=application/vnd.publishare-delta-tree
|
||||||
|
qt=video/quicktime
|
||||||
|
qti=image/x-quicktime
|
||||||
|
qtif=image/x-quicktime
|
||||||
|
qwd=application/vnd.quark.quarkxpress
|
||||||
|
qwt=application/vnd.quark.quarkxpress
|
||||||
|
qxb=application/vnd.quark.quarkxpress
|
||||||
|
qxd=application/vnd.quark.quarkxpress
|
||||||
|
qxl=application/vnd.quark.quarkxpress
|
||||||
|
qxt=application/vnd.quark.quarkxpress
|
||||||
|
ra=audio/x-pn-realaudio
|
||||||
|
ram=audio/x-pn-realaudio
|
||||||
|
rar=application/x-rar-compressed
|
||||||
|
ras=image/x-cmu-raster
|
||||||
|
rcprofile=application/vnd.ipunplugged.rcprofile
|
||||||
|
rdf=application/rdf+xml
|
||||||
|
rdz=application/vnd.data-vision.rdz
|
||||||
|
rep=application/vnd.businessobjects
|
||||||
|
res=application/x-dtbresource+xml
|
||||||
|
rgb=image/x-rgb
|
||||||
|
rif=application/reginfo+xml
|
||||||
|
rip=audio/vnd.rip
|
||||||
|
ris=application/x-research-info-systems
|
||||||
|
rl=application/resource-lists+xml
|
||||||
|
rlc=image/vnd.fujixerox.edmics-rlc
|
||||||
|
rld=application/resource-lists-diff+xml
|
||||||
|
rm=application/vnd.rn-realmedia
|
||||||
|
rmi=audio/midi
|
||||||
|
rmp=audio/x-pn-realaudio-plugin
|
||||||
|
rms=application/vnd.jcp.javame.midlet-rms
|
||||||
|
rmvb=application/vnd.rn-realmedia-vbr
|
||||||
|
rnc=application/relax-ng-compact-syntax
|
||||||
|
roa=application/rpki-roa
|
||||||
|
roff=text/troff
|
||||||
|
rp9=application/vnd.cloanto.rp9
|
||||||
|
rpss=application/vnd.nokia.radio-presets
|
||||||
|
rpst=application/vnd.nokia.radio-preset
|
||||||
|
rq=application/sparql-query
|
||||||
|
rs=application/rls-services+xml
|
||||||
|
rsd=application/rsd+xml
|
||||||
|
rss=application/rss+xml
|
||||||
|
rtf=application/rtf
|
||||||
|
rtx=text/richtext
|
||||||
|
s=text/x-asm
|
||||||
|
s3m=audio/s3m
|
||||||
|
saf=application/vnd.yamaha.smaf-audio
|
||||||
|
sbml=application/sbml+xml
|
||||||
|
sc=application/vnd.ibm.secure-container
|
||||||
|
scd=application/x-msschedule
|
||||||
|
scm=application/vnd.lotus-screencam
|
||||||
|
scq=application/scvp-cv-request
|
||||||
|
scs=application/scvp-cv-response
|
||||||
|
scurl=text/vnd.curl.scurl
|
||||||
|
sda=application/vnd.stardivision.draw
|
||||||
|
sdc=application/vnd.stardivision.calc
|
||||||
|
sdd=application/vnd.stardivision.impress
|
||||||
|
sdkd=application/vnd.solent.sdkm+xml
|
||||||
|
sdkm=application/vnd.solent.sdkm+xml
|
||||||
|
sdp=application/sdp
|
||||||
|
sdw=application/vnd.stardivision.writer
|
||||||
|
see=application/vnd.seemail
|
||||||
|
seed=application/vnd.fdsn.seed
|
||||||
|
sema=application/vnd.sema
|
||||||
|
semd=application/vnd.semd
|
||||||
|
semf=application/vnd.semf
|
||||||
|
ser=application/java-serialized-object
|
||||||
|
setpay=application/set-payment-initiation
|
||||||
|
setreg=application/set-registration-initiation
|
||||||
|
sfd-hdstx=application/vnd.hydrostatix.sof-data
|
||||||
|
sfs=application/vnd.spotfire.sfs
|
||||||
|
sfv=text/x-sfv
|
||||||
|
sgi=image/sgi
|
||||||
|
sgl=application/vnd.stardivision.writer-global
|
||||||
|
sgm=text/sgml
|
||||||
|
sgml=text/sgml
|
||||||
|
sh=application/x-sh
|
||||||
|
shar=application/x-shar
|
||||||
|
shf=application/shf+xml
|
||||||
|
sid=image/x-mrsid-image
|
||||||
|
sig=application/pgp-signature
|
||||||
|
sil=audio/silk
|
||||||
|
silo=model/mesh
|
||||||
|
sis=application/vnd.symbian.install
|
||||||
|
sisx=application/vnd.symbian.install
|
||||||
|
sit=application/x-stuffit
|
||||||
|
sitx=application/x-stuffitx
|
||||||
|
skd=application/vnd.koan
|
||||||
|
skm=application/vnd.koan
|
||||||
|
skp=application/vnd.koan
|
||||||
|
skt=application/vnd.koan
|
||||||
|
sldm=application/vnd.ms-powerpoint.slide.macroenabled.12
|
||||||
|
sldx=application/vnd.openxmlformats-officedocument.presentationml.slide
|
||||||
|
slt=application/vnd.epson.salt
|
||||||
|
sm=application/vnd.stepmania.stepchart
|
||||||
|
smf=application/vnd.stardivision.math
|
||||||
|
smi=application/smil+xml
|
||||||
|
smil=application/smil+xml
|
||||||
|
smv=video/x-smv
|
||||||
|
smzip=application/vnd.stepmania.package
|
||||||
|
snd=audio/basic
|
||||||
|
snf=application/x-font-snf
|
||||||
|
so=application/octet-stream
|
||||||
|
spc=application/x-pkcs7-certificates
|
||||||
|
spf=application/vnd.yamaha.smaf-phrase
|
||||||
|
spl=application/x-futuresplash
|
||||||
|
spot=text/vnd.in3d.spot
|
||||||
|
spp=application/scvp-vp-response
|
||||||
|
spq=application/scvp-vp-request
|
||||||
|
spx=audio/ogg
|
||||||
|
sql=application/x-sql
|
||||||
|
src=application/x-wais-source
|
||||||
|
srt=application/x-subrip
|
||||||
|
sru=application/sru+xml
|
||||||
|
srx=application/sparql-results+xml
|
||||||
|
ssdl=application/ssdl+xml
|
||||||
|
sse=application/vnd.kodak-descriptor
|
||||||
|
ssf=application/vnd.epson.ssf
|
||||||
|
ssml=application/ssml+xml
|
||||||
|
st=application/vnd.sailingtracker.track
|
||||||
|
stc=application/vnd.sun.xml.calc.template
|
||||||
|
std=application/vnd.sun.xml.draw.template
|
||||||
|
stf=application/vnd.wt.stf
|
||||||
|
sti=application/vnd.sun.xml.impress.template
|
||||||
|
stk=application/hyperstudio
|
||||||
|
stl=application/vnd.ms-pki.stl
|
||||||
|
str=application/vnd.pg.format
|
||||||
|
stw=application/vnd.sun.xml.writer.template
|
||||||
|
sub=text/vnd.dvb.subtitle
|
||||||
|
sus=application/vnd.sus-calendar
|
||||||
|
susp=application/vnd.sus-calendar
|
||||||
|
sv4cpio=application/x-sv4cpio
|
||||||
|
sv4crc=application/x-sv4crc
|
||||||
|
svc=application/vnd.dvb.service
|
||||||
|
svd=application/vnd.svd
|
||||||
|
svg=image/svg+xml
|
||||||
|
svgz=image/svg+xml
|
||||||
|
swa=application/x-director
|
||||||
|
swf=application/x-shockwave-flash
|
||||||
|
swi=application/vnd.aristanetworks.swi
|
||||||
|
sxc=application/vnd.sun.xml.calc
|
||||||
|
sxd=application/vnd.sun.xml.draw
|
||||||
|
sxg=application/vnd.sun.xml.writer.global
|
||||||
|
sxi=application/vnd.sun.xml.impress
|
||||||
|
sxm=application/vnd.sun.xml.math
|
||||||
|
sxw=application/vnd.sun.xml.writer
|
||||||
|
t=text/troff
|
||||||
|
t3=application/x-t3vm-image
|
||||||
|
taglet=application/vnd.mynfc
|
||||||
|
tao=application/vnd.tao.intent-module-archive
|
||||||
|
tar=application/x-tar
|
||||||
|
tcap=application/vnd.3gpp2.tcap
|
||||||
|
tcl=application/x-tcl
|
||||||
|
teacher=application/vnd.smart.teacher
|
||||||
|
tei=application/tei+xml
|
||||||
|
teicorpus=application/tei+xml
|
||||||
|
tex=application/x-tex
|
||||||
|
texi=application/x-texinfo
|
||||||
|
texinfo=application/x-texinfo
|
||||||
|
text=text/plain
|
||||||
|
tfi=application/thraud+xml
|
||||||
|
tfm=application/x-tex-tfm
|
||||||
|
tga=image/x-tga
|
||||||
|
thmx=application/vnd.ms-officetheme
|
||||||
|
tif=image/tiff
|
||||||
|
tiff=image/tiff
|
||||||
|
tmo=application/vnd.tmobile-livetv
|
||||||
|
torrent=application/x-bittorrent
|
||||||
|
tpl=application/vnd.groove-tool-template
|
||||||
|
tpt=application/vnd.trid.tpt
|
||||||
|
tr=text/troff
|
||||||
|
tra=application/vnd.trueapp
|
||||||
|
trm=application/x-msterminal
|
||||||
|
tsd=application/timestamped-data
|
||||||
|
tsv=text/tab-separated-values
|
||||||
|
ttc=font/collection
|
||||||
|
ttf=font/ttf
|
||||||
|
ttl=text/turtle
|
||||||
|
twd=application/vnd.simtech-mindmapper
|
||||||
|
twds=application/vnd.simtech-mindmapper
|
||||||
|
txd=application/vnd.genomatix.tuxedo
|
||||||
|
txf=application/vnd.mobius.txf
|
||||||
|
txt=text/plain
|
||||||
|
u32=application/x-authorware-bin
|
||||||
|
udeb=application/x-debian-package
|
||||||
|
ufd=application/vnd.ufdl
|
||||||
|
ufdl=application/vnd.ufdl
|
||||||
|
ulw=audio/basic
|
||||||
|
ulx=application/x-glulx
|
||||||
|
umj=application/vnd.umajin
|
||||||
|
unityweb=application/vnd.unity
|
||||||
|
uoml=application/vnd.uoml+xml
|
||||||
|
uri=text/uri-list
|
||||||
|
uris=text/uri-list
|
||||||
|
urls=text/uri-list
|
||||||
|
ustar=application/x-ustar
|
||||||
|
utz=application/vnd.uiq.theme
|
||||||
|
uu=text/x-uuencode
|
||||||
|
uva=audio/vnd.dece.audio
|
||||||
|
uvd=application/vnd.dece.data
|
||||||
|
uvf=application/vnd.dece.data
|
||||||
|
uvg=image/vnd.dece.graphic
|
||||||
|
uvh=video/vnd.dece.hd
|
||||||
|
uvi=image/vnd.dece.graphic
|
||||||
|
uvm=video/vnd.dece.mobile
|
||||||
|
uvp=video/vnd.dece.pd
|
||||||
|
uvs=video/vnd.dece.sd
|
||||||
|
uvt=application/vnd.dece.ttml+xml
|
||||||
|
uvu=video/vnd.uvvu.mp4
|
||||||
|
uvv=video/vnd.dece.video
|
||||||
|
uvva=audio/vnd.dece.audio
|
||||||
|
uvvd=application/vnd.dece.data
|
||||||
|
uvvf=application/vnd.dece.data
|
||||||
|
uvvg=image/vnd.dece.graphic
|
||||||
|
uvvh=video/vnd.dece.hd
|
||||||
|
uvvi=image/vnd.dece.graphic
|
||||||
|
uvvm=video/vnd.dece.mobile
|
||||||
|
uvvp=video/vnd.dece.pd
|
||||||
|
uvvs=video/vnd.dece.sd
|
||||||
|
uvvt=application/vnd.dece.ttml+xml
|
||||||
|
uvvu=video/vnd.uvvu.mp4
|
||||||
|
uvvv=video/vnd.dece.video
|
||||||
|
uvvx=application/vnd.dece.unspecified
|
||||||
|
uvvz=application/vnd.dece.zip
|
||||||
|
uvx=application/vnd.dece.unspecified
|
||||||
|
uvz=application/vnd.dece.zip
|
||||||
|
vcard=text/vcard
|
||||||
|
vcd=application/x-cdlink
|
||||||
|
vcf=text/x-vcard
|
||||||
|
vcg=application/vnd.groove-vcard
|
||||||
|
vcs=text/x-vcalendar
|
||||||
|
vcx=application/vnd.vcx
|
||||||
|
vis=application/vnd.visionary
|
||||||
|
viv=video/vnd.vivo
|
||||||
|
vob=video/x-ms-vob
|
||||||
|
vor=application/vnd.stardivision.writer
|
||||||
|
vox=application/x-authorware-bin
|
||||||
|
vrml=model/vrml
|
||||||
|
vsd=application/vnd.visio
|
||||||
|
vsf=application/vnd.vsf
|
||||||
|
vss=application/vnd.visio
|
||||||
|
vst=application/vnd.visio
|
||||||
|
vsw=application/vnd.visio
|
||||||
|
vtu=model/vnd.vtu
|
||||||
|
vxml=application/voicexml+xml
|
||||||
|
w3d=application/x-director
|
||||||
|
wad=application/x-doom
|
||||||
|
wasm=application/wasm
|
||||||
|
wav=audio/x-wav
|
||||||
|
wax=audio/x-ms-wax
|
||||||
|
wbmp=image/vnd.wap.wbmp
|
||||||
|
wbs=application/vnd.criticaltools.wbs+xml
|
||||||
|
wbxml=application/vnd.wap.wbxml
|
||||||
|
wcm=application/vnd.ms-works
|
||||||
|
wdb=application/vnd.ms-works
|
||||||
|
wdp=image/vnd.ms-photo
|
||||||
|
weba=audio/webm
|
||||||
|
webm=video/webm
|
||||||
|
webp=image/webp
|
||||||
|
wg=application/vnd.pmi.widget
|
||||||
|
wgt=application/widget
|
||||||
|
wks=application/vnd.ms-works
|
||||||
|
wm=video/x-ms-wm
|
||||||
|
wma=audio/x-ms-wma
|
||||||
|
wmd=application/x-ms-wmd
|
||||||
|
wmf=application/x-msmetafile
|
||||||
|
wml=text/vnd.wap.wml
|
||||||
|
wmlc=application/vnd.wap.wmlc
|
||||||
|
wmls=text/vnd.wap.wmlscript
|
||||||
|
wmlsc=application/vnd.wap.wmlscriptc
|
||||||
|
wmv=video/x-ms-wmv
|
||||||
|
wmx=video/x-ms-wmx
|
||||||
|
wmz=application/x-msmetafile
|
||||||
|
woff=font/woff
|
||||||
|
woff2=font/woff2
|
||||||
|
wpd=application/vnd.wordperfect
|
||||||
|
wpl=application/vnd.ms-wpl
|
||||||
|
wps=application/vnd.ms-works
|
||||||
|
wqd=application/vnd.wqd
|
||||||
|
wri=application/x-mswrite
|
||||||
|
wrl=model/vrml
|
||||||
|
wsdl=application/wsdl+xml
|
||||||
|
wspolicy=application/wspolicy+xml
|
||||||
|
wtb=application/vnd.webturbo
|
||||||
|
wvx=video/x-ms-wvx
|
||||||
|
x32=application/x-authorware-bin
|
||||||
|
x3d=model/x3d+xml
|
||||||
|
x3db=model/x3d+binary
|
||||||
|
x3dbz=model/x3d+binary
|
||||||
|
x3dv=model/x3d+vrml
|
||||||
|
x3dvz=model/x3d+vrml
|
||||||
|
x3dz=model/x3d+xml
|
||||||
|
xaml=application/xaml+xml
|
||||||
|
xap=application/x-silverlight-app
|
||||||
|
xar=application/vnd.xara
|
||||||
|
xbap=application/x-ms-xbap
|
||||||
|
xbd=application/vnd.fujixerox.docuworks.binder
|
||||||
|
xbm=image/x-xbitmap
|
||||||
|
xdf=application/xcap-diff+xml
|
||||||
|
xdm=application/vnd.syncml.dm+xml
|
||||||
|
xdp=application/vnd.adobe.xdp+xml
|
||||||
|
xdssc=application/dssc+xml
|
||||||
|
xdw=application/vnd.fujixerox.docuworks
|
||||||
|
xenc=application/xenc+xml
|
||||||
|
xer=application/patch-ops-error+xml
|
||||||
|
xfdf=application/vnd.adobe.xfdf
|
||||||
|
xfdl=application/vnd.xfdl
|
||||||
|
xht=application/xhtml+xml
|
||||||
|
xhtml=application/xhtml+xml
|
||||||
|
xhvml=application/xv+xml
|
||||||
|
xif=image/vnd.xiff
|
||||||
|
xla=application/vnd.ms-excel
|
||||||
|
xlam=application/vnd.ms-excel.addin.macroenabled.12
|
||||||
|
xlc=application/vnd.ms-excel
|
||||||
|
xlf=application/x-xliff+xml
|
||||||
|
xlm=application/vnd.ms-excel
|
||||||
|
xls=application/vnd.ms-excel
|
||||||
|
xlsb=application/vnd.ms-excel.sheet.binary.macroenabled.12
|
||||||
|
xlsm=application/vnd.ms-excel.sheet.macroenabled.12
|
||||||
|
xlsx=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
|
||||||
|
xlt=application/vnd.ms-excel
|
||||||
|
xltm=application/vnd.ms-excel.template.macroenabled.12
|
||||||
|
xltx=application/vnd.openxmlformats-officedocument.spreadsheetml.template
|
||||||
|
xlw=application/vnd.ms-excel
|
||||||
|
xm=audio/xm
|
||||||
|
xml=application/xml
|
||||||
|
xo=application/vnd.olpc-sugar
|
||||||
|
xop=application/xop+xml
|
||||||
|
xpi=application/x-xpinstall
|
||||||
|
xpl=application/xproc+xml
|
||||||
|
xpm=image/x-xpixmap
|
||||||
|
xpr=application/vnd.is-xpr
|
||||||
|
xps=application/vnd.ms-xpsdocument
|
||||||
|
xpw=application/vnd.intercon.formnet
|
||||||
|
xpx=application/vnd.intercon.formnet
|
||||||
|
xsl=application/xml
|
||||||
|
xslt=application/xslt+xml
|
||||||
|
xsm=application/vnd.syncml+xml
|
||||||
|
xspf=application/xspf+xml
|
||||||
|
xul=application/vnd.mozilla.xul+xml
|
||||||
|
xvm=application/xv+xml
|
||||||
|
xvml=application/xv+xml
|
||||||
|
xwd=image/x-xwindowdump
|
||||||
|
xyz=chemical/x-xyz
|
||||||
|
xz=application/x-xz
|
||||||
|
yang=application/yang
|
||||||
|
yin=application/yin+xml
|
||||||
|
z=application/x-compress
|
||||||
|
z1=application/x-zmachine
|
||||||
|
z2=application/x-zmachine
|
||||||
|
z3=application/x-zmachine
|
||||||
|
z4=application/x-zmachine
|
||||||
|
z5=application/x-zmachine
|
||||||
|
z6=application/x-zmachine
|
||||||
|
z7=application/x-zmachine
|
||||||
|
z8=application/x-zmachine
|
||||||
|
zaz=application/vnd.zzazz.deck+xml
|
||||||
|
zip=application/zip
|
||||||
|
zir=application/vnd.zul
|
||||||
|
zirz=application/vnd.zul
|
||||||
|
zmm=application/vnd.handheld-entertainment+xml
|
@ -24,6 +24,13 @@ import java.util.regex.Pattern;
|
|||||||
|
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import org.springframework.aot.hint.RuntimeHints;
|
||||||
|
import org.springframework.aot.hint.predicate.RuntimeHintsPredicates;
|
||||||
|
import org.springframework.boot.web.server.MimeMappings.DefaultMimeMappings;
|
||||||
|
import org.springframework.boot.web.server.MimeMappings.Mapping;
|
||||||
|
import org.springframework.boot.web.server.MimeMappings.MimeMappingsRuntimeHints;
|
||||||
|
import org.springframework.test.util.ReflectionTestUtils;
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
|
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
|
||||||
|
|
||||||
@ -31,6 +38,7 @@ import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
|
|||||||
* Tests for {@link MimeMappings}.
|
* Tests for {@link MimeMappings}.
|
||||||
*
|
*
|
||||||
* @author Phillip Webb
|
* @author Phillip Webb
|
||||||
|
* @author Guirong Hu
|
||||||
*/
|
*/
|
||||||
class MimeMappingsTests {
|
class MimeMappingsTests {
|
||||||
|
|
||||||
@ -143,4 +151,69 @@ class MimeMappingsTests {
|
|||||||
assertThat(MimeMappings.DEFAULT).allSatisfy((mapping) -> assertThat(mapping.getMimeType()).matches(pattern));
|
assertThat(MimeMappings.DEFAULT).allSatisfy((mapping) -> assertThat(mapping.getMimeType()).matches(pattern));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void getCommonTypeOnDefaultMimeMappingsDoesNotLoadMappings() {
|
||||||
|
DefaultMimeMappings mappings = new DefaultMimeMappings();
|
||||||
|
assertThat(mappings.get("json")).isEqualTo("application/json");
|
||||||
|
assertThat((Object) mappings).extracting("loaded").isNull();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void getExoticTypeOnDefaultMimeMappingsLoadsMappings() {
|
||||||
|
DefaultMimeMappings mappings = new DefaultMimeMappings();
|
||||||
|
assertThat(mappings.get("123")).isEqualTo("application/vnd.lotus-1-2-3");
|
||||||
|
assertThat((Object) mappings).extracting("loaded").isNotNull();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void iterateOnDefaultMimeMappingsLoadsMappings() {
|
||||||
|
DefaultMimeMappings mappings = new DefaultMimeMappings();
|
||||||
|
assertThat(mappings).isNotEmpty();
|
||||||
|
assertThat((Object) mappings).extracting("loaded").isNotNull();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void commonMappingsAreSubsetOfAllMappings() {
|
||||||
|
MimeMappings commonMappings = (MimeMappings) ReflectionTestUtils.getField(DefaultMimeMappings.class, "COMMON");
|
||||||
|
for (Mapping commonMapping : commonMappings) {
|
||||||
|
assertThat(MimeMappings.DEFAULT.get(commonMapping.getExtension())).isEqualTo(commonMapping.getMimeType());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void lazyCopyWhenNotMutatedDelegates() {
|
||||||
|
DefaultMimeMappings mappings = new DefaultMimeMappings();
|
||||||
|
MimeMappings lazyCopy = MimeMappings.lazyCopy(mappings);
|
||||||
|
assertThat(lazyCopy.get("json")).isEqualTo("application/json");
|
||||||
|
assertThat((Object) mappings).extracting("loaded").isNull();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void lazyCopyWhenMutatedCreatesCopy() {
|
||||||
|
DefaultMimeMappings mappings = new DefaultMimeMappings();
|
||||||
|
MimeMappings lazyCopy = MimeMappings.lazyCopy(mappings);
|
||||||
|
lazyCopy.add("json", "other/json");
|
||||||
|
assertThat(lazyCopy.get("json")).isEqualTo("other/json");
|
||||||
|
assertThat((Object) mappings).extracting("loaded").isNotNull();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void lazyCopyWhenMutatedCreatesCopyOnlyOnce() {
|
||||||
|
MimeMappings mappings = new MimeMappings();
|
||||||
|
mappings.add("json", "one/json");
|
||||||
|
MimeMappings lazyCopy = MimeMappings.lazyCopy(mappings);
|
||||||
|
assertThat(lazyCopy.get("json")).isEqualTo("one/json");
|
||||||
|
mappings.add("json", "two/json");
|
||||||
|
lazyCopy.add("json", "other/json");
|
||||||
|
assertThat(lazyCopy.get("json")).isEqualTo("other/json");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void shouldRegisterHints() {
|
||||||
|
RuntimeHints runtimeHints = new RuntimeHints();
|
||||||
|
new MimeMappingsRuntimeHints().registerHints(runtimeHints, getClass().getClassLoader());
|
||||||
|
assertThat(RuntimeHintsPredicates.resource()
|
||||||
|
.forResource("org/springframework/boot/web/server/mime-mappings.properties")).accepts(runtimeHints);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -45,6 +45,7 @@ import java.util.List;
|
|||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
import java.util.Properties;
|
||||||
import java.util.concurrent.ArrayBlockingQueue;
|
import java.util.concurrent.ArrayBlockingQueue;
|
||||||
import java.util.concurrent.BlockingQueue;
|
import java.util.concurrent.BlockingQueue;
|
||||||
import java.util.concurrent.Callable;
|
import java.util.concurrent.Callable;
|
||||||
@ -77,6 +78,7 @@ import jakarta.servlet.http.HttpServlet;
|
|||||||
import jakarta.servlet.http.HttpServletRequest;
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
import jakarta.servlet.http.HttpServletResponse;
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
import jakarta.servlet.http.HttpSession;
|
import jakarta.servlet.http.HttpSession;
|
||||||
|
import org.apache.catalina.startup.Tomcat;
|
||||||
import org.apache.catalina.webresources.TomcatURLStreamHandlerFactory;
|
import org.apache.catalina.webresources.TomcatURLStreamHandlerFactory;
|
||||||
import org.apache.http.HttpResponse;
|
import org.apache.http.HttpResponse;
|
||||||
import org.apache.http.client.HttpClient;
|
import org.apache.http.client.HttpClient;
|
||||||
@ -134,6 +136,7 @@ import org.springframework.boot.web.servlet.server.Session.SessionTrackingMode;
|
|||||||
import org.springframework.core.io.ClassPathResource;
|
import org.springframework.core.io.ClassPathResource;
|
||||||
import org.springframework.core.io.FileSystemResource;
|
import org.springframework.core.io.FileSystemResource;
|
||||||
import org.springframework.core.io.Resource;
|
import org.springframework.core.io.Resource;
|
||||||
|
import org.springframework.core.io.support.PropertiesLoaderUtils;
|
||||||
import org.springframework.http.HttpMethod;
|
import org.springframework.http.HttpMethod;
|
||||||
import org.springframework.http.HttpStatus;
|
import org.springframework.http.HttpStatus;
|
||||||
import org.springframework.http.client.ClientHttpRequest;
|
import org.springframework.http.client.ClientHttpRequest;
|
||||||
@ -958,6 +961,20 @@ public abstract class AbstractServletWebServerFactoryTests {
|
|||||||
assertThat(configuredMimeMappings.size()).isEqualTo(expectedMimeMappings.size());
|
assertThat(configuredMimeMappings.size()).isEqualTo(expectedMimeMappings.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void mimeMappingsContainsDefaultsOfTomcat() throws IOException {
|
||||||
|
AbstractServletWebServerFactory factory = getFactory();
|
||||||
|
this.webServer = factory.getWebServer();
|
||||||
|
Map<String, String> configuredMimeMappings = getActualMimeMappings();
|
||||||
|
// override defaults, see org.apache.catalina.startup.MimeTypeMappings.properties
|
||||||
|
Properties tomcatDefaultMimeMappings = PropertiesLoaderUtils
|
||||||
|
.loadProperties(new ClassPathResource("MimeTypeMappings.properties", Tomcat.class));
|
||||||
|
for (String extension : tomcatDefaultMimeMappings.stringPropertyNames()) {
|
||||||
|
assertThat(configuredMimeMappings).containsEntry(extension,
|
||||||
|
tomcatDefaultMimeMappings.getProperty(extension));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void rootServletContextResource() {
|
void rootServletContextResource() {
|
||||||
AbstractServletWebServerFactory factory = getFactory();
|
AbstractServletWebServerFactory factory = getFactory();
|
||||||
|
Loading…
Reference in New Issue
Block a user