From f9d9b3da12ab89757bf2068a4047540d260a93e3 Mon Sep 17 00:00:00 2001 From: FlexSuite Date: Wed, 1 Feb 2017 18:47:42 +0800 Subject: [PATCH] Enable support for PHP -S, Nginx, and HHVM Change the router to support PHP -S, Nginx and HHVM: - Add mime types - change uri --- src/Router.php | 990 +++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 839 insertions(+), 151 deletions(-) diff --git a/src/Router.php b/src/Router.php index 7171e13..4e019d3 100755 --- a/src/Router.php +++ b/src/Router.php @@ -22,167 +22,855 @@ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * - * @package Damn Stupid Simple - * @author Studio Nexus - * @copyright 2016 Studio Nexus - * @license MIT - * @version Release: 0.3.0 - * @link https://www.studionexus.co/php/damnstupidsimple + * @package Damn Stupid Simple + * @author Studio Nexus + * @copyright 2016 Studio Nexus + * @license MIT + * @version Release: 0.3.2 + * @link https://www.studionexus.co/php/damnstupidsimple */ namespace Core; -class Router { - /** - * The configurations - * @var array - * @access private - * @static - */ - static private $config = null; - public static $halts = false; - public static $routes = array(); - public static $methods = array(); - public static $callbacks = array(); - public static $patterns = array( - ':any' => '[^/]+', - ':num' => '[0-9]+', - ':all' => '.*' - ); - public static $error_callback; - /** - * Defines a route w/ callback and method - */ - public static function __callstatic($method, $params) { - $uri = dirname($_SERVER['PHP_SELF']).'/'.$params[0]; - $callback = $params[1]; - array_push(self::$routes, $uri); - array_push(self::$methods, strtoupper($method)); - array_push(self::$callbacks, $callback); - } - - /** - * Load the configuration file - */ - public static function start(){ - if(self::$config === null){ - self::$config = Config::get('routes'); - } - - foreach(self::$config['routes'] as $route){ - include(self::$config['path'] . $route . '.php'); +class Router +{ + private static $mimeTypes = array( + '.3dm' => 'x-world/x-3dmf', + '.3dmf' => 'x-world/x-3dmf', + '.a' => 'application/octet-stream', + '.aab' => 'application/x-authorware-bin', + '.aam' => 'application/x-authorware-map', + '.aas' => 'application/x-authorware-seg', + '.abc' => 'text/vnd.abc', + '.acgi' => 'text/html', + '.afl' => 'video/animaflex', + '.ai' => 'application/postscript', + '.aif' => 'audio/aiff', + '.aif' => 'audio/x-aiff', + '.aifc' => 'audio/aiff', + '.aifc' => 'audio/x-aiff', + '.aiff' => 'audio/aiff', + '.aiff' => 'audio/x-aiff', + '.aim' => 'application/x-aim', + '.aip' => 'text/x-audiosoft-intra', + '.ani' => 'application/x-navi-animation', + '.aos' => 'application/x-nokia-9000-communicator-add-on-software', + '.aps' => 'application/mime', + '.arc' => 'application/octet-stream', + '.arj' => 'application/arj', + '.arj' => 'application/octet-stream', + '.art' => 'image/x-jg', + '.asf' => 'video/x-ms-asf', + '.asm' => 'text/x-asm', + '.asp' => 'text/asp', + '.asx' => 'application/x-mplayer2', + '.asx' => 'video/x-ms-asf', + '.asx' => 'video/x-ms-asf-plugin', + '.au' => 'audio/basic', + '.au' => 'audio/x-au', + '.avi' => 'application/x-troff-msvideo', + '.avi' => 'video/avi', + '.avi' => 'video/msvideo', + '.avi' => 'video/x-msvideo', + '.avs' => 'video/avs-video', + '.bcpio' => 'application/x-bcpio', + '.bin' => 'application/mac-binary', + '.bin' => 'application/macbinary', + '.bin' => 'application/octet-stream', + '.bin' => 'application/x-binary', + '.bin' => 'application/x-macbinary', + '.bm' => 'image/bmp', + '.bmp' => 'image/bmp', + '.bmp' => 'image/x-windows-bmp', + '.boo' => 'application/book', + '.book' => 'application/book', + '.boz' => 'application/x-bzip2', + '.bsh' => 'application/x-bsh', + '.bz' => 'application/x-bzip', + '.bz2' => 'application/x-bzip2', + '.c' => 'text/plain', + '.c++' => 'text/plain', + '.cat' => 'application/vnd.ms-pki.seccat', + '.cc' => 'text/plain', + '.cc' => 'text/x-c', + '.ccad' => 'application/clariscad', + '.cco' => 'application/x-cocoa', + '.cdf' => 'application/cdf', + '.cdf' => 'application/x-cdf', + '.cdf' => 'application/x-netcdf', + '.cer' => 'application/pkix-cert', + '.cer' => 'application/x-x509-ca-cert', + '.cha' => 'application/x-chat', + '.chat' => 'application/x-chat', + '.class' => 'application/java', + '.class' => 'application/java-byte-code', + '.class' => 'application/x-java-class', + '.com' => 'application/octet-stream', + '.com' => 'text/plain', + '.conf' => 'text/plain', + '.cpio' => 'application/x-cpio', + '.cpp' => 'text/x-c', + '.cpt' => 'application/mac-compactpro', + '.cpt' => 'application/x-compactpro', + '.cpt' => 'application/x-cpt', + '.crl' => 'application/pkcs-crl', + '.crl' => 'application/pkix-crl', + '.crt' => 'application/pkix-cert', + '.crt' => 'application/x-x509-ca-cert', + '.crt' => 'application/x-x509-user-cert', + '.csh' => 'application/x-csh', + '.csh' => 'text/x-script.csh', + '.css' => 'application/x-pointplus', + '.css' => 'text/css', + '.cxx' => 'text/plain', + '.dcr' => 'application/x-director', + '.deepv' => 'application/x-deepv', + '.def' => 'text/plain', + '.der' => 'application/x-x509-ca-cert', + '.dif' => 'video/x-dv', + '.dir' => 'application/x-director', + '.dl' => 'video/dl', + '.dl' => 'video/x-dl', + '.doc' => 'application/msword', + '.dot' => 'application/msword', + '.dp' => 'application/commonground', + '.drw' => 'application/drafting', + '.dump' => 'application/octet-stream', + '.dv' => 'video/x-dv', + '.dvi' => 'application/x-dvi', + '.dwf' => 'drawing/x-dwf (old)', + '.dwf' => 'model/vnd.dwf', + '.dwg' => 'application/acad', + '.dwg' => 'image/vnd.dwg', + '.dwg' => 'image/x-dwg', + '.dxf' => 'application/dxf', + '.dxf' => 'image/vnd.dwg', + '.dxf' => 'image/x-dwg', + '.dxr' => 'application/x-director', + '.el' => 'text/x-script.elisp', + '.elc' => 'application/x-bytecode.elisp (compiled elisp)', + '.elc' => 'application/x-elc', + '.env' => 'application/x-envoy', + '.eps' => 'application/postscript', + '.es' => 'application/x-esrehber', + '.etx' => 'text/x-setext', + '.evy' => 'application/envoy', + '.evy' => 'application/x-envoy', + '.exe' => 'application/octet-stream', + '.f' => 'text/plain', + '.f' => 'text/x-fortran', + '.f77' => 'text/x-fortran', + '.f90' => 'text/plain', + '.f90' => 'text/x-fortran', + '.fdf' => 'application/vnd.fdf', + '.fif' => 'application/fractals', + '.fif' => 'image/fif', + '.fli' => 'video/fli', + '.fli' => 'video/x-fli', + '.flo' => 'image/florian', + '.flx' => 'text/vnd.fmi.flexstor', + '.fmf' => 'video/x-atomic3d-feature', + '.for' => 'text/plain', + '.for' => 'text/x-fortran', + '.fpx' => 'image/vnd.fpx', + '.fpx' => 'image/vnd.net-fpx', + '.frl' => 'application/freeloader', + '.funk' => 'audio/make', + '.g' => 'text/plain', + '.g3' => 'image/g3fax', + '.gif' => 'image/gif', + '.gl' => 'video/gl', + '.gl' => 'video/x-gl', + '.gsd' => 'audio/x-gsm', + '.gsm' => 'audio/x-gsm', + '.gsp' => 'application/x-gsp', + '.gss' => 'application/x-gss', + '.gtar' => 'application/x-gtar', + '.gz' => 'application/x-compressed', + '.gz' => 'application/x-gzip', + '.gzip' => 'application/x-gzip', + '.gzip' => 'multipart/x-gzip', + '.h' => 'text/plain', + '.h' => 'text/x-h', + '.hdf' => 'application/x-hdf', + '.help' => 'application/x-helpfile', + '.hgl' => 'application/vnd.hp-hpgl', + '.hh' => 'text/plain', + '.hh' => 'text/x-h', + '.hlb' => 'text/x-script', + '.hlp' => 'application/hlp', + '.hlp' => 'application/x-helpfile', + '.hlp' => 'application/x-winhelp', + '.hpg' => 'application/vnd.hp-hpgl', + '.hpgl' => 'application/vnd.hp-hpgl', + '.hqx' => 'application/binhex', + '.hqx' => 'application/binhex4', + '.hqx' => 'application/mac-binhex', + '.hqx' => 'application/mac-binhex40', + '.hqx' => 'application/x-binhex40', + '.hqx' => 'application/x-mac-binhex40', + '.hta' => 'application/hta', + '.htc' => 'text/x-component', + '.htm' => 'text/html', + '.html' => 'text/html', + '.htmls' => 'text/html', + '.htt' => 'text/webviewhtml', + '.htx' => 'text/html', + '.ice' => 'x-conference/x-cooltalk', + '.ico' => 'image/x-icon', + '.idc' => 'text/plain', + '.ief' => 'image/ief', + '.iefs' => 'image/ief', + '.iges' => 'application/iges', + '.iges' => 'model/iges', + '.igs' => 'application/iges', + '.igs' => 'model/iges', + '.ima' => 'application/x-ima', + '.imap' => 'application/x-httpd-imap', + '.inf' => 'application/inf', + '.ins' => 'application/x-internett-signup', + '.ip' => 'application/x-ip2', + '.isu' => 'video/x-isvideo', + '.it' => 'audio/it', + '.iv' => 'application/x-inventor', + '.ivr' => 'i-world/i-vrml', + '.ivy' => 'application/x-livescreen', + '.jam' => 'audio/x-jam', + '.jav' => 'text/plain', + '.jav' => 'text/x-java-source', + '.java' => 'text/plain', + '.java' => 'text/x-java-source', + '.jcm' => 'application/x-java-commerce', + '.jfif' => 'image/jpeg', + '.jfif' => 'image/pjpeg', + '.jfif-tbnl' => 'image/jpeg', + '.jpe' => 'image/jpeg', + '.jpe' => 'image/pjpeg', + '.jpeg' => 'image/jpeg', + '.jpeg' => 'image/pjpeg', + '.jpg' => 'image/jpeg', + '.jpg' => 'image/pjpeg', + '.jps' => 'image/x-jps', + '.js' => 'application/x-javascript', + '.jut' => 'image/jutvision', + '.kar' => 'audio/midi', + '.kar' => 'music/x-karaoke', + '.ksh' => 'application/x-ksh', + '.ksh' => 'text/x-script.ksh', + '.la' => 'audio/nspaudio', + '.la' => 'audio/x-nspaudio', + '.lam' => 'audio/x-liveaudio', + '.latex' => 'application/x-latex', + '.lha' => 'application/lha', + '.lha' => 'application/octet-stream', + '.lha' => 'application/x-lha', + '.lhx' => 'application/octet-stream', + '.list' => 'text/plain', + '.lma' => 'audio/nspaudio', + '.lma' => 'audio/x-nspaudio', + '.log' => 'text/plain', + '.lsp' => 'application/x-lisp', + '.lsp' => 'text/x-script.lisp', + '.lst' => 'text/plain', + '.lsx' => 'text/x-la-asf', + '.ltx' => 'application/x-latex', + '.lzh' => 'application/octet-stream', + '.lzh' => 'application/x-lzh', + '.lzx' => 'application/lzx', + '.lzx' => 'application/octet-stream', + '.lzx' => 'application/x-lzx', + '.m' => 'text/plain', + '.m' => 'text/x-m', + '.m1v' => 'video/mpeg', + '.m2a' => 'audio/mpeg', + '.m2v' => 'video/mpeg', + '.m3u' => 'audio/x-mpequrl', + '.man' => 'application/x-troff-man', + '.map' => 'application/x-navimap', + '.mar' => 'text/plain', + '.mbd' => 'application/mbedlet', + '.mc' => 'application/x-magic-cap-package-1.0', + '.mcd' => 'application/mcad', + '.mcd' => 'application/x-mathcad', + '.mcf' => 'image/vasa', + '.mcf' => 'text/mcf', + '.mcp' => 'application/netmc', + '.me' => 'application/x-troff-me', + '.mht' => 'message/rfc822', + '.mhtml' => 'message/rfc822', + '.mid' => 'application/x-midi', + '.mid' => 'audio/midi', + '.mid' => 'audio/x-mid', + '.mid' => 'audio/x-midi', + '.mid' => 'music/crescendo', + '.mid' => 'x-music/x-midi', + '.midi' => 'application/x-midi', + '.midi' => 'audio/midi', + '.midi' => 'audio/x-mid', + '.midi' => 'audio/x-midi', + '.midi' => 'music/crescendo', + '.midi' => 'x-music/x-midi', + '.mif' => 'application/x-frame', + '.mif' => 'application/x-mif', + '.mime' => 'message/rfc822', + '.mime' => 'www/mime', + '.mjf' => 'audio/x-vnd.audioexplosion.mjuicemediafile', + '.mjpg' => 'video/x-motion-jpeg', + '.mm' => 'application/base64', + '.mm' => 'application/x-meme', + '.mme' => 'application/base64', + '.mod' => 'audio/mod', + '.mod' => 'audio/x-mod', + '.moov' => 'video/quicktime', + '.mov' => 'video/quicktime', + '.movie' => 'video/x-sgi-movie', + '.mp2' => 'audio/mpeg', + '.mp2' => 'audio/x-mpeg', + '.mp2' => 'video/mpeg', + '.mp2' => 'video/x-mpeg', + '.mp2' => 'video/x-mpeq2a', + '.mp3' => 'audio/mpeg3', + '.mp3' => 'audio/x-mpeg-3', + '.mp3' => 'video/mpeg', + '.mp3' => 'video/x-mpeg', + '.mpa' => 'audio/mpeg', + '.mpa' => 'video/mpeg', + '.mpc' => 'application/x-project', + '.mpe' => 'video/mpeg', + '.mpeg' => 'video/mpeg', + '.mpg' => 'audio/mpeg', + '.mpg' => 'video/mpeg', + '.mpga' => 'audio/mpeg', + '.mpp' => 'application/vnd.ms-project', + '.mpt' => 'application/x-project', + '.mpv' => 'application/x-project', + '.mpx' => 'application/x-project', + '.mrc' => 'application/marc', + '.ms' => 'application/x-troff-ms', + '.mv' => 'video/x-sgi-movie', + '.my' => 'audio/make', + '.mzz' => 'application/x-vnd.audioexplosion.mzz', + '.nap' => 'image/naplps', + '.naplps' => 'image/naplps', + '.nc' => 'application/x-netcdf', + '.ncm' => 'application/vnd.nokia.configuration-message', + '.nif' => 'image/x-niff', + '.niff' => 'image/x-niff', + '.nix' => 'application/x-mix-transfer', + '.nsc' => 'application/x-conference', + '.nvd' => 'application/x-navidoc', + '.o' => 'application/octet-stream', + '.oda' => 'application/oda', + '.omc' => 'application/x-omc', + '.omcd' => 'application/x-omcdatamaker', + '.omcr' => 'application/x-omcregerator', + '.p' => 'text/x-pascal', + '.p10' => 'application/pkcs10', + '.p10' => 'application/x-pkcs10', + '.p12' => 'application/pkcs-12', + '.p12' => 'application/x-pkcs12', + '.p7a' => 'application/x-pkcs7-signature', + '.p7c' => 'application/pkcs7-mime', + '.p7c' => 'application/x-pkcs7-mime', + '.p7m' => 'application/pkcs7-mime', + '.p7m' => 'application/x-pkcs7-mime', + '.p7r' => 'application/x-pkcs7-certreqresp', + '.p7s' => 'application/pkcs7-signature', + '.part' => 'application/pro_eng', + '.pas' => 'text/pascal', + '.pbm' => 'image/x-portable-bitmap', + '.pcl' => 'application/vnd.hp-pcl', + '.pcl' => 'application/x-pcl', + '.pct' => 'image/x-pict', + '.pcx' => 'image/x-pcx', + '.pdb' => 'chemical/x-pdb', + '.pdf' => 'application/pdf', + '.pfunk' => 'audio/make', + '.pgm' => 'image/x-portable-greymap', + '.pic' => 'image/pict', + '.pict' => 'image/pict', + '.pkg' => 'application/x-newton-compatible-pkg', + '.pko' => 'application/vnd.ms-pki.pko', + '.pl' => 'text/plain', + '.pl' => 'text/x-script.perl', + '.plx' => 'application/x-pixclscript', + '.pm' => 'image/x-xpixmap', + '.pm' => 'text/x-script.perl-module', + '.pm4' => 'application/x-pagemaker', + '.pm5' => 'application/x-pagemaker', + '.png' => 'image/png', + '.pnm' => 'application/x-portable-anymap', + '.pnm' => 'image/x-portable-anymap', + '.pot' => 'application/mspowerpoint', + '.pot' => 'application/vnd.ms-powerpoint', + '.pov' => 'model/x-pov', + '.ppa' => 'application/vnd.ms-powerpoint', + '.ppm' => 'image/x-portable-pixmap', + '.pps' => 'application/mspowerpoint', + '.pps' => 'application/vnd.ms-powerpoint', + '.ppt' => 'application/mspowerpoint', + '.ppt' => 'application/powerpoint', + '.ppt' => 'application/vnd.ms-powerpoint', + '.ppt' => 'application/x-mspowerpoint', + '.ppz' => 'application/mspowerpoint', + '.pre' => 'application/x-freelance', + '.prt' => 'application/pro_eng', + '.ps' => 'application/postscript', + '.psd' => 'application/octet-stream', + '.pvu' => 'paleovu/x-pv', + '.pwz' => 'application/vnd.ms-powerpoint', + '.py' => 'text/x-script.phyton', + '.pyc' => 'applicaiton/x-bytecode.python', + '.qcp' => 'audio/vnd.qcelp', + '.qd3' => 'x-world/x-3dmf', + '.qd3d' => 'x-world/x-3dmf', + '.qif' => 'image/x-quicktime', + '.qt' => 'video/quicktime', + '.qtc' => 'video/x-qtc', + '.qti' => 'image/x-quicktime', + '.qtif' => 'image/x-quicktime', + '.ra' => 'audio/x-pn-realaudio', + '.ra' => 'audio/x-pn-realaudio-plugin', + '.ra' => 'audio/x-realaudio', + '.ram' => 'audio/x-pn-realaudio', + '.ras' => 'application/x-cmu-raster', + '.ras' => 'image/cmu-raster', + '.ras' => 'image/x-cmu-raster', + '.rast' => 'image/cmu-raster', + '.rexx' => 'text/x-script.rexx', + '.rf' => 'image/vnd.rn-realflash', + '.rgb' => 'image/x-rgb', + '.rm' => 'application/vnd.rn-realmedia', + '.rm' => 'audio/x-pn-realaudio', + '.rmi' => 'audio/mid', + '.rmm' => 'audio/x-pn-realaudio', + '.rmp' => 'audio/x-pn-realaudio', + '.rmp' => 'audio/x-pn-realaudio-plugin', + '.rng' => 'application/ringing-tones', + '.rng' => 'application/vnd.nokia.ringing-tone', + '.rnx' => 'application/vnd.rn-realplayer', + '.roff' => 'application/x-troff', + '.rp' => 'image/vnd.rn-realpix', + '.rpm' => 'audio/x-pn-realaudio-plugin', + '.rt' => 'text/richtext', + '.rt' => 'text/vnd.rn-realtext', + '.rtf' => 'application/rtf', + '.rtf' => 'application/x-rtf', + '.rtf' => 'text/richtext', + '.rtx' => 'application/rtf', + '.rtx' => 'text/richtext', + '.rv' => 'video/vnd.rn-realvideo', + '.s' => 'text/x-asm', + '.s3m' => 'audio/s3m', + '.saveme' => 'aapplication/octet-stream', + '.sbk' => 'application/x-tbook', + '.scm' => 'application/x-lotusscreencam', + '.scm' => 'text/x-script.guile', + '.scm' => 'text/x-script.scheme', + '.scm' => 'video/x-scm', + '.sdml' => 'text/plain', + '.sdp' => 'application/sdp', + '.sdp' => 'application/x-sdp', + '.sdr' => 'application/sounder', + '.sea' => 'application/sea', + '.sea' => 'application/x-sea', + '.set' => 'application/set', + '.sgm' => 'text/sgml', + '.sgm' => 'text/x-sgml', + '.sgml' => 'text/sgml', + '.sgml' => 'text/x-sgml', + '.sh' => 'application/x-bsh', + '.sh' => 'application/x-sh', + '.sh' => 'application/x-shar', + '.sh' => 'text/x-script.sh', + '.shar' => 'application/x-bsh', + '.shar' => 'application/x-shar', + '.shtml' => 'text/html', + '.shtml' => 'text/x-server-parsed-html', + '.sid' => 'audio/x-psid', + '.sit' => 'application/x-sit', + '.sit' => 'application/x-stuffit', + '.skd' => 'application/x-koan', + '.skm' => 'application/x-koan', + '.skp' => 'application/x-koan', + '.skt' => 'application/x-koan', + '.sl' => 'application/x-seelogo', + '.smi' => 'application/smil', + '.smil' => 'application/smil', + '.snd' => 'audio/basic', + '.snd' => 'audio/x-adpcm', + '.sol' => 'application/solids', + '.spc' => 'application/x-pkcs7-certificates', + '.spc' => 'text/x-speech', + '.spl' => 'application/futuresplash', + '.spr' => 'application/x-sprite', + '.sprite' => 'application/x-sprite', + '.src' => 'application/x-wais-source', + '.ssi' => 'text/x-server-parsed-html', + '.ssm' => 'application/streamingmedia', + '.sst' => 'application/vnd.ms-pki.certstore', + '.step' => 'application/step', + '.stl' => 'application/sla', + '.stl' => 'application/vnd.ms-pki.stl', + '.stl' => 'application/x-navistyle', + '.stp' => 'application/step', + '.sv4cpio' => 'application/x-sv4cpio', + '.sv4crc' => 'application/x-sv4crc', + '.svf' => 'image/vnd.dwg', + '.svf' => 'image/x-dwg', + '.svr' => 'application/x-world', + '.svr' => 'x-world/x-svr', + '.swf' => 'application/x-shockwave-flash', + '.t' => 'application/x-troff', + '.talk' => 'text/x-speech', + '.tar' => 'application/x-tar', + '.tbk' => 'application/toolbook', + '.tbk' => 'application/x-tbook', + '.tcl' => 'application/x-tcl', + '.tcl' => 'text/x-script.tcl', + '.tcsh' => 'text/x-script.tcsh', + '.tex' => 'application/x-tex', + '.texi' => 'application/x-texinfo', + '.texinfo' => ' lication/x-texinfo', + '.text' => 'application/plain', + '.text' => 'text/plain', + '.tgz' => 'application/gnutar', + '.tgz' => 'application/x-compressed', + '.tif' => 'image/tiff', + '.tif' => 'image/x-tiff', + '.tiff' => 'image/tiff', + '.tiff' => 'image/x-tiff', + '.tr' => 'application/x-troff', + '.tsi' => 'audio/tsp-audio', + '.tsp' => 'application/dsptype', + '.tsp' => 'audio/tsplayer', + '.tsv' => 'text/tab-separated-values', + '.turbot' => 'image/florian', + '.txt' => 'text/plain', + '.uil' => 'text/x-uil', + '.uni' => 'text/uri-list', + '.unis' => 'text/uri-list', + '.unv' => 'application/i-deas', + '.uri' => 'text/uri-list', + '.uris' => 'text/uri-list', + '.ustar' => 'application/x-ustar', + '.ustar' => 'multipart/x-ustar', + '.uu' => 'application/octet-stream', + '.uu' => 'text/x-uuencode', + '.uue' => 'text/x-uuencode', + '.vcd' => 'application/x-cdlink', + '.vcs' => 'text/x-vcalendar', + '.vda' => 'application/vda', + '.vdo' => 'video/vdo', + '.vew' => 'application/groupwise', + '.viv' => 'video/vivo', + '.viv' => 'video/vnd.vivo', + '.vivo' => 'video/vivo', + '.vivo' => 'video/vnd.vivo', + '.vmd' => 'application/vocaltec-media-desc', + '.vmf' => 'application/vocaltec-media-file', + '.voc' => 'audio/voc', + '.voc' => 'audio/x-voc', + '.vos' => 'video/vosaic', + '.vox' => 'audio/voxware', + '.vqe' => 'audio/x-twinvq-plugin', + '.vqf' => 'audio/x-twinvq', + '.vql' => 'audio/x-twinvq-plugin', + '.vrml' => 'application/x-vrml', + '.vrml' => 'model/vrml', + '.vrml' => 'x-world/x-vrml', + '.vrt' => 'x-world/x-vrt', + '.vsd' => 'application/x-visio', + '.vst' => 'application/x-visio', + '.vsw' => 'application/x-visio', + '.w60' => 'application/wordperfect6.0', + '.w61' => 'application/wordperfect6.1', + '.w6w' => 'application/msword', + '.wav' => 'audio/wav', + '.wav' => 'audio/x-wav', + '.wb1' => 'application/x-qpro', + '.wbmp' => 'image/vnd.wap.wbmp', + '.web' => 'application/vnd.xara', + '.wiz' => 'application/msword', + '.wk1' => 'application/x-123', + '.wmf' => 'windows/metafile', + '.wml' => 'text/vnd.wap.wml', + '.wmlc' => 'application/vnd.wap.wmlc', + '.wmls' => 'text/vnd.wap.wmlscript', + '.wmlsc' => 'application/vnd.wap.wmlscriptc', + '.word' => 'application/msword', + '.wp' => 'application/wordperfect', + '.wp5' => 'application/wordperfect', + '.wp5' => 'application/wordperfect6.0', + '.wp6' => 'application/wordperfect', + '.wpd' => 'application/wordperfect', + '.wpd' => 'application/x-wpwin', + '.wq1' => 'application/x-lotus', + '.wri' => 'application/mswrite', + '.wri' => 'application/x-wri', + '.wrl' => 'application/x-world', + '.wrl' => 'model/vrml', + '.wrl' => 'x-world/x-vrml', + '.wrz' => 'model/vrml', + '.wrz' => 'x-world/x-vrml', + '.wsc' => 'text/scriplet', + '.wsrc' => 'application/x-wais-source', + '.wtk' => 'application/x-wintalk', + '.xbm' => 'image/x-xbitmap', + '.xbm' => 'image/x-xbm', + '.xbm' => 'image/xbm', + '.xdr' => 'video/x-amt-demorun', + '.xgz' => 'xgl/drawing', + '.xif' => 'image/vnd.xiff', + '.xl' => 'application/excel', + '.xla' => 'application/excel', + '.xla' => 'application/x-excel', + '.xla' => 'application/x-msexcel', + '.xlb' => 'application/excel', + '.xlb' => 'application/vnd.ms-excel', + '.xlb' => 'application/x-excel', + '.xlc' => 'application/excel', + '.xlc' => 'application/vnd.ms-excel', + '.xlc' => 'application/x-excel', + '.xld' => 'application/excel', + '.xld' => 'application/x-excel', + '.xlk' => 'application/excel', + '.xlk' => 'application/x-excel', + '.xll' => 'application/excel', + '.xll' => 'application/vnd.ms-excel', + '.xll' => 'application/x-excel', + '.xlm' => 'application/excel', + '.xlm' => 'application/vnd.ms-excel', + '.xlm' => 'application/x-excel', + '.xls' => 'application/excel', + '.xls' => 'application/vnd.ms-excel', + '.xls' => 'application/x-excel', + '.xls' => 'application/x-msexcel', + '.xlt' => 'application/excel', + '.xlt' => 'application/x-excel', + '.xlv' => 'application/excel', + '.xlv' => 'application/x-excel', + '.xlw' => 'application/excel', + '.xlw' => 'application/vnd.ms-excel', + '.xlw' => 'application/x-excel', + '.xlw' => 'application/x-msexcel', + '.xm' => 'audio/xm', + '.xml' => 'application/xml', + '.xml' => 'text/xml', + '.xmz' => 'xgl/movie', + '.xpix' => 'application/x-vnd.ls-xpix', + '.xpm' => 'image/x-xpixmap', + '.xpm' => 'image/xpm', + '.x-png' => 'image/png', + '.xsr' => 'video/x-amt-showrun', + '.xwd' => 'image/x-xwd', + '.xwd' => 'image/x-xwindowdump', + '.xyz' => 'chemical/x-pdb', + '.z' => 'application/x-compress', + '.z' => 'application/x-compressed', + '.zip' => 'application/x-compressed', + '.zip' => 'application/x-zip-compressed', + '.zip' => 'application/zip', + '.zip' => 'multipart/x-zip', + '.zoo' => 'application/octet-stream', + '.zsh' => 'text/x-script.zsh)' + ); + private static $config = null; + public static $halts = false; + public static $routes = array(); + public static $methods = array(); + public static $callbacks = array(); + public static $patterns = array( + ':any' => '[^/]+', + ':num' => '[0-9]+', + ':all' => '.*' + ); + public static $error_callback; + + /** + * Defines a route w/ callback and method + * @param $method + * @param $params + */ + public static function __callstatic($method, $params) + { + $uri = dirname($_SERVER["SCRIPT_NAME"]) . '/' . $params[0]; + + $callback = $params[1]; + array_push(self::$routes, $uri); + array_push(self::$methods, strtoupper($method)); + array_push(self::$callbacks, $callback); } - } - - /** - * Defines callback if route is not found - */ - public static function error($callback) { - self::$error_callback = $callback; - } - public static function haltOnMatch($flag = true) { - self::$halts = $flag; - } - /** - * Runs the callback for the given request - */ - public static function dispatch(){ - - $uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); - $method = $_SERVER['REQUEST_METHOD']; - $searches = array_keys(static::$patterns); - $replaces = array_values(static::$patterns); - $found_route = false; - - self::$routes = str_replace('//', '/', self::$routes); - // Check if route is defined without regex - if (in_array($uri, self::$routes)) { - $route_pos = array_keys(self::$routes, $uri); - foreach ($route_pos as $route) { - // Using an ANY option to match both GET and POST requests - if (self::$methods[$route] === $method || self::$methods[$route] === 'ANY') { - $found_route = true; - // If route is not an object - if (!is_object(self::$callbacks[$route])) { - // Grab all parts based on a / separator - $parts = explode('/',self::$callbacks[$route]); - // Collect the last index of the array - $last = end($parts); - // Grab the controller name and method call - $segments = explode('@',$last); - // Instanitate controller - $controller = new $segments[0](); - // Call method - $controller->{$segments[1]}(); - if (self::$halts) return; - } else { - // Call closure - call_user_func(self::$callbacks[$route]); - if (self::$halts) return; - } + + /** + * Load the configuration file + */ + public static function start() + { + if (self::$config === null) { + self::$config = Config::get('routes'); } - } - } else { - // Check if defined with regex - $pos = 0; - foreach (self::$routes as $route) { - if (strpos($route, ':') !== false) { - $route = str_replace($searches, $replaces, $route); + + foreach (self::$config['routes'] as $route) { + include(self::$config['path'] . $route . '.php'); } - if (preg_match('#^' . $route . '$#', $uri, $matched)) { - if (self::$methods[$pos] === $method || self::$methods[$pos] === 'ANY') { - $found_route = true; - // Remove $matched[0] as [1] is the first parameter. - array_shift($matched); - if (!is_object(self::$callbacks[$pos])) { - // Grab all parts based on a / separator - $parts = explode('/',self::$callbacks[$pos]); - // Collect the last index of the array - $last = end($parts); - // Grab the controller name and method call - $segments = explode('@',$last); - // Instanitate controller - $controller = new $segments[0](); - // Fix multi parameters - if(!method_exists($controller, $segments[1])) { - //"controller and action not found" - Debugger::report(500); - } else { - call_user_func_array(array($controller, $segments[1]), $matched); - } - if (self::$halts) return; + } + + /** + * Defines callback if route is not found + */ + public static function error($callback) + { + self::$error_callback = $callback; + } + + public static function haltOnMatch($flag = true) + { + self::$halts = $flag; + } + + /** + * Runs the callback for the given request + */ + public static function dispatch() + { + + $uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); + $method = $_SERVER['REQUEST_METHOD']; + $searches = array_keys(static::$patterns); + $replaces = array_values(static::$patterns); + $found_route = false; + + self::$routes = str_replace('//', '/', self::$routes); + // Check if route is defined without regex + if (in_array($uri, self::$routes)) { + $route_pos = array_keys(self::$routes, $uri); + foreach ($route_pos as $route) { + // Using an ANY option to match both GET and POST requests + if (self::$methods[$route] === $method || self::$methods[$route] === 'ANY') { + $found_route = true; + // If route is not an object + if (!is_object(self::$callbacks[$route])) { + // Grab all parts based on a / separator + $parts = explode('/', self::$callbacks[$route]); + // Collect the last index of the array + $last = end($parts); + // Grab the controller name and method call + $segments = explode('@', $last); + // Instanitate controller + $controller = new $segments[0](); + // Call method + $controller->{$segments[1]}(); + if (self::$halts) return; + } else { + // Call closure + call_user_func(self::$callbacks[$route]); + if (self::$halts) return; + } + } + } + } else { + // Check if defined with regex + $pos = 0; + foreach (self::$routes as $route) { + if (strpos($route, ':') !== false) { + $route = str_replace($searches, $replaces, $route); + } + if (preg_match('#^' . $route . '$#', $uri, $matched)) { + if (self::$methods[$pos] === $method || self::$methods[$pos] === 'ANY') { + $found_route = true; + // Remove $matched[0] as [1] is the first parameter. + array_shift($matched); + if (!is_object(self::$callbacks[$pos])) { + // Grab all parts based on a / separator + $parts = explode('/', self::$callbacks[$pos]); + // Collect the last index of the array + $last = end($parts); + // Grab the controller name and method call + $segments = explode('@', $last); + // Instanitate controller + $controller = new $segments[0](); + // Fix multi parameters + if (!method_exists($controller, $segments[1])) { + //"controller and action not found" + Debugger::report(500); + } else { + call_user_func_array(array($controller, $segments[1]), $matched); + } + if (self::$halts) return; + } else { + call_user_func_array(self::$callbacks[$pos], $matched); + if (self::$halts) return; + } + } else { + + } + } + $pos++; + } + } + // Run the error callback if the route was not found + if ($found_route === false) { + if (!self::$error_callback) { + self::$error_callback = function () { + + $file_path = $_SERVER['REQUEST_URI']; + + $parameters = substr($file_path, strrpos($file_path, '?') + 1); + + $file_path_no_parameter = str_replace('?' . $parameters, '', $file_path); + + $parameters_array = []; + + parse_str($parameters, $parameters_array); + + foreach ($parameters_array as $key => $content) { + $_GET[$key] = $content; + } + + if (file_exists('../' . $file_path_no_parameter)) { + header('Content-Type: ' . static::getMimeType('../' . $file_path_no_parameter), true); + file_get_contents('../' . $file_path_no_parameter); + } else { + Debugger::report(404); + } + + die(); + }; } else { - call_user_func_array(self::$callbacks[$pos], $matched); - if (self::$halts) return; + if (is_string(self::$error_callback)) { + self::get($_SERVER['REQUEST_URI'], self::$error_callback); + self::$error_callback = null; + self::dispatch(); + return; + } } - }else{ + call_user_func(self::$error_callback); + } + } - } + /** + * @param $url + * @param bool $permanent + */ + static function redirect($url, $permanent = false) + { + if (headers_sent() === false) { + header('Location: ' . $url, true, ($permanent === true) ? 301 : 302); } - $pos++; - } + exit(); } - // Run the error callback if the route was not found - if ($found_route === false) { - if (!self::$error_callback) { - self::$error_callback = function() { - Debugger::report(404); - }; - } else { - if (is_string(self::$error_callback)) { - self::get($_SERVER['REQUEST_URI'], self::$error_callback); - self::$error_callback = null; - self::dispatch(); - return ; + + /** + * @param $file_name + * @return mixed|string + */ + static function getMimeType($file_name) + { + $ext = pathinfo($file_name, PATHINFO_EXTENSION); + if (isset(static::$mimeTypes['.' . $ext])) { + return static::$mimeTypes['.' . $ext]; + } else { + return 'text/plain'; } - } - call_user_func(self::$error_callback); } - } - - static function redirect($url, $permanent = false){ - if (headers_sent() === false){ - header('Location: ' . $url, true, ($permanent === true) ? 301 : 302); - } - exit(); - } -} +} \ No newline at end of file