// Copyright � 2002-2007 Canoo Engineering AG, Switzerland. package com.canoo.webtest.engine; import java.util.HashMap; import java.util.Map; /** * Contains mapping between mime types and preferred extension. * This is used when saving received content to determine file extension from the received mime type. * @author Marc Guillemot * @author Paul King */ public class MimeMap { // Defaults - all of them are "well-known" types, private static final Map<String, String> DEFAULT_MAP = new HashMap<String, String>(101); public static final String EXCEL_MIME_TYPE = "application/vnd.ms-excel"; public static final String UNKNOWN_BINARY_MIME_TYPE = "application/octet-stream"; static { DEFAULT_MAP.put("application/java", "class"); DEFAULT_MAP.put("application/mac-binhex40", "hqx"); DEFAULT_MAP.put("application/octet-stream", "bin"); DEFAULT_MAP.put("application/oda", "oda"); DEFAULT_MAP.put("application/pdf", "pdf"); DEFAULT_MAP.put("application/vnd.ms-excel", "xls"); DEFAULT_MAP.put("application/excel", "xls"); DEFAULT_MAP.put("application/vnd.openxmlformats-officedocument.wordprocessingml.document", "docx"); DEFAULT_MAP.put("application/vnd.oasis.opendocument.text", "odt"); DEFAULT_MAP.put("application/vnd.oasis.opendocument.spreadsheet", "ods"); DEFAULT_MAP.put("application/vnd.google-earth.kml+xml", "kml"); DEFAULT_MAP.put("application/postscript", "ps"); DEFAULT_MAP.put("application/rtf", "rtf"); DEFAULT_MAP.put("application/xhtml+xml", "html"); DEFAULT_MAP.put("application/xml", "xml"); DEFAULT_MAP.put("application/x-bcpio", "bcpio"); DEFAULT_MAP.put("application/x-compress", "Z"); DEFAULT_MAP.put("application/x-cpio", "cpio"); DEFAULT_MAP.put("application/x-csh", "csh"); DEFAULT_MAP.put("application/x-dvi", "dvi"); DEFAULT_MAP.put("application/x-gtar", "gtar"); DEFAULT_MAP.put("application/x-gzip", "gz"); DEFAULT_MAP.put("application/x-hdf", "hdf"); DEFAULT_MAP.put("application/x-javascript", "js"); DEFAULT_MAP.put("application/x-latex", "latex"); DEFAULT_MAP.put("application/x-mif", "mif"); DEFAULT_MAP.put("application/x-netcdf", "cdf"); DEFAULT_MAP.put("application/x-postscript", "ps"); DEFAULT_MAP.put("application/x-sh", "sh"); DEFAULT_MAP.put("application/x-shar", "shar"); DEFAULT_MAP.put("application/x-shockwave-flash", "swf"); DEFAULT_MAP.put("application/x-sv4cpio", "sv4cpio"); DEFAULT_MAP.put("application/x-sv4crc", "sv4crc"); DEFAULT_MAP.put("application/x-tar", "tar"); DEFAULT_MAP.put("application/x-tcl", "tcl"); DEFAULT_MAP.put("application/x-tex", "tex"); DEFAULT_MAP.put("application/x-texinfo", "texinfo"); DEFAULT_MAP.put("application/x-troff", "t"); DEFAULT_MAP.put("application/x-troff-man", "man"); DEFAULT_MAP.put("application/x-troff-me", "me"); DEFAULT_MAP.put("application/x-ustar", "ustar"); DEFAULT_MAP.put("application/x-wais-source", "ms"); DEFAULT_MAP.put("application/x-x509-ca-cert", "cer"); DEFAULT_MAP.put("application/zip", "zip"); DEFAULT_MAP.put("audio/basic", "au"); DEFAULT_MAP.put("audio/x-aiff", "aif"); DEFAULT_MAP.put("audio/x-aiff", "aifc"); DEFAULT_MAP.put("audio/x-aiff", "aiff"); DEFAULT_MAP.put("audio/x-wav", "wav"); DEFAULT_MAP.put("text/html", "html"); DEFAULT_MAP.put("text/xhtml", "html"); DEFAULT_MAP.put("text/xml", "xml"); DEFAULT_MAP.put("text/javascript", "js"); DEFAULT_MAP.put("image/gif", "gif"); DEFAULT_MAP.put("image/ief", "ief"); DEFAULT_MAP.put("image/jpeg", "jpg"); DEFAULT_MAP.put("image/tiff", "tif"); DEFAULT_MAP.put("image/x-cmu-raster", "ras"); DEFAULT_MAP.put("image/x-portable-anymap", "pnm"); DEFAULT_MAP.put("image/x-portable-bitmap", "pbm"); DEFAULT_MAP.put("image/x-portable-graymap", "pgm"); DEFAULT_MAP.put("image/x-portable-pixmap", "ppm"); DEFAULT_MAP.put("image/x-rgb", "rgb"); DEFAULT_MAP.put("image/x-xbitmap", "xbm"); DEFAULT_MAP.put("image/x-xpixmap", "xpm"); DEFAULT_MAP.put("image/x-xwindowdump", "xwd"); DEFAULT_MAP.put("text/css", "css"); // text/plain not needed (see default for text below) DEFAULT_MAP.put("text/richtext", "rtx"); DEFAULT_MAP.put("text/tab-separated-values", "tsv"); DEFAULT_MAP.put("text/x-java", "java"); DEFAULT_MAP.put("text/x-setext", "etx"); DEFAULT_MAP.put("video/mpeg", "mpeg"); DEFAULT_MAP.put("video/mpeg2", "mpv2"); DEFAULT_MAP.put("video/quicktime", "mov"); DEFAULT_MAP.put("video/x-msvideo", "avi"); DEFAULT_MAP.put("video/x-rad-screenplay", "avx"); DEFAULT_MAP.put("video/x-sgi-movie", "movie"); DEFAULT_MAP.put("x-world/x-vrml", "wrl"); } // Mime Types should roughly be consistent with HtmlUnit public static String getExtension(final String contentType) { if (DEFAULT_MAP.containsKey(contentType)) { return (String) DEFAULT_MAP.get(contentType); } if (contentType.matches("application/.*xhtml\\+xml")) { return "html"; } if (contentType.matches("application/.*\\+xml")) { return "xml"; } if (contentType.startsWith("text/")) { return "txt"; } return "unknown"; } /** * HtmlUnit doesn't guess contentType of Excel files from the file system. * Should probably be moved to htmlunit. */ public static String adjustMimeTypeIfNeeded(final String contentType, final String responseFileName) { if (UNKNOWN_BINARY_MIME_TYPE.equals(contentType)) { if (responseFileName != null && responseFileName.endsWith(".xls")) { return EXCEL_MIME_TYPE; } } return contentType; } }