Permalink
Browse files

API CHANGE: Do not rely on a specific OS mime type detection, use PHP…

… finfo

This also removes the $global_mimetypes that was generating weird errors when both HTTP and Mailer classes tried to modify and use it.

Support of finfo should be straightforward since PHP 5.3 includes that module that default
  • Loading branch information...
1 parent 7f4c6e3 commit dffae1a2e7a4fa1f2430b2b187832e103bcb6908 @stojg stojg committed May 10, 2012
View
52 control/HTTP.php
@@ -181,47 +181,25 @@ static function getImagesIn($content) {
return self::findByTagAndAttribute($content, array("img" => "src"));
}
- /*
+ /**
* Get mime type based on extension
+ *
+ * @uses finfo
+ * @deprecated Use HTTP::get_mime_type() instead
*/
- static function getMimeType($filename) {
- global $global_mimetypes;
- if(!$global_mimetypes) self::loadMimeTypes();
- $ext = strtolower(substr($filename,strrpos($filename,'.')+1));
- if(isset($global_mimetypes[$ext])) return $global_mimetypes[$ext];
+ public static function getMimeType($filename) {
+ Deprecation::notice('3.0', 'Use HTTP::get_mime_type() instead.');
+ self::get_mime_type($filename);
}
-
- /*
- * Load the mime-type data from the system file
+
+ /**
+ * Get mime type based on extension
+ *
+ * @uses finfo
*/
- static function loadMimeTypes() {
- if(@file_exists('/etc/mime.types')) {
- $mimeTypes = file('/etc/mime.types');
- foreach($mimeTypes as $typeSpec) {
- if(($typeSpec = trim($typeSpec)) && substr($typeSpec,0,1) != "#") {
- $parts = preg_split("/[ \t\r\n]+/", $typeSpec);
- if(sizeof($parts) > 1) {
- $mimeType = array_shift($parts);
- foreach($parts as $ext) {
- $ext = strtolower($ext);
- $mimeData[$ext] = $mimeType;
- }
- }
- }
- }
-
- // Fail-over for if people don't have /etc/mime.types on their server. it's unclear how important this actually is
- } else {
- $mimeData = array(
- "doc" => "application/msword",
- "xls" => "application/vnd.ms-excel",
- "rtf" => "application/rtf",
- );
- }
-
- global $global_mimetypes;
- $global_mimetypes = $mimeData;
- return $mimeData;
+ public static function get_mime_type($filename) {
+ $finfo = new finfo(FILEINFO_MIME_TYPE);
+ return $finfo->file(BASE_PATH.DIRECTORY_SEPARATOR.$filename);
}
/**
View
5 control/HTTPRequest.php
@@ -284,8 +284,9 @@ function offsetUnset($offset) {}
* Construct an SS_HTTPResponse that will deliver a file to the client
*/
static function send_file($fileData, $fileName, $mimeType = null) {
- if(!$mimeType) $mimeType = HTTP::getMimeType($fileName);
-
+ if(!$mimeType) {
+ $mimeType = HTTP::get_mime_type($fileName);
+ }
$response = new SS_HTTPResponse($fileData);
$response->addHeader("Content-Type", "$mimeType; name=\"" . addslashes($fileName) . "\"");
$response->addHeader("Content-disposition", "attachment; filename=" . addslashes($fileName));
View
40 email/Mailer.php
@@ -377,9 +377,8 @@ function encodeFileForEmail($file, $destFileName = false, $disposition = NULL, $
if(!$destFileName) $base = basename($file['filename']);
else $base = $destFileName;
- $mimeType = $file['mimetype'] ? $file['mimetype'] : getMimeType($file['filename']);
+ $mimeType = $file['mimetype'] ? $file['mimetype'] : HTTP::get_mime_type($file['filename']);
if(!$mimeType) $mimeType = "application/unknown";
-
if (empty($disposition)) $disposition = isset($file['contentLocation']) ? 'inline' : 'attachment';
// Encode for emailing
@@ -430,39 +429,4 @@ function validEmailAddr($emailAddress) {
}
return $emailAddress;
-}
-
-/*
- * Get mime type based on extension
- */
-function getMimeType($filename) {
- global $global_mimetypes;
- if(!$global_mimetypes) loadMimeTypes();
- $ext = strtolower(substr($filename,strrpos($filename,'.')+1));
- return $global_mimetypes[$ext];
-}
-
-/*
- * Load the mime-type data from the system file
- */
-function loadMimeTypes() {
- $mimetypePathCustom = '/etc/mime.types';
- $mimetypePathGeneric = FRAMEWORK_PATH . '/email/mime.types';
- $mimeTypes = file_exists($mimetypePathGeneric) ? file($mimetypePathGeneric) : file($mimetypePathCustom);
- foreach($mimeTypes as $typeSpec) {
- if(($typeSpec = trim($typeSpec)) && substr($typeSpec,0,1) != "#") {
- $parts = preg_split("/[ \t\r\n]+/", $typeSpec);
- if(sizeof($parts) > 1) {
- $mimeType = array_shift($parts);
- foreach($parts as $ext) {
- $ext = strtolower($ext);
- $mimeData[$ext] = $mimeType;
- }
- }
- }
- }
-
- global $global_mimetypes;
- $global_mimetypes = $mimeData;
- return $mimeData;
-}
+}
View
314 email/mime.types
@@ -1,314 +0,0 @@
-application/andrew-inset ez
-application/cu-seeme cu
-application/dsptype tsp
-application/futuresplash spl
-application/hta hta
-application/java-archive jar
-application/java-serialized-object ser
-application/java-vm class
-application/mac-binhex40 hqx
-application/mac-compactpro cpt
-application/mathematica nb
-application/msaccess mdb
-application/msword doc dot docx docm dotx dotm
-application/octet-stream bin
-application/oda oda
-application/ogg ogg
-application/pdf pdf
-application/pgp-keys key
-application/pgp-signature pgp
-application/pics-rules prf
-application/postscript ps ai eps
-application/rar rar
-application/rdf+xml rdf
-application/rss+xml rss
-application/smil smi smil
-application/wordperfect wpd
-application/wordperfect5.1 wp5
-application/xhtml+xml xhtml xht
-application/xml xml xsl
-application/zip zip
-application/vnd.mozilla.xul+xml xul
-application/vnd.ms-excel xls xlb xlt xlsx xlsm xltx xltm xlsb xlam
-application/vnd.ms-pki.seccat cat
-application/vnd.ms-pki.stl stl
-application/vnd.ms-powerpoint ppt pps pptx pptm potx potm ppam ppsx ppsm sldx sldm thmx
-application/vnd.oasis.opendocument.chart odc
-application/vnd.oasis.opendocument.database odb
-application/vnd.oasis.opendocument.formula odf
-application/vnd.oasis.opendocument.graphics odg
-application/vnd.oasis.opendocument.graphics-template otg
-application/vnd.oasis.opendocument.image odi
-application/vnd.oasis.opendocument.presentation odp
-application/vnd.oasis.opendocument.presentation-template otp
-application/vnd.oasis.opendocument.spreadsheet ods
-application/vnd.oasis.opendocument.spreadsheet-template ots
-application/vnd.oasis.opendocument.text odt
-application/vnd.oasis.opendocument.text-master odm
-application/vnd.oasis.opendocument.text-template ott
-application/vnd.oasis.opendocument.text-web oth
-application/vnd.rim.cod cod
-application/vnd.smaf mmf
-application/vnd.stardivision.calc sdc
-application/vnd.stardivision.draw sda
-application/vnd.stardivision.impress sdd sdp
-application/vnd.stardivision.math smf
-application/vnd.stardivision.writer sdw vor
-application/vnd.stardivision.writer-global sgl
-application/vnd.sun.xml.calc sxc
-application/vnd.sun.xml.calc.template stc
-application/vnd.sun.xml.draw sxd
-application/vnd.sun.xml.draw.template std
-application/vnd.sun.xml.impress sxi
-application/vnd.sun.xml.impress.template sti
-application/vnd.sun.xml.math sxm
-application/vnd.sun.xml.writer sxw
-application/vnd.sun.xml.writer.global sxg
-application/vnd.sun.xml.writer.template stw
-application/vnd.symbian.install sis
-application/vnd.visio vsd
-application/vnd.wap.wbxml wbxml
-application/vnd.wap.wmlc wmlc
-application/vnd.wap.wmlscriptc wmlsc
-application/x-123 wk
-application/x-abiword abw
-application/x-apple-diskimage dmg
-application/x-bcpio bcpio
-application/x-bittorrent torrent
-application/x-cdf cdf
-application/x-cdlink vcd
-application/x-chess-pgn pgn
-application/x-core
-application/x-cpio cpio
-application/x-csh csh
-application/x-debian-package deb udeb
-application/x-director dcr dir dxr
-application/x-dms dms
-application/x-doom wad
-application/x-dvi dvi
-application/x-flac flac
-application/x-font pfa pfb gsf pcf pcf.Z
-application/x-freemind mm
-application/x-futuresplash spl
-application/x-gnumeric gnumeric
-application/x-go-sgf sgf
-application/x-graphing-calculator gcf
-application/x-gtar gtar tgz taz
-application/x-hdf hdf
-application/x-ica ica
-application/x-internet-signup ins isp
-application/x-iphone iii
-application/x-iso9660-image iso
-application/x-java-jnlp-file jnlp
-application/x-javascript js
-application/x-jmol jmz
-application/x-kchart chrt
-application/x-killustrator kil
-application/x-koan skp skd skt skm
-application/x-kpresenter kpr kpt
-application/x-kspread ksp
-application/x-kword kwd kwt
-application/x-latex latex
-application/x-lha lha
-application/x-lzh lzh
-application/x-lzx lzx
-application/x-maker frm maker frame fm fb book fbdoc
-application/x-mif mif
-application/x-ms-wmd wmd
-application/x-ms-wmz wmz
-application/x-msdos-program com exe bat dll
-application/x-msi msi
-application/x-netcdf nc
-application/x-ns-proxy-autoconfig pac
-application/x-nwc nwc
-application/x-object o
-application/x-oz-application oza
-application/x-pkcs7-certreqresp p7r
-application/x-pkcs7-crl crl
-application/x-python-code pyc pyo
-application/x-quicktimeplayer qtl
-application/x-redhat-package-manager rpm
-application/x-sh sh
-application/x-shar shar
-application/x-shellscript
-application/x-shockwave-flash swf swfl
-application/x-stuffit sit
-application/x-sv4cpio sv4cpio
-application/x-sv4crc sv4crc
-application/x-tar tar
-application/x-tcl tcl
-application/x-tex-gf gf
-application/x-tex-pk pk
-application/x-texinfo texinfo texi
-application/x-trash ~ % bak old sik
-application/x-troff t tr roff
-application/x-troff-man man
-application/x-troff-me me
-application/x-troff-ms ms
-application/x-ustar ustar
-application/x-wais-source src
-application/x-wingz wz
-application/x-x509-ca-cert crt
-application/x-xcf xcf
-application/x-xfig fig
-application/x-xpinstall xpi
-audio/basic au snd
-audio/midi mid midi kar
-audio/mpeg mpga mpega mp2 mp3 m4a
-audio/mpegurl m3u
-audio/prs.sid sid
-audio/x-aiff aif aiff aifc
-audio/x-gsm gsm
-audio/x-mpegurl m3u
-audio/x-ms-wma wma
-audio/x-ms-wax wax
-audio/x-pn-realaudio-plugin
-audio/x-pn-realaudio ra rm ram
-audio/x-realaudio ra
-audio/x-scpls pls
-audio/x-sd2 sd2
-audio/x-wav wav
-chemical/x-alchemy alc
-chemical/x-cache cac cache
-chemical/x-cache-csf csf
-chemical/x-cactvs-binary cbin cascii ctab
-chemical/x-cdx cdx
-chemical/x-cerius cer
-chemical/x-chem3d c3d
-chemical/x-chemdraw chm
-chemical/x-cif cif
-chemical/x-cmdf cmdf
-chemical/x-cml cml
-chemical/x-compass cpa
-chemical/x-crossfire bsd
-chemical/x-csml csml csm
-chemical/x-ctx ctx
-chemical/x-cxf cxf cef
-#chemical/x-daylight-smiles smi
-chemical/x-embl-dl-nucleotide emb embl
-chemical/x-galactic-spc spc
-chemical/x-gamess-input inp gam gamin
-chemical/x-gaussian-checkpoint fch fchk
-chemical/x-gaussian-cube cub
-chemical/x-gaussian-input gau gjc gjf
-chemical/x-gaussian-log gal
-chemical/x-gcg8-sequence gcg
-chemical/x-genbank gen
-chemical/x-hin hin
-chemical/x-isostar istr ist
-chemical/x-jcamp-dx jdx dx
-chemical/x-kinemage kin
-chemical/x-macmolecule mcm
-chemical/x-macromodel-input mmd mmod
-chemical/x-mdl-molfile mol
-chemical/x-mdl-rdfile rd
-chemical/x-mdl-rxnfile rxn
-chemical/x-mdl-sdfile sd sdf
-chemical/x-mdl-tgf tgf
-#chemical/x-mif mif
-chemical/x-mmcif mcif
-chemical/x-mol2 mol2
-chemical/x-molconn-Z b
-chemical/x-mopac-graph gpt
-chemical/x-mopac-input mop mopcrt mpc dat zmt
-chemical/x-mopac-out moo
-chemical/x-mopac-vib mvb
-chemical/x-ncbi-asn1 asn
-chemical/x-ncbi-asn1-ascii prt ent
-chemical/x-ncbi-asn1-binary val aso
-chemical/x-ncbi-asn1-spec asn
-chemical/x-pdb pdb ent
-chemical/x-rosdal ros
-chemical/x-swissprot sw
-chemical/x-vamas-iso14976 vms
-chemical/x-vmd vmd
-chemical/x-xtel xtel
-chemical/x-xyz xyz
-image/gif gif
-image/ief ief
-image/jpeg jpeg jpg jpe
-image/pcx pcx
-image/png png
-image/svg+xml svg svgz
-image/tiff tiff tif
-image/vnd.djvu djvu djv
-image/vnd.wap.wbmp wbmp
-image/x-cmu-raster ras
-image/x-coreldraw cdr
-image/x-coreldrawpattern pat
-image/x-coreldrawtemplate cdt
-image/x-corelphotopaint cpt
-image/x-icon ico
-image/x-jg art
-image/x-jng jng
-image/x-ms-bmp bmp
-image/x-photoshop psd
-image/x-portable-anymap pnm
-image/x-portable-bitmap pbm
-image/x-portable-graymap pgm
-image/x-portable-pixmap ppm
-image/x-rgb rgb
-image/x-xbitmap xbm
-image/x-xpixmap xpm
-image/x-xwindowdump xwd
-model/iges igs iges
-model/mesh msh mesh silo
-model/vrml wrl vrml
-text/calendar ics icz
-text/comma-separated-values csv
-text/css css
-text/h323 323
-text/html html htm shtml
-text/iuls uls
-text/mathml mml
-text/plain asc txt text diff pot
-text/x-psp psp
-text/richtext rtx
-text/rtf rtf
-text/scriptlet sct wsc
-text/texmacs tm ts
-text/tab-separated-values tsv
-text/vnd.sun.j2me.app-descriptor jad
-text/vnd.wap.wml wml
-text/vnd.wap.wmlscript wmls
-text/x-bibtex bib
-text/x-c++hdr h++ hpp hxx hh
-text/x-c++src c++ cpp cxx cc
-text/x-chdr h
-text/x-csh csh
-text/x-csrc c
-text/x-haskell hs
-text/x-java java
-text/x-literate-haskell lhs
-text/x-moc moc
-text/x-pascal p pas
-text/x-pcs-gcd gcd
-text/x-perl pl pm
-text/x-python py
-text/x-server-parsed-html
-text/x-setext etx
-text/x-sh sh
-text/x-tcl tcl tk
-text/x-tex tex ltx sty cls
-text/x-vcalendar vcs
-text/x-vcard vcf
-video/dl dl
-video/dv dif dv
-video/fli fli
-video/gl gl
-video/mp4 mp4
-video/mpeg mpeg mpg mpe
-video/quicktime qt mov
-video/vnd.mpegurl mxu
-video/x-la-asf lsf lsx
-video/x-mng mng
-video/x-ms-asf asf asx
-video/x-ms-wm wm
-video/x-ms-wmv wmv
-video/x-ms-wmx wmx
-video/x-ms-wvx wvx
-video/x-msvideo avi
-video/x-sgi-movie movie
-video/x-flv flv
-x-conference/x-cooltalk ice
-x-world/x-vrml vrm vrml wrl
View
14 tests/control/HTTPTest.php
@@ -106,4 +106,18 @@ public function testSetGetVar() {
}
}
+ /**
+ * Test that the the get_mime_type() works correctly
+ *
+ */
+ public function testGetMimeType() {
+ $this->assertEquals('text/plain', HTTP::get_mime_type(FRAMEWORK_DIR.'/tests/control/files/file.csv'));
+ $this->assertEquals('image/gif', HTTP::get_mime_type(FRAMEWORK_DIR.'/tests/control/files/file.gif'));
+ $this->assertEquals('text/html', HTTP::get_mime_type(FRAMEWORK_DIR.'/tests/control/files/file.html'));
+ $this->assertEquals('image/jpeg', HTTP::get_mime_type(FRAMEWORK_DIR.'/tests/control/files/file.jpg'));
+ $this->assertEquals('image/png', HTTP::get_mime_type(FRAMEWORK_DIR.'/tests/control/files/file.png'));
+ $this->assertEquals('image/vnd.adobe.photoshop', HTTP::get_mime_type(FRAMEWORK_DIR.'/tests/control/files/file.psd'));
+ $this->assertEquals('audio/x-wav', HTTP::get_mime_type(FRAMEWORK_DIR.'/tests/control/files/file.wav'));
+ $this->assertEquals('application/vnd.ms-office', HTTP::get_mime_type(FRAMEWORK_DIR.'/tests/control/files/file.xls'));
+ }
}
View
1 tests/control/files/file.csv
@@ -0,0 +1 @@
+"Today","Your email","How do you feel","This is the name of the field","Submitted"
View
0 ...tinymce/themes/advanced/img/quicktime.gif → tests/control/files/file.gif
File renamed without changes
View
5 tests/control/files/file.html
@@ -0,0 +1,5 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" >
+ <head></head>
+ <body></body>
+</html>
View
BIN tests/control/files/file.jpg
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
BIN tests/control/files/file.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
BIN tests/control/files/file.psd
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
BIN tests/control/files/file.wav
Binary file not shown.
View
BIN tests/control/files/file.xls
Binary file not shown.

0 comments on commit dffae1a

Please sign in to comment.