├── .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 | 
5 | 
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);
--------------------------------------------------------------------------------