├── .gitignore ├── README.md ├── assets ├── css │ └── style.css └── images │ ├── 1.jpg │ ├── 2.jpg │ └── 3.jpg ├── index.js ├── index.php ├── package.json ├── src ├── cacert.pem ├── logo.png ├── mimes.json ├── php_5.png ├── php_7.png ├── router.class.php ├── router.php └── startServer.bat └── test └── routerPath.js /.gitignore: -------------------------------------------------------------------------------- 1 | /.idea 2 | /codeigniter 3 | /yii 4 | /wordpress 5 | /wordpress48 6 | /drupal7 7 | /drupal8 8 | /npm-debug.log 9 | /sites 10 | /slim 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # **Use this only in a development environment** 2 | 3 | # PHP-Built-in-web-server-Router 4 | ![PHP-Built-in-web-server-Router](./src/php_5.png) 5 | ![PHP-Built-in-web-server-Router](./src/php_7.png) 6 | 7 | This library comes with **caching support** for [**PHP built-in web-server**](http://php.net/manual/en/features.commandline.webserver.php) 8 | 9 | Router.php is loaded before index.php, so you can: 10 | * Have **CORS** enabled 11 | * Set up your environment variables and constants 12 | * And **CACHE EVERYTHING** 13 | 14 | It also comes with a custom console function to output string|array into terminal ( check out index.php for usage ). 15 | 16 | Don't forget to delete it after usage, this function is meant only for Development ! 17 | 18 | ```console_output( $string , 'another', array('show'=>1) , ...args )``` 19 | 20 | ### NODE.JS 21 | I highly recommend [node-php-awesome-server](https://www.npmjs.com/package/node-php-awesome-server) if you need a php webserver in a node environment, it uses this router as default router, and much more various configuration options. 22 | ``` 23 | npm install node-php-awesome-server --save-dev 24 | ``` 25 | If you install this as a npm package you can only retrieve the absolute paths of the router, the library file and a cURL certificate. 26 | ``` 27 | npm install php-built-in-web-server-router --save-dev 28 | ``` 29 | ```javascript 30 | let router = require('php-built-in-web-server-router'); 31 | 32 | console.log('Router path: ', router.path); 33 | console.log('Router library: ', router.lib); 34 | console.log('cURL certificate: ', router.cert); 35 | 36 | ``` 37 | 38 | # Requirements 39 | PHP 5.4.0+ and /src/mimes.json file. 40 | 41 | # Usage 42 | 43 | Bellow you'll find a few examples. Additional params may be found [here](http://php.net/manual/en/features.commandline.webserver.php) 44 | 45 | 1. If router.php is located in the root folder 46 | ```cli 47 | php -S localhost:8000 router.php 48 | ``` 49 | 2. If router.php is located in separate folder: 50 | ```cli 51 | php -S localhost:8000 misc/router.php 52 | ``` 53 | 3. If your project structure is something like this, use '-t' parameter to set the document root to your public folder 54 | 55 | ``` 56 | ./www/ 57 | - your_php_framework/ 58 | - private_framework_stuff/ 59 | ... 60 | - public/ 61 | - misc/ 62 | - router.php 63 | - mimes.json 64 | - onefile.php 65 | 66 | 67 | php -S localhost:8000 -t ./your_php_framework/public misc/router.php 68 | ``` 69 | 70 | # Edit router.php 71 | 72 | This are the default settings. 73 | 74 | 75 | ``` 76 | # class PHP_Webserver_Router{...} 77 | # or 78 | 79 | include('router.class.php'); 80 | 81 | ### 82 | # Set up early your environment variables/constants 83 | ### 84 | 85 | $_SERVER["ENVIRONMENT"] = "development"; 86 | error_reporting(E_ALL); 87 | 88 | 89 | $php_web_server = new PHP_Webserver_Router(); 90 | 91 | 92 | ### 93 | # Uncomment to Disable http output in console: 94 | ### 95 | //$php_web_server->log_enable = FALSE; 96 | 97 | ### 98 | # Change this if your "index.php" has another name. By default is index.php 99 | ### 100 | //$php_web_server->indexPath = "my_new_index_file.php"; 101 | 102 | return $php_web_server->listen(); 103 | ``` 104 | 105 | # Notes 106 | I've tested this with the following php frameworks: 107 | * Slim 3 ( **the newest addition to this list** ) 108 | * Yii2 109 | * CodeIgniter 3 110 | * Wordpress 4 111 | * Drupal 7 and 8 112 | 113 | On the first request sent to router.php, it will attempt to download and create mimes.json, if that fails, you can find mimes.json in ./src/ and copy it next to router.php 114 | 115 | Personally I bind the webserver to ```php -S 0.0.0.0 ...``` so I can test from other remote devices. 116 | 117 | # Thanks 118 | The method create_mime_file() is a modified version of [Josh Sean's generateUpToDateMimeArray function](http://php.net/manual/ro/function.mime-content-type.php#107798) -------------------------------------------------------------------------------- /assets/css/style.css: -------------------------------------------------------------------------------- 1 | html, 2 | body { 3 | font-family: 'Roboto', sans-serif; 4 | margin: 0; 5 | font-style: normal; 6 | height: 100%; 7 | width: 100%; 8 | color: #fff; 9 | font-weight:normal; 10 | } 11 | h4{ 12 | font-family: 'Roboto', sans-serif; 13 | font-weight:normal; 14 | } 15 | .main{ 16 | width: 100%; 17 | height: 100%; 18 | background: rgba(0, 0, 0, .4); 19 | } 20 | 21 | .images-block { 22 | box-sizing: border-box; 23 | display: inline-block; 24 | vertical-align: top; 25 | text-align: center; 26 | width: 100%; 27 | font-size: 0; 28 | height: 100%; 29 | position: relative; 30 | } 31 | 32 | .info-dev{ 33 | position: absolute; 34 | top: 0; 35 | left: 0; 36 | width: 100%; 37 | text-align: center; 38 | z-index: 10; 39 | background-color: rgba(0,0,0,0.5); 40 | color: #fff; 41 | font-size: 1rem; 42 | padding: 1% 0; 43 | margin: 0; 44 | 45 | } 46 | 47 | .img { 48 | position: relative; 49 | width: 33.3%; 50 | display: inline-block; 51 | vertical-align: top; 52 | height: 100%; 53 | } 54 | .img.last-image{ 55 | background-image: url('/assets/images/3.jpg'); 56 | display: inline-block; 57 | vertical-align: top; 58 | background-repeat: no-repeat; 59 | background-size: cover; 60 | background-position: center top; 61 | 62 | } -------------------------------------------------------------------------------- /assets/images/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/darklightcode/PHP-Built-in-web-server-Router/9114d10c5661dcde0f53508c380fb0190cfc86cc/assets/images/1.jpg -------------------------------------------------------------------------------- /assets/images/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/darklightcode/PHP-Built-in-web-server-Router/9114d10c5661dcde0f53508c380fb0190cfc86cc/assets/images/2.jpg -------------------------------------------------------------------------------- /assets/images/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/darklightcode/PHP-Built-in-web-server-Router/9114d10c5661dcde0f53508c380fb0190cfc86cc/assets/images/3.jpg -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | var path = require('path'); 2 | 3 | var _root = path.resolve(__dirname); 4 | 5 | function root(args) { 6 | args = Array.prototype.slice.call(arguments, 0); 7 | return path.join.apply(path, [_root].concat(args)); 8 | } 9 | 10 | exports.path = root('src','router.php'); 11 | exports.lib = root('src','router.class.php'); 12 | exports.cert = root('src','cacert.pem'); -------------------------------------------------------------------------------- /index.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | PHP-Built-in-web-server-Router 9 | 10 | 11 | 12 | 16 | 17 |
18 | 19 | array("vector" => "too"))); 21 | ?> 22 | 23 |
24 |

Check the following images in Developer Tools > Networking to see http status.

25 | 26 | 27 |
Loaded from style.css
28 |
29 | 30 | 31 |
32 | 33 | 34 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "php-built-in-web-server-router", 3 | "version": "1.6.0", 4 | "description": "A router library for your PHP Built-in Webserver.", 5 | "main": "index.js", 6 | "scripts": { 7 | "start-default": "php -d max_execution_time=280 -S 0.0.0.0:9000 ./src/router.php", 8 | "start-codeigniter": "php -d max_execution_time=280 -S 0.0.0.0:9001 -t ./codeigniter src/router.php", 9 | "start-yii": "php -d max_execution_time=280 -S 0.0.0.0:9002 -t ./yii/web src/router.php", 10 | "start-wordpress": "php -d max_execution_time=280 -S 0.0.0.0:9003 -t ./wordpress src/router.php", 11 | "start-wordpress48": "php -d max_execution_time=280 -S 0.0.0.0:9004 -t ./wordpress48 src/router.php", 12 | "start-drupal7": "php -d max_execution_time=280 -S 0.0.0.0:9005 -t ./drupal7 src/router.php", 13 | "start-drupal8": "php -d max_execution_time=280 -S 0.0.0.0:9006 -t ./drupal8 src/router.php", 14 | "start-slim": "php -d max_execution_time=280 -S 0.0.0.0:9007 -t ./slim/public src/router.php", 15 | "test-router-path": "node ./test/routerPath.js", 16 | "deployDev": "git add -A && git commit -a -m \"deploy dev changes\" && npm version patch && git pull --progress -v --no-rebase \"origin\" && git push --tags --progress \"origin\" master:master" 17 | }, 18 | "repository": { 19 | "type": "git", 20 | "url": "git+https://github.com/darklightcode/PHP-Built-in-web-server-Router.git" 21 | }, 22 | "keywords": [ 23 | "php-router", 24 | "router.php", 25 | "router-development", 26 | "php built-in webserver", 27 | "php webserver", 28 | "php development", 29 | "node-php-awesome-server" 30 | ], 31 | "author": "darklightcode (https://github.com/darklightcode)", 32 | "license": "MIT", 33 | "bugs": { 34 | "url": "https://github.com/darklightcode/PHP-Built-in-web-server-Router/issues" 35 | }, 36 | "homepage": "https://github.com/darklightcode/PHP-Built-in-web-server-Router#readme" 37 | } 38 | -------------------------------------------------------------------------------- /src/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/darklightcode/PHP-Built-in-web-server-Router/9114d10c5661dcde0f53508c380fb0190cfc86cc/src/logo.png -------------------------------------------------------------------------------- /src/mimes.json: -------------------------------------------------------------------------------- 1 | {"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","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","air":"application\/vnd.adobe.air-application-installer-package+zip","ait":"application\/vnd.dvb.ait","ami":"application\/vnd.amiga.ami","apk":"application\/vnd.android.package-archive","appcache":"text\/cache-manifest","application":"application\/x-ms-application","apr":"application\/vnd.lotus-approach","arc":"application\/x-freearc","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","aw":"application\/applixware","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","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-netcdf","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-vm","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","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","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\/x-msdownload","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\/x-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","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","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","json":"application\/json","jsonml":"application\/jsonml+json","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","m4u":"video\/vnd.mpegurl","m4v":"video\/x-m4v","ma":"application\/mathematica","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\/vnd.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","mp2":"audio\/mpeg","mp21":"application\/mp21","mp2a":"audio\/mpeg","mp3":"audio\/mpeg","mp4":"video\/mp4","mp4a":"audio\/mp4","mp4s":"application\/mp4","mp4v":"video\/mp4","mpc":"application\/vnd.mophun.certificate","mpe":"video\/mpeg","mpeg":"video\/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","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":"application\/x-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\/x-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\/x-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":"application\/pls+xml","pml":"application\/vnd.ctc-posml","png":"image\/png","pnm":"image\/x-portable-anymap","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","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":"application\/x-font-ttf","ttf":"application\/x-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","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","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":"application\/font-woff","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","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","123":"application\/vnd.lotus-1-2-3"} -------------------------------------------------------------------------------- /src/php_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/darklightcode/PHP-Built-in-web-server-Router/9114d10c5661dcde0f53508c380fb0190cfc86cc/src/php_5.png -------------------------------------------------------------------------------- /src/php_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/darklightcode/PHP-Built-in-web-server-Router/9114d10c5661dcde0f53508c380fb0190cfc86cc/src/php_7.png -------------------------------------------------------------------------------- /src/router.class.php: -------------------------------------------------------------------------------- 1 | php_warning++; 81 | break; 82 | } 83 | 84 | }, E_ALL); 85 | 86 | /** 87 | * Fixed cross-os include path 88 | */ 89 | set_include_path(get_include_path() . (DIRECTORY_SEPARATOR == '/' ? ':' : ';') . $_SERVER['DOCUMENT_ROOT']); 90 | 91 | if (ini_get('auto_prepend_file') && !in_array(realpath(ini_get('auto_prepend_file')), get_included_files(), true)) { 92 | 93 | include(ini_get('auto_prepend_file')); 94 | 95 | } 96 | 97 | $this->refresh_paths(); 98 | $this->script_filename = $_SERVER['SCRIPT_FILENAME']; 99 | 100 | $this->request_uri = \filter_input(\INPUT_SERVER, 'REQUEST_URI', \FILTER_SANITIZE_ENCODED); 101 | $this->request_uri = $this->format_unix(urldecode($this->request_uri)); 102 | 103 | $this->physical_file = $this->format_unix($_SERVER['SCRIPT_FILENAME']); 104 | $this->extension = strrev(strstr(strrev($this->physical_file), '.', TRUE)); 105 | 106 | $this->last_modified = time(); 107 | $this->eTag = md5($this->last_modified); 108 | $this->file_length = 0; 109 | 110 | if (file_exists($this->physical_file)) { 111 | 112 | $this->last_modified = filemtime($this->physical_file); 113 | $this->eTag = md5_file($this->physical_file); 114 | $this->file_length = filesize($this->physical_file); 115 | 116 | } 117 | 118 | $this->if_modified_since = (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? $_SERVER['HTTP_IF_MODIFIED_SINCE'] : false); 119 | $this->eTagHeader = (isset($_SERVER['HTTP_IF_NONE_MATCH']) ? trim($_SERVER['HTTP_IF_NONE_MATCH']) : false); 120 | 121 | } 122 | 123 | /** 124 | * Format paths 125 | */ 126 | function refresh_paths() 127 | { 128 | 129 | $formatVarsToUnix = array('DOCUMENT_ROOT', 'SCRIPT_FILENAME', 'SCRIPT_NAME', 'PHP_SELF'); 130 | foreach ($formatVarsToUnix as $var) { 131 | if (isset($_SERVER[$var])) { 132 | $_SERVER[$var] = preg_replace('([/\\\]+)', '/', $_SERVER[$var]); 133 | } 134 | } 135 | 136 | } 137 | 138 | /** 139 | * This will add a favicon.ico to your page 140 | * Browsers will do a request for favicon.ico by default so if you don't have one you will see a 404 request 141 | * To prevent that the router will serve you a default icon to make peace with /favicon.ico request 142 | */ 143 | function favicon() 144 | { 145 | 146 | $favicons = array( 147 | "php_7" => array( 148 | "logo" => "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo2ZDc0YmRlZi1jNDhjLTc2NDQtYjA1My02MTQwOTk0NDcyOTMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RENGOEI5NjAxQzVDMTFFN0FDRTJFMzYxOUJBOEREMzMiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RENGOEI5NUYxQzVDMTFFN0FDRTJFMzYxOUJBOEREMzMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6ZDVjNmU2N2MtYmQ3NS1jOTRlLThmOWQtYjRmMzE1ZjQwMzIyIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjZkNzRiZGVmLWM0OGMtNzY0NC1iMDUzLTYxNDA5OTQ0NzI5MyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pjb6wE0AAAThSURBVHjatFdLbxtVFD7zdGI7aXBqA2loEtokVSmoqAUBQTxKERu6qVjACjbs+BdsEEsW/AuEUBe8iiKVQlQCiEJBeVCorKTxK3bi13jGnhnOuZ65Hk9mxjaIG51Yvr4z9zvfPec75wq2bcNBtZV+/6Nvt1p6Z0oUBfi/h26Y8N7bT1194kzmU9mZq6Mdok2N+jILHQB7uLWCIKDxr2365wLQ0PbR5kYFMJOZgFhMBtsKQOEhUxRFZFqD8oHmTpW8APjEKIO2nEjGIBlXwLSiaZAlEZqaAXZ3WcdxuA9Azv+QaVrdB4RwAO22CUZbBCsMAHIuYVyZYEG7Y7mzNbTKQADTD8QZ8ijf0tMJiI8r3VgIOAHTtOGw1mLvIIccXw4cEMEA3Lh6543zMDc7GRlkEgKkwApaQpvdL9Ths6+3QLC7YJxB9OuhAOiFBqZKraEzBoaK8LCU05F89FwURIwTy11Y5MHpWZvvSy8808ph6z/nvKa3u4yiWciA4NvLnwU85GRZhF838pg+AHbEETyYToKqSHyT+ROToCg9v2p1g72RHOpmitDHthdAGa2JlqAvKr5k424J7mwWItNweeE4JBMKoIrC6flpOHXymMd7E7b+LrNj7HQoo7gne0EASAmrLgBaSw8GxQC9iLxh/jgMxeMqrFyYBa+Ur9/ew2PUYHxMRvm1GAuOEgYy0HBYeDhSfHCzsZgCCdyQIGQwDekITs+nIDU1xtdVGwYUyw1cp7DoZ4BtcAEUggBYrjpFDQOF5+xiGt5960n2QkUWvfrOB6nj1deW4No3f8JuvuqIGjFACdlTXdn3XH4QAKKY0pM2jlznoCLPXUHyMX0kDQPVMOjFVYrsYUsvBidVQcZAf6wFMpAbhoFG00B12wRVleH5i4/ARELlv+/m67Bf0br6j95TdhDojsnrQMVh4d8BIGbJm08+34BFTLtLz87z35paB7668Rcy1GJA6U/GdJYJTE+EiuBR7pFjwM2EBBagN6+chZgq8fmf7uSg3tQxS+QjemH2GOgTFn8MFIYBQLQ+ff4ELC6k+FyxrMEf20UMTikQsAdALgoARWdkhJGYTCRVeP2Vpb75W7/sYr03j6Sk4BEu57e9KAC8Tod6j1Xy0nMLkE6N87m72UO4t3MQnJq4qwvAXweCAPBOJWiQns9kknB5ZaFvbv32LkQ108Sap2PKRwEwotSQup4rl5eZtrvjt80Sk1wpom8wHQCCrxcIAnBkgdfT2YeOweNn0nxuJ1eHmz9mWS2ISluL1QHGgO5VwaA0DNUC6g9KlQZ88PF3cGouBY9hPVj7eYd1umOx8fCm1JFhpxBVnTgbHYB7loX9BtzP1+DmepbRvvzodOglhOKCBKnTK0QVf5AHAcgP6u/dHsEOuPXQJwGlqtlEya6TYWkWWDZAhVR5EIDsKD0feUhGTayGAtVodDclsXK7IAJENyNVlbIeQQoF8AXaM2gvor2MdhHteFgnTI1rEY+FCpTRtlimCKxTIkYEHa9tv5+cmbxxbimziqx8f+361kAAlIq3HPvQ2fwC2ktoL6CdQ5vk2l2qe4/AkgRhG7+uoa0ikjW8M25T3Kyu3WO3YgmD2cTPKAD+Qd3Ll47RIBVaQXuVWEL66Ub9A9p1tilKAwkmvwIj5UZV5ykp+LT6HwEGAL2WVjwbkFaFAAAAAElFTkSuQmCC", 149 | "errors" => "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo2ZDc0YmRlZi1jNDhjLTc2NDQtYjA1My02MTQwOTk0NDcyOTMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NDg2QTc4OEIxQzZFMTFFNzg4RTBCQkVEQzU0ODcxOEYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NDg2QTc4OEExQzZFMTFFNzg4RTBCQkVEQzU0ODcxOEYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NGFkZGUzMjUtODgxMS0wZDRjLWI5NjYtYjYyNTFiMDg3ZjFmIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjZkNzRiZGVmLWM0OGMtNzY0NC1iMDUzLTYxNDA5OTQ0NzI5MyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pu7ooIQAAAVBSURBVHjatFdLbBtVFD1vZvyJYztuSRMllCRVS1yJBClKES1UhJZSJP4IqbBBqlQgC9iwZAdiU5C6YVFWqELsEEHlJ6gUEaho0kZ81A8gkkVDEKnjOLHj+DMzng/3jcfj33iSFPGkmzjPL++ee+69573HTNPE4lJ217sfXJpjjMUYw/8+irKGl54bfnnsYP+Hkj2XI1sni213M4MCgLm1tRQgagJc4T8qAIpkq2T92wXQ2xVBICDBNFxQ1LApCAIy2SLWMsXKVLIWAB+p7TrnLiPhAMIhH3TDmwZJFFAoqjDLyzQ74DoAicZ/0kWKzKMo+F6q6Icq+WC0AkAexZIKHQZKmlEhZYMsvSmAznQCoq65p5iVEXRTKkNB0RUAowW6FECmp48+Mei6UfkqY4NwB2BFTXZy4jT6luYADxZEvQRm1ue7NvpEfATn3z4H3m267oDk9CstATBarPiC2AjHIJGDLReEy5AjMeg+P5giU50YlVhWnOKsWbtc116CiHR013/v+egOmLQX7xJDd6hyfDV2gbNC0lVc23+I2DAoJULLsHvMAvzMsHLMR9/VS5Bkp9Ww0dljpZDXSE2nJNwArJEVyNr5H36q3D/2juL64CFP1uP9MasN5WA74j98gYGfv3e+V8IdmD/8OCRVgUbOeR3YKbjlBoArYbYCgG8uaSXLmhwTI7oolukihgwSmXAqgQc+PgNB05x1Pz0/jtX+ONoKWSiUf2MTBvI2Cz2etUbO25Q8wvl1GBRON1uBLxpGfOo8Yks3nXU5oj65bxjta0nooZBFPxchm4GkGwCjok5eQ/UFcM/8LF755B2rXTlDvN8rElcZofQKnn3rJL5+8yz+Hh2jFizYKbCaNuUGoKkT3IZAlG+Ed5Bj1XudXk6FTiqJeg2oMN3Uhq5q2LQx5TJLALY6ZFrLQXMVNOtrzZWBLQDQkW+L4vNjpxBQizj8yzcI59LVDfaPIEWFJ1BqDMlvCRHTdWhVGU7bLNweAF71mujDxGPjGFy4iqOXP6uKTsdOXHjjDDK9AxBK5dqQ5AJpimalgFXvAeZt10DlrGin1nrxq/fhV2Vn/tdnTiHbvRvBbLppfc1BlKxjtGHv5JbyGmjD/dcmse+v687c6kAcN46fgK9YcDuTagEkvADw6vQsb35GRHIZPDn1Ud38lRdehxqKgFGNNJ3aZlmGG1XQDYBzTreM3t+GR2Y+RedadZ+FA0dw876j8MkFt4ugA8A+ZjwZcG4qbqNEVX1ncgHHpiecOc0fxOyJ16pcu7HGT8KqDC97AVBbqiGPhGT4qe/OIag4XYTfKe/Ld98LSZFbsqbbABrvAm4AmhY4kVLr3XVrHsN/XnbmlroGcPHpV+s6wQW35dwss6PUqqBbG7bUAn4zSu3sxenxs9i7eANDc7OYHjmOXKgDdxglGB51wzXAPoiydp1tH4Cl54KE5c7d+Kd7D34cfYJUUUNcocKj+4DbI0Rg/D3ALBW0D6J0Y5G7AVj2uvhV7whc58ymVw+zbz9qSUehoCLHLa9a84QhTb+0zQAsbucWyiPkpqo6ioqGfL7sVKbPmlaOnAPiLyO/X1ysEaSWAL4lO0g2RnaE7AB/IrR6GqTXZays5pEnp2rJsN6KfJ4JnBGm0LPtt77e6MWhwa4pYmX6y8m5TQHwVrxi23u281Gyh8keIhsiizrancrVpsAQGZunP2fIpgjJDN2G55MEcGpmAQqxJEqC9ULyAtA4+O3lgm187CF7kOxRzhLRz1/Us2STllOAHxBOX5aIcjWrOC3JGh45/wowAJiJcJomgiWdAAAAAElFTkSuQmCC", 150 | ), 151 | "php_5" => array( 152 | "logo" => "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo2ZDc0YmRlZi1jNDhjLTc2NDQtYjA1My02MTQwOTk0NDcyOTMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RDdFRjkwRTIxQzVDMTFFNzk1OTFEOUVGQzMzQUNGNDUiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RDdFRjkwRTExQzVDMTFFNzk1OTFEOUVGQzMzQUNGNDUiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6ZDVjNmU2N2MtYmQ3NS1jOTRlLThmOWQtYjRmMzE1ZjQwMzIyIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjZkNzRiZGVmLWM0OGMtNzY0NC1iMDUzLTYxNDA5OTQ0NzI5MyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PqrPoewAAAUtSURBVHjatFfbbhtVFN1nxpc4FzdubkoKQSHFBCrxUp6KQKAKeAAJ8cATH4D4Aj4AId7hH3gCCakqlajUqNAKCYS4qJBQwqWlbWzXjmOPb2PPhb3OnBnPTMZOQsREu4rjM2evfVlr7wrXdWm/2Vt8/6Ovf+uZ1qymCfo/H3bH5rrvvXvhmdWVU7dS6u8GW5Nt9rgXOo575LNCBMF12Pbxiw+gy1ZjWz2Oc1z46EqeUrqGqGJfRj9qfLZW71DDMPGxEQeA5+GxUikvJcrPZCmT1g8CiD06H24YPVkCxlJXWYgAKMdfsmyHXJlikQjA4Uv7A1vVNhmA4B9d994fWI5/VRWvHwpgZXGGshmd3BEZ0DmU5YVpSqdGZICd2RwEN7mM3LFdP5SKfyQMYDf87sCy6a3XNmhjfeFEXY+6f3ZlmxzXIXvYsKUkAJEMAG3T6J+Ydt2eRZZybDuqBO5RAPA7zZZ5YgAm94irAICynv9kANV4/Yx2PwTIpUtXb8t6aqqpQK0l7gGPhkk0Jao3epRKaWT2bXVGQignAdhTepDzj7VCAODs5+0K7dypM+00rwmZBU+uz1OWaeiMYIGuaZTm84g+dOZhEoCGUsOcLzJhAHgKpyY4WuF1vQKA6HU2bQQAX9rBBjCFadlXoncAQIsNArHkR9zuDiKXLc1PSRDZbCqg4fRUZqwQmaYlz0JTyJMUw1fBOAA73AeoX4cBADkixPPmqxv0+sUiCXEwwlHP5Wu/U7na4Xtc5V86N5IARARC8MWgUM+0aWrSA4Bmgh3n6Q8cCRiB+NKAPwcBxM6Xwxno9S0pIP+Zgtz5Jt+Bu1ACkTBz4hkohbveYu3+YnOH8tPZkdNwbjYnS4QegNKtrxZorpBT0ds0GDgy8ShBkt7EAezGnXz51Z9hCZVdH8wCLtMG0zCT8ZoQw2aenQcAOAMyciHCJSiNA1CO1s+mN14u0lNnvXlQb3bpk89v8aWu7CYAgHOfBQA3NZkJ3kcJAR6YZRDicACR+uAlpPiJtdMBpT7NbFG/M5Aliq9aKAWmZwAAFOQvXFfIOSA8BBEA8SZEh1rhmbvX6A4Ps4Mca0CX6YkGs5W6IfXQ/FRKRAB0ewNvDPM/odWtMi4DdcXRgs8EozVUwzRT8J23z9PWTpVu/1Wjf3abEtCZpRlaXpymR5bzlJtIDwF0rWAIyUEkZEKq4wAYSpILgRx3onK8ws5gF59bozZ/hzOTuXQiS1ACoUqpMtBWQY4sQU8NpUDlavvdkWMZDTfO+T4voLjDmwOReTMyA5FGRMrvlwz64OMbtHomT8XH56i4NidTHldERIjR+6BiyHcqtTZLuSXP2R3IsBxEeyoLYwGU42JjcKp/2qrQD7+UaSKr08LcFAvOLJ0rLsrhdPdBk3YrLbkrgLp4BxRF9MLfhLxBUFUSMhZAKWml1lV3I5UldoYGvPn9PbkPgP+gJRxCE3zgmFNgDhTVTWDAkTKQtOUgrTpM7QNDp55jhyPGDGizXqCJsVdoHgUq8RU/CcDd4wwcP9WQXfAeDsEOTFE0n68B6KeJbPpvNOdhAC6xXWB7ke0ltvNspxNWfm+R5LW7x2Mbu0Pfsv3/+ciIORvGdC7949nHCptPFxc2q7XOd1eu/yHBjAMAzn2j7EO1IT2rwDzPdg4M9Dsf/TCsuTAZ2TZ/vMF2jX//lqfgPTTpnfsNng0274c6hTfY1BGyjJ64rAxPUQF5he0FTj+E4CbbVbbrbL+q7UpmCaxAPwQ9wj9hGvwrwADNQplMB/Y+jgAAAABJRU5ErkJggg==", 153 | "errors" => "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo2ZDc0YmRlZi1jNDhjLTc2NDQtYjA1My02MTQwOTk0NDcyOTMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MzEzMTQ3OTUxQzZFMTFFNzhDQTdEOEJDM0NDRTMwQUUiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MzEzMTQ3OTQxQzZFMTFFNzhDQTdEOEJDM0NDRTMwQUUiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NGFkZGUzMjUtODgxMS0wZDRjLWI5NjYtYjYyNTFiMDg3ZjFmIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjZkNzRiZGVmLWM0OGMtNzY0NC1iMDUzLTYxNDA5OTQ0NzI5MyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pt3XMmYAAAW5SURBVHjatFfbbxRVHP7OzOxO99LthZZbgWqLtLYEI4iJCgY18YlofDC+mOib0fjiqy8+GeI/IIkxJr6oD/JEUCNEQiIhQKKgiNKIlNaWtrTd7V7nPv7OmbOXmZ0tbYiz+SUzs2fO+c53fr/vO4f5vo+Z+eLWT05evMUY62UM//tlWq7//luHDxwY33pDk+9KFEWK3s125nn+htvSBCEnWKUo8Js6gBrFCsWezQzOO9y9MwdNVcCZDP8ZflSo7Uq+irWyyR/XogD4dX8zg/uiUyDXrSOZUNsBRC6VGq+VDMhmeclCCMBi9CNHS8BnSkcAHnVqaTr10hkA8z2otiXubcerE7PMP18fAFG2c3Eaum3A7wCAz2qH24MEBxDXil65iSQKQ48QQAbPbbRZqt+0ArjXuoC2lsTr33+K8X9+eaiMXxkew6kTX4vpupSwMgkXGrkRz4BP9Koodvc/dMnVevrhJHVRLa7n1bNzIY6B0BJ4BLWYfXgAZqYbvqrx6beWbCyA5ejHpUxTFjgjp198G4XcABTPlaUFbBvMyjKMS0AX+aFRaLYJkwbnbeQSLMYBWJV6kAo+BsrpnmYdE32/jT2Dv4f3I0kd1pNwbHQAekKD53txNQDVsZFwLTF7jxCwSMm3AliTapiql085nQuldF/xPjTXQcKxGgA0KjEVLpQOZahQez6qS0vAS5XEy5Ki1wagLAVim/iQAFRCAOiP5VkBQjdrEgCQXXGQ1OKWIHhhZnvg6zocAiBeMSH7hTgAbmseMOqxmuqGqyagurZ499rZz3H8/JchlVUUtq5cnvnwJBYnDxEDlbpSFKT3tAEICQRfgpqegaGnkKkGADSinscmzAJWKiMmw5egLg0UVpwOhLKTf8QH9zpI8cZKMCeCUQLzJWAxnhNloKlQxIBD9H937E3kyvkWe/NbJ4gtvWmoKhM54JJ3jF4+hy13b4n/+eztVJp7NjHgx+pNFEBTjmVW/XjkDbiKJgH4ogoglZ9XwfjoYOCG9LOJsYGZqSYAEiEn2RVdgoX1AITQWQkdr577Ao/fDvwgTyL01SsfCGbAXY4AJKtdEgB1ZtSQWW2kEQyqAG5G3A25D4A9GEBofVyS0C2FJTw2fT1YUz2Nb613aWY61XdYeLhtq5SgernYAqAXvhJYNfcBFvGBuCTkGeq0vljt2RoSlZRZRa0rCzOZEgA9CrsrLTRfMw3olSaAWq6ffEANVNBrt+I4BvKyRvvqclzKNv2AK+A733yEP0cOYurRJzC7axypIsPQzSns+OMqdv1+mZ5XQ05Y3zd6gRX7Uc+JAihJSQ4AUPtyRA13Lt4R8dKlU6hkesBohumWQVsvI9cnSHebDFTkJDsugSFNqUH5Su92suW+2AEylbXOg3f3orBjWDhn4AMhv+nIQCgROeVz20bw8XufYc/8FPbduU5xDUNL022KyHMhv2sE8xOHMTf5NJb27keVlkAj3+AawH+UhKuShXUBLEY3lSWy5evjz+HXiaPoog4HV+cxOnsDk1NX0JdSMfPkEdwbPyhmbKWzQvl4RSiOA0alKnZCgREth5SsA4CFti010ahaNVluDAuDuzG7fRQXDx/H2MgAtBSVpcUHtEkXyo0zAzcqhSzTod2wH1MBG2KgfZdDakgD8Y2Gqihit5P07YY0M3rn0YxNy0GFTKxctVCuWOJgQnqwxCJnvzgAM5s5npANiJlalouaEQxYoTDMIPn4LohXQIL2DF16YpoDexCA0xTPUhyjeIHiEEV/+2ZLbiTpuGUYDqo1G5bjNvZ9ijgHslI2lbi2d7jv/MS+wfPLK9WrP1y4/UAA/PB2ScYJuUN6SoI5SjHJK7AuMAtLLWvOmEnI/qLHnyl+ovsrVAH/0ukbd+fWYBBLiaQq2FoPQFxOnJHBr30SyMsUzxP95Ey4SHGW4gLFTbm7EixZtos67SJHIjnwnwADADQtpLEI+Gh8AAAAAElFTkSuQmCC", 154 | ) 155 | ); 156 | 157 | $last_segment = explode('/', $this->request_uri); 158 | $last_segment = $last_segment[count($last_segment) - 1]; 159 | 160 | if (($found_match = strstr($last_segment, '?', true)) !== FALSE) { 161 | 162 | $last_segment = $found_match; 163 | 164 | } 165 | 166 | $favicon_urls = array( 167 | "favicon.ico", 168 | "favicon.png", 169 | "apple-touch-icon-120x120-precomposed.png", 170 | "apple-touch-icon-precomposed.png", 171 | "apple-touch-icon.png" 172 | ); 173 | 174 | if (in_array(trim(strtolower($last_segment), '/'), $favicon_urls)) { 175 | 176 | $boom = explode('.', phpversion()); 177 | $version = $boom[0]; 178 | $errors = $this->php_notice + $this->php_warning; 179 | 180 | $icon = explode(',', $favicons['php_' . $version][$errors ? 'errors' : 'logo']); 181 | $icon = base64_decode($icon[1]); 182 | 183 | header('Content-Type: image/png'); 184 | header('Pragma: no-cache'); 185 | header("Cache-Control: no-cache, must-revalidate"); 186 | header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); 187 | header('Content-Length: ' . strlen($icon)); 188 | echo $icon; 189 | exit; 190 | 191 | } 192 | 193 | } 194 | 195 | /** 196 | * Output info to Terminal 197 | * This won't work if it's being loaded through NODE.JS 198 | */ 199 | function log_output() 200 | { 201 | 202 | if ($this->log_enable) { 203 | 204 | $host_port = $_SERVER["REMOTE_ADDR"] . ":" . $_SERVER["REMOTE_PORT"]; 205 | 206 | $date = new DateTime(); 207 | 208 | $is_ajax = (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest') ? "[XHR]" : ""; 209 | $method = isset($_SERVER['REQUEST_METHOD']) ? "[" . strtoupper($_SERVER['REQUEST_METHOD']) . "]" : ""; 210 | 211 | $this->console(sprintf("[%s] %s %s%s: %s", $date->format(DateTime::RFC2822), $host_port, $method, $is_ajax, urldecode($this->request_uri))); 212 | 213 | } 214 | 215 | } 216 | 217 | /** 218 | * Retrieve the mime type of a file 219 | * @param string $filename 220 | * @return mixed|string 221 | */ 222 | private function get_mime_type($filename = "") 223 | { 224 | 225 | $mime_type_db = $this->retrieve_mime_types(); 226 | 227 | if (strlen($filename) == 0) { 228 | 229 | $mime_type = isset($mime_type_db[$this->extension]) ? $mime_type_db[$this->extension] : mime_content_type($this->physical_file); 230 | 231 | } else { 232 | 233 | $extension = strrev(strstr(strrev($filename), '.', TRUE)); 234 | $mime_type = isset($mime_type_db[$extension]) ? $mime_type_db[$extension] : mime_content_type($filename); 235 | 236 | } 237 | 238 | 239 | return $mime_type; 240 | 241 | } 242 | 243 | /** 244 | * Serve CACHED | RAW Files 245 | */ 246 | function process_request() 247 | { 248 | 249 | $uri_path = $this->URI_no_query(); 250 | 251 | if (!file_exists($_SERVER['DOCUMENT_ROOT'] . '/' . urldecode(substr($uri_path, 1)))) { 252 | 253 | $this->favicon(); 254 | 255 | header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found'); 256 | $this->http_status = 404; 257 | 258 | } else { 259 | 260 | header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $this->last_modified) . ' GMT'); 261 | header('ETag: ' . $this->eTag); 262 | header('Cache-Control: public'); 263 | 264 | /** 265 | * Always set Content-Type and Content-Length 266 | * Pipes and Proxies will need them 267 | */ 268 | $mime_type = $this->get_mime_type(); 269 | header('Content-Type: ' . $mime_type); 270 | header('Content-Length: ' . $this->file_length); 271 | 272 | if (@strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $this->last_modified || $this->eTagHeader == $this->eTag) { 273 | 274 | header($_SERVER['SERVER_PROTOCOL'] . ' 304 Not Modified'); 275 | $this->http_status = 304; 276 | 277 | } else { 278 | 279 | @readfile($this->physical_file); 280 | 281 | exit; 282 | 283 | } 284 | 285 | } 286 | 287 | exit; 288 | 289 | } 290 | 291 | /** 292 | * Get Extension 293 | * @param string $str 294 | * @return string 295 | */ 296 | private function getExt($str = "") 297 | { 298 | 299 | $str = strtolower(trim($str)); 300 | if (($no_q = strstr($str, '?', true)) !== FALSE) { 301 | $str = $no_q; 302 | } 303 | 304 | return strstr($str, '.') === FALSE ? "" : strrev(strstr(strrev($str), '.', true)); 305 | 306 | 307 | } 308 | 309 | /** 310 | * Format to UNIX path 311 | * @param string $str 312 | * @return mixed 313 | */ 314 | private function format_unix($str = "") 315 | { 316 | return preg_replace('([/\\\]+)', '/', $str); 317 | } 318 | 319 | private function format_path_dir($str = "") 320 | { 321 | 322 | $str = $this->format_unix(trim($str)); 323 | 324 | if (trim($str) == '/' || strlen($str) == 0) { 325 | return '/'; 326 | } 327 | 328 | if (!strlen($this->getExt($str))) { 329 | 330 | /** 331 | * A path without extension or with / must be checked if it is a valid directory 332 | */ 333 | if (is_dir($this->format_unix($_SERVER['DOCUMENT_ROOT'] . '/' . $str . '/')) || is_dir($this->format_unix($str))) { 334 | 335 | $str = $str . '/'; 336 | 337 | } else { 338 | 339 | $str = dirname($str) . '/'; 340 | 341 | } 342 | 343 | } else { 344 | 345 | $str = dirname($str) . '/'; 346 | 347 | } 348 | 349 | $str = $this->format_unix('/' . $str); 350 | $drf = $this->format_unix(strtolower($_SERVER['DOCUMENT_ROOT'])); 351 | 352 | if (DIRECTORY_SEPARATOR != '/' && substr(strtolower($str), 1, strlen($drf)) == $drf) { 353 | 354 | $str = ltrim($str, '/'); 355 | 356 | } 357 | 358 | return $str; 359 | 360 | } 361 | 362 | /** 363 | * Serve your application 364 | */ 365 | function bootstrap() 366 | { 367 | 368 | chdir($_SERVER['DOCUMENT_ROOT']); 369 | 370 | $uri_path = $this->URI_no_query(); 371 | $uri_filepath = $_SERVER['DOCUMENT_ROOT'] . '/' . urldecode(substr($uri_path, 1)); 372 | 373 | $load_index = $_SERVER['DOCUMENT_ROOT'] . "/" . $this->indexPath; 374 | $load_index = $this->format_unix(trim($load_index)); 375 | 376 | 377 | $_SERVER['SCRIPT_NAME'] = $this->format_unix(DIRECTORY_SEPARATOR . $this->indexPath); 378 | $_SERVER['PHP_SELF'] = $this->format_unix($uri_path); 379 | 380 | $_SERVER['SCRIPT_FILENAME'] = $this->format_unix($_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR . $this->indexPath); 381 | 382 | if (!file_exists($load_index)) { 383 | 384 | $not_found_message = "Your script file doesn't exist at " . $load_index; 385 | 386 | $this->console($not_found_message); 387 | exit($not_found_message); 388 | 389 | } else { 390 | 391 | if (file_exists($uri_filepath) && !is_dir($uri_filepath)) { 392 | 393 | $this->process_request(); 394 | 395 | exit(); 396 | 397 | } else { 398 | 399 | $this->favicon(); 400 | 401 | if (in_array($this->getExt($this->script_filename), array("", "php"))) { 402 | 403 | return include($_SERVER['DOCUMENT_ROOT'] . '/' . $this->indexPath); 404 | 405 | } else { 406 | 407 | return include($this->script_filename); 408 | 409 | } 410 | 411 | } 412 | 413 | } 414 | 415 | } 416 | 417 | /** 418 | * Remove query from REQUEST_URI if it has one 419 | * @return string 420 | */ 421 | private function URI_no_query() 422 | { 423 | $filename = $this->request_uri; 424 | 425 | if (($found = strstr($this->request_uri, "?", TRUE)) != FALSE) { 426 | 427 | $filename = $found; 428 | 429 | } 430 | 431 | return $filename; 432 | 433 | } 434 | 435 | /** 436 | * Retrieve the first encounter of a filename in REQUEST_URI 437 | * e.g something/edit.php/id?and=query = something/edit.php 438 | */ 439 | private function URI_Filename() 440 | { 441 | 442 | $uri_split = explode('/', substr($this->URI_no_query(), 1)); 443 | 444 | if ($total = count($uri_split)) { 445 | 446 | foreach ($uri_split as $current_key => $segment) { 447 | 448 | if (strstr($segment, '.', TRUE) !== FALSE) { 449 | 450 | for ($i = $current_key + 1; $i < $total; $i++) { 451 | 452 | unset($uri_split[$i]); 453 | 454 | } 455 | 456 | return implode('/', $uri_split); 457 | 458 | } 459 | 460 | } 461 | 462 | } 463 | 464 | return FALSE; 465 | 466 | } 467 | 468 | /** 469 | * Check if the requested URI is a PHP script 470 | * @return bool 471 | */ 472 | private function URIhasPHP() 473 | { 474 | 475 | return strrev(strstr(strrev(strtolower($this->URI_Filename())), '.', TRUE)) == 'php' ? TRUE : FALSE; 476 | 477 | } 478 | 479 | public function is_root_script() 480 | { 481 | 482 | if ( 483 | $this->format_unix($_SERVER['SCRIPT_FILENAME']) === $this->format_unix($_SERVER['DOCUMENT_ROOT'] . '/' . $this->indexPath) 484 | && $this->getExt($this->indexPath) == 'php' 485 | ) { 486 | 487 | return TRUE; 488 | 489 | } 490 | 491 | return FALSE; 492 | 493 | } 494 | 495 | private function __is_static_file() 496 | { 497 | 498 | return $this->getExt(strtolower($_SERVER['SCRIPT_FILENAME'])) != 'php'; 499 | 500 | } 501 | 502 | private function __url_add_trailing_slash() 503 | { 504 | $_SERVER['REQUEST_URI'] = $_SERVER['REQUEST_URI'] . '/'; 505 | } 506 | 507 | private function __im_not_a_method_trust_me() 508 | { 509 | return substr($_SERVER['REQUEST_URI'], -1, 1) !== '/' && !strlen($this->getExt(trim(urldecode($_SERVER['REQUEST_URI'])))); 510 | } 511 | 512 | private function fix_url_rewrite() 513 | { 514 | 515 | if ($this->__im_not_a_method_trust_me()) { 516 | 517 | if ( 518 | !isset($_SERVER['PHP_INFO']) 519 | || 520 | $this->__is_static_file() 521 | ) { 522 | 523 | $this->__url_add_trailing_slash(); 524 | 525 | /** 526 | * Force redirect on HTML, HTM files 527 | */ 528 | if ($this->__is_static_file()) { 529 | 530 | header("Location: " . $_SERVER['REQUEST_URI']); 531 | exit; 532 | 533 | } 534 | 535 | } 536 | 537 | } else { 538 | 539 | /** 540 | * Make sure we have a Content-Length 541 | * for static files after redirect. 542 | */ 543 | if ($this->__is_static_file()) { 544 | 545 | header("Content-Length: " . $this->file_length); 546 | 547 | } 548 | 549 | } 550 | 551 | } 552 | 553 | /** 554 | * Adjust some $_SERVER variables 555 | */ 556 | function fix_path_info() 557 | { 558 | 559 | $url = $_SERVER['REQUEST_URI']; 560 | 561 | if (($url_no_q = strstr($url, '?', true)) !== FALSE) { 562 | $url = $url_no_q; 563 | } 564 | 565 | $path_info = isset($_SERVER['PHP_INFO']) ? $_SERVER['PHP_INFO'] : '/'; 566 | 567 | if (($dot = strstr($url, '.')) !== FALSE) { 568 | 569 | if (($ext = strstr($dot, '/', TRUE)) !== FALSE) { 570 | 571 | $explode = explode('/', $dot); 572 | $path_info = '/' . $explode[1]; 573 | 574 | } 575 | 576 | } else { 577 | 578 | if (substr($path_info, -1, 1) != '/') { 579 | $path_info = $path_info . '/'; 580 | } 581 | 582 | } 583 | 584 | /** 585 | * Correct HTTP_CACHE_CONTROL 586 | * Problem: 587 | * Encountered during development containing a value of "max-age" 588 | * It seems to be a malformed version of HTTP_CACHE_CONTROL , HTTP_............L 589 | * It would appear and disappear on random requests switching with HTTP_CACHE_CONTROL, 590 | * yet both would contain "max-age" 591 | * Logic: Since both HTTP_CACHE_CONTROL and HTTP_L switch places on random request and HTTP_L is an invalid header 592 | * we can detect if HTTP_CACHE_CONTROL was about to be created by checking for HTTP_L 593 | * Solution: Check for HTTP_L and assign the value to HTTP_CACHE_CONTROL 594 | */ 595 | if (isset($_SERVER['HTTP_L'])) { 596 | $_SERVER['HTTP_CACHE_CONTROL'] = $_SERVER['HTTP_L']; 597 | unset($_SERVER['HTTP_L']); 598 | } 599 | 600 | 601 | /** 602 | * Correct URL's by adding a trailing slash for independent folders 603 | * These folders don't require $_SERVER['DOCUMENT_ROOT'] .'/'. $this->indexPath 604 | * and may have their own index file. 605 | * e.g. : /my-custom-folder -> /my-custom-folder/ 606 | * 607 | * Problems: 608 | * - incorrect output of relative links 609 | * - incorrect process of certain pages 610 | * Logic: Check if the processed file is different from $_SERVER['DOCUMENT_ROOT'] .'/'. $this->indexPath to determine if your app is loading or something else. 611 | * Solution: Append a trailing slash to $_SERVER['REQUEST_URI'] and pass it to the web-server 612 | */ 613 | if (!$this->is_root_script()) { 614 | 615 | $this->fix_url_rewrite(); 616 | 617 | return FALSE; 618 | 619 | } 620 | 621 | /** 622 | * Keep original PHP_SELF 623 | * ORIG_PHP_SELF - 624 | */ 625 | if (!isset($_SERVER['ORIG_PHP_SELF'])) { 626 | $_SERVER['ORIG_PHP_SELF'] = $_SERVER['PHP_SELF']; 627 | } 628 | /** 629 | * Create ORIG_PATH_INFO variable 630 | */ 631 | if (!isset($_SERVER['ORIG_PHP_SELF'])) { 632 | $_SERVER['ORIG_PATH_INFO'] = ""; 633 | } 634 | $_SERVER['ORIG_PATH_INFO'] = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : ""; 635 | 636 | /** 637 | * Drupal 8 - NPAS: 638 | * - upload files - ok 639 | * - update.php - ok 640 | * - install themes - ok 641 | * Codeigniter - NPAS - ok 642 | * Wordpress NPAS - install | custom links | upload | page not found - ok 643 | */ 644 | if (isset($_SERVER['PHP_INFO'])) { 645 | 646 | $_SERVER['PATH_INFO'] = $path_info; 647 | 648 | } else { 649 | 650 | /** 651 | * Drupal 7 - default: 652 | * - /user must show /user/ page - fix 653 | * Slim 3 - will enable if DRUPAL_ROOT is not found in your index.php 654 | */ 655 | $readFile = fopen($_SERVER['DOCUMENT_ROOT'] . '/' . $this->indexPath, "r"); 656 | $isDrupal = false; 657 | if ($readFile) { 658 | while (!feof($readFile) && $isDrupal == false) { 659 | $buffer = fread($readFile, 4096); 660 | if (strstr($buffer, 'DRUPAL_ROOT') !== FALSE) { 661 | $isDrupal = true; 662 | } 663 | } 664 | fclose($readFile); 665 | } 666 | 667 | if ($isDrupal) { 668 | $this->fix_url_rewrite(); 669 | } 670 | 671 | } 672 | 673 | $_SERVER['PHP_SELF'] = $_SERVER['SCRIPT_NAME'] . (isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : ""); 674 | 675 | if (substr($_SERVER['PHP_SELF'], -1, 1) == '/') { 676 | $_SERVER['PHP_SELF'] = substr($_SERVER['PHP_SELF'], 0, -1); 677 | } 678 | 679 | } 680 | 681 | 682 | /** 683 | * Autodetect index 684 | */ 685 | function autoDetectIndex() 686 | { 687 | 688 | $indexRoot = $_SERVER["DOCUMENT_ROOT"] . '/' . $this->indexPath; 689 | 690 | if (!file_exists($indexRoot)) { 691 | 692 | $viableFilesForIndex = array('index.php', 'index.phtml', 'index.html', 'index.htm', 'index.html5', 'index.php5'); 693 | 694 | $scanRoot = scandir($_SERVER["DOCUMENT_ROOT"]); 695 | $scanRoot = array_filter($scanRoot, function ($k) use ($viableFilesForIndex) { 696 | return in_array(strtolower($k), $viableFilesForIndex); 697 | }); 698 | $scanRoot = array_values($scanRoot); 699 | 700 | if (count($scanRoot)) { 701 | 702 | $this->indexPath = $scanRoot[0]; 703 | 704 | } 705 | 706 | } 707 | 708 | 709 | } 710 | 711 | 712 | /** 713 | * Listen for requests 714 | * @return bool|mixed 715 | */ 716 | function listen() 717 | { 718 | 719 | $this->fix_path_info(); 720 | $this->init(); 721 | $this->log_output(); 722 | 723 | $falsy_ext = $this->getExt($this->URI_no_query()); 724 | 725 | $this->autoDetectIndex(); 726 | 727 | if (in_array($falsy_ext, array("", "php"))) { 728 | 729 | /** 730 | * Drupal file uploads 731 | */ 732 | 733 | if ($this->URIhasPHP()) { 734 | 735 | return FALSE; 736 | 737 | } else { 738 | 739 | /** 740 | * Wordpress wp-admin 741 | */ 742 | 743 | if ($this->getExt($this->URI_no_query()) == "") { 744 | 745 | return FALSE; 746 | 747 | } 748 | 749 | } 750 | 751 | } else { 752 | 753 | if (strlen(trim($falsy_ext))) { 754 | 755 | if (($e = strstr($falsy_ext, '/', TRUE)) !== FALSE) { 756 | $falsy_ext = $e; 757 | } 758 | 759 | if ($falsy_ext == 'php') { 760 | 761 | return FALSE; 762 | 763 | } 764 | 765 | } 766 | 767 | } 768 | 769 | return $this->bootstrap(); 770 | 771 | } 772 | 773 | /** 774 | * This is for development purpose 775 | * You can output to console anything you want 776 | */ 777 | function console() 778 | { 779 | 780 | $args = func_get_args(); 781 | 782 | if (count($args) > 0) { 783 | 784 | foreach ($args as $arg) { 785 | 786 | ob_start(); 787 | print_r($arg); 788 | $output = ob_get_contents(); 789 | ob_end_clean(); 790 | file_put_contents("php://stdout", $output . PHP_EOL); 791 | 792 | } 793 | 794 | } 795 | 796 | } 797 | 798 | /** 799 | * Load mime types 800 | * @return array|mixed|object 801 | */ 802 | private function retrieve_mime_types() 803 | { 804 | 805 | $mimes_file = dirname(__FILE__) . '/mimes.json'; 806 | 807 | if (!file_exists($mimes_file)) { 808 | 809 | $this->create_mime_file(); 810 | 811 | } 812 | 813 | return json_decode(file_get_contents($mimes_file), true); 814 | 815 | } 816 | 817 | /** 818 | * Download and create a mimes.json if you don't have one 819 | */ 820 | private function create_mime_file() 821 | { 822 | 823 | $s = array(); 824 | foreach (@explode("\n", @file_get_contents("http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types")) as $x) { 825 | 826 | if (isset($x[0]) && $x[0] !== '#' && preg_match_all('#([^\s]+)#', $x, $out) && isset($out[1]) && ($c = count($out[1])) > 1) { 827 | for ($i = 1; $i < $c; $i++) { 828 | $s[] = '   \'' . $out[1][$i] . '\' => \'' . $out[1][0] . '\''; 829 | } 830 | } 831 | } 832 | 833 | $tmp_arr = array(); 834 | 835 | foreach ($s as $k => $v) { 836 | 837 | $uri_path = explode('=>', $v); 838 | $new_key = trim(preg_replace('/\s+/', '', str_replace(array(" '", "'", " ", " ", " ", ' '), "", $uri_path[0]))); 839 | $new_val = trim(str_replace(array(" '", "'"), "", $uri_path[1])); 840 | 841 | $tmp_arr[$new_key] = $new_val; 842 | 843 | } 844 | ksort($tmp_arr); 845 | 846 | fwrite(fopen(dirname(__FILE__) . '/mimes.json', 'w+'), json_encode($tmp_arr)); 847 | 848 | } 849 | 850 | } 851 | -------------------------------------------------------------------------------- /src/router.php: -------------------------------------------------------------------------------- 1 | log_enable = FALSE; 17 | 18 | /************************************************ 19 | * Change this if your "index.php" has another name. 20 | ***********************************************/ 21 | //$php_web_server->indexPath = "my_new_index_file.php"; 22 | 23 | /************************************************ 24 | * Listen for requests 25 | ***********************************************/ 26 | return $php_web_server->listen(); 27 | 28 | -------------------------------------------------------------------------------- /src/startServer.bat: -------------------------------------------------------------------------------- 1 | start http://localhost:9876/ && php -d max_execution_time=180 -S 0.0.0.0:9876 -t .. ./router.php -------------------------------------------------------------------------------- /test/routerPath.js: -------------------------------------------------------------------------------- 1 | let router = require('../index'); 2 | 3 | console.log('Router path: ', router.path); 4 | console.log('Router library: ', router.lib); 5 | console.log('cURL certificate: ', router.cert); --------------------------------------------------------------------------------