Merge pull request #3 from mikecao/master

update
pull/27/head
kafene 12 years ago
commit 293a1e88ed

@ -46,7 +46,7 @@ class Request {
'base' => str_replace('\\', '/', dirname(getenv('SCRIPT_NAME'))),
'method' => getenv('REQUEST_METHOD') ?: 'GET',
'referrer' => getenv('HTTP_REFERER') ?: '',
'ip' => getenv('REMOTE_ADDR'),
'ip' => getenv('REMOTE_ADDR') ?: '',
'ajax' => getenv('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest',
'scheme' => getenv('SERVER_PROTOCOL') ?: 'HTTP/1.1',
'user_agent' => getenv('HTTP_USER_AGENT') ?: '',
@ -58,8 +58,8 @@ class Request {
'cookies' => new Collection($_COOKIE),
'files' => new Collection($_FILES),
'secure' => getenv('HTTPS') && getenv('HTTPS') != 'off',
'accept' => getenv('HTTP_ACCEPT'),
'proxy' => $this->getProxyIpAddress()
'accept' => getenv('HTTP_ACCEPT') ?: '',
'proxy_ip' => $this->getProxyIpAddress()
);
}
@ -84,7 +84,7 @@ class Request {
$this->url = '/';
}
else {
$_GET = self::parseQuery($this->url);
$_GET += self::parseQuery($this->url);
$this->query->setData($_GET);
}
@ -121,16 +121,19 @@ class Request {
'HTTP_FORWARDED_FOR',
'HTTP_FORWARDED'
);
$flags = \FILTER_FLAG_NO_PRIV_RANGE | \FILTER_FLAG_NO_RES_RANGE;
foreach ($forwarded as $key) {
if (array_key_exists($key, $_SERVER)) {
sscanf($_SERVER[$key], '%[^,]', $ip);
if(filter_var($ip, FILTER_VALIDATE_IP, $flags) !== false) {
if (filter_var($ip, \FILTER_VALIDATE_IP, $flags) !== false) {
return $ip;
}
}
}
return '';
}
}
?>

@ -35,6 +35,13 @@ class Router {
*/
public $params = array();
/**
* Matching regular expression.
*
* @var string
*/
public $regex = null;
/**
* Gets mapped routes.
*
@ -71,7 +78,7 @@ class Router {
}
/**
* Tries to match a requst to a route. Also parses named parameters in the url.
* Tries to match a request to a route. Also parses named parameters in the url.
*
* @param string $pattern URL pattern
* @param string $url Requested URL
@ -79,34 +86,43 @@ class Router {
*/
public function match($pattern, $url) {
$ids = array();
$char = substr($pattern, -1);
$pattern = str_replace(')', ')?', $pattern);
// Build the regex for matching
$regex = '/^'.implode('\/', array_map(
function($str) use (&$ids){
if ($str == '*') {
$str = '(.*)';
}
else if ($str != null && $str{0} == '@') {
if (preg_match('/@(\w+)(\:([^\/|\(]*))?([\(|\)]+)?/', $str, $matches)) {
$ids[$matches[1]] = null;
return '(?P<'.$matches[1].'>'
.(!empty($matches[3]) ? $matches[3] : '[^(\/|\?)]+')
.')'
.(!empty($matches[4]) ? str_replace(')',')?',$matches[4]) : '');
}
$regex = preg_replace_callback(
'#@([\w]+)(:([^/\(\)]*))?#',
function($matches) use (&$ids) {
$ids[$matches[1]] = null;
if (isset($matches[3])) {
return '(?P<'.$matches[1].'>'.$matches[3].')';
}
return $str;
return '(?P<'.$matches[1].'>[^/\?]+)';
},
explode('/', $pattern)
)).'\/?(?:\?.*)?$/i';
$pattern
);
// Fix trailing slash
if ($char === '/') {
$regex .= '?';
}
// Replace wildcard
else if ($char === '*') {
$regex = str_replace('*', '.+?', $pattern);
}
// Allow trailing slash
else {
$regex .= '/?';
}
// Attempt to match route and named parameters
if (preg_match($regex, $url, $matches)) {
if (preg_match('#^'.$regex.'(?:\?.*)?$#i', $url, $matches)) {
foreach ($ids as $k => $v) {
$this->params[$k] = (array_key_exists($k, $matches)) ? urldecode($matches[$k]) : null;
}
$this->matched = $pattern;
$this->regex = $regex;
return true;
}
@ -122,6 +138,7 @@ class Router {
*/
public function route(Request $request) {
$this->matched = null;
$this->regex = null;
$this->params = array();
$routes = isset($this->routes[$request->method]) ? $this->routes[$request->method] : array();

@ -146,7 +146,10 @@ class View {
* @return string Template file location
*/
public function getTemplate($file) {
return $this->path.'/'.basename($file, '.php').'.php';
if ((substr($file, -4) != '.php')) {
$file .= '.php';
}
return $this->path.'/'.$file;
}
/**

@ -6,7 +6,7 @@
* @license http://www.opensource.org/licenses/mit-license.php
*/
require_once 'PHPUnit.php';
require_once 'PHPUnit/Autoload.php';
require_once __DIR__.'/../flight/Flight.php';
class AutoloadTest extends PHPUnit_Framework_TestCase

@ -6,7 +6,7 @@
* @license http://www.opensource.org/licenses/mit-license.php
*/
require_once 'PHPUnit.php';
require_once 'PHPUnit/Autoload.php';
require_once __DIR__.'/../flight/core/Dispatcher.php';
require_once __DIR__.'/classes/Hello.php';

@ -6,7 +6,7 @@
* @license http://www.opensource.org/licenses/mit-license.php
*/
require_once 'PHPUnit.php';
require_once 'PHPUnit/Autoload.php';
require_once __DIR__.'/../flight/Flight.php';
class FilterTest extends PHPUnit_Framework_TestCase

@ -6,7 +6,7 @@
* @license http://www.opensource.org/licenses/mit-license.php
*/
require_once 'PHPUnit.php';
require_once 'PHPUnit/Autoload.php';
require_once __DIR__.'/../flight/core/Loader.php';
class LoaderTest extends PHPUnit_Framework_TestCase

@ -6,7 +6,7 @@
* @license http://www.opensource.org/licenses/mit-license.php
*/
require_once 'PHPUnit.php';
require_once 'PHPUnit/Autoload.php';
require_once __DIR__.'/../flight/Flight.php';
require_once __DIR__.'/classes/Hello.php';

@ -6,7 +6,7 @@
* @license http://www.opensource.org/licenses/mit-license.php
*/
require_once 'PHPUnit.php';
require_once 'PHPUnit/Autoload.php';
require_once __DIR__.'/../flight/Flight.php';
class RegisterTest extends PHPUnit_Framework_TestCase

@ -6,7 +6,7 @@
* @license http://www.opensource.org/licenses/mit-license.php
*/
require_once 'PHPUnit.php';
require_once 'PHPUnit/Autoload.php';
require_once __DIR__.'/../flight/Flight.php';
class RenderTest extends PHPUnit_Framework_TestCase
@ -26,7 +26,7 @@ class RenderTest extends PHPUnit_Framework_TestCase
// Renders a view into a layout
function testRenderLayout(){
Flight::render('hello', array('name' => 'Bob'), 'content');
Flight::render('layout');
Flight::render('layouts/layout');
$this->expectOutputString('<html>Hello, Bob!</html>');
}

@ -0,0 +1,80 @@
<?php
/**
* Flight: An extensible micro-framework.
*
* @copyright Copyright (c) 2012, Mike Cao <mike@mikecao.com>
* @license http://www.opensource.org/licenses/mit-license.php
*/
require_once 'PHPUnit/Autoload.php';
require_once __DIR__.'/../flight/net/Request.php';
class RequestTest extends PHPUnit_Framework_TestCase
{
private $request;
function setUp() {
putenv('REQUEST_URI=/');
putenv('REQUEST_METHOD=GET');
putenv('HTTP_X_REQUESTED_WITH=XMLHttpRequest');
putenv('REQUEST_URI=/');
putenv('REMOTE_ADDR=8.8.8.8');
putenv('HTTPS=on');
$_SERVER['HTTP_X_FORWARDED_FOR'] = '32.32.32.32';
$this->request = new \flight\net\Request();
}
function testDefaults() {
$this->assertEquals('/', $this->request->url);
$this->assertEquals('', $this->request->base);
$this->assertEquals('GET', $this->request->method);
$this->assertEquals('', $this->request->referrer);
$this->assertEquals(true, $this->request->ajax);
$this->assertEquals('HTTP/1.1', $this->request->scheme);
$this->assertEquals('', $this->request->type);
$this->assertEquals(0, $this->request->length);
$this->assertEquals(true, $this->request->secure);
$this->assertEquals('', $this->request->accept);
}
function testIpAddress() {
$this->assertEquals('8.8.8.8', $this->request->ip);
$this->assertEquals('32.32.32.32', $this->request->proxy_ip);
}
function testSubdirectory() {
putenv('SCRIPT_NAME=/subdir/index.php');
$request = new \flight\net\Request();
$this->assertEquals('/subdir', $request->base);
}
function testQueryParameters() {
putenv('REQUEST_URI=/page?id=1&name=bob');
$request = new \flight\net\Request();
$this->assertEquals('/page?id=1&name=bob', $request->url);
$this->assertEquals(1, $request->query->id);
$this->assertEquals('bob', $request->query->name);
}
function testCollections() {
putenv('REQUEST_URI=/page?id=1');
$_GET['q'] = 1;
$_POST['q'] = 1;
$_COOKIE['q'] = 1;
$_FILES['q'] = 1;
$request = new \flight\net\Request();
$this->assertEquals(1, $request->query->q);
$this->assertEquals(1, $request->query->id);
$this->assertEquals(1, $request->data->q);
$this->assertEquals(1, $request->cookies->q);
$this->assertEquals(1, $request->files->q);
}
}

@ -6,7 +6,7 @@
* @license http://www.opensource.org/licenses/mit-license.php
*/
require_once 'PHPUnit.php';
require_once 'PHPUnit/Autoload.php';
require_once __DIR__.'/../flight/net/Router.php';
require_once __DIR__.'/../flight/net/Request.php';
@ -23,11 +23,15 @@ class RouterTest extends PHPUnit_Framework_TestCase
private $request;
function setUp(){
Flight::init();
$this->router = new \flight\net\Router();
$this->request = new \flight\net\Request();
}
// Simple output
function ok(){
echo 'OK';
}
// Checks if a route was matched
function check($str = 'OK'){
$callback = $this->router->route($this->request);
@ -42,7 +46,7 @@ class RouterTest extends PHPUnit_Framework_TestCase
// Default route
function testDefaultRoute(){
$this->router->map('/', 'ok');
$this->router->map('/', array($this, 'ok'));
$this->request->url = '/';
$this->check();
@ -50,7 +54,7 @@ class RouterTest extends PHPUnit_Framework_TestCase
// Simple path
function testPathRoute() {
$this->router->map('/path', 'ok');
$this->router->map('/path', array($this, 'ok'));
$this->request->url = '/path';
$this->check();
@ -58,7 +62,7 @@ class RouterTest extends PHPUnit_Framework_TestCase
// POST route
function testPostRoute(){
$this->router->map('POST /', 'ok');
$this->router->map('POST /', array($this, 'ok'));
$this->request->url = '/';
$this->request->method = 'POST';
@ -67,7 +71,7 @@ class RouterTest extends PHPUnit_Framework_TestCase
// Either GET or POST route
function testGetPostRoute(){
$this->router->map('GET|POST /', 'ok');
$this->router->map('GET|POST /', array($this, 'ok'));
$this->request->url = '/';
$this->request->method = 'GET';
@ -76,7 +80,7 @@ class RouterTest extends PHPUnit_Framework_TestCase
// Test regular expression matching
function testRegEx(){
$this->router->map('/num/[0-9]+', 'ok');
$this->router->map('/num/[0-9]+', array($this, 'ok'));
$this->request->url = '/num/1234';
$this->check();
@ -114,15 +118,33 @@ class RouterTest extends PHPUnit_Framework_TestCase
$this->check('2000,,');
}
// Regex in optional parameters
function testRegexOptionalParameters(){
$this->router->map('/@controller/@method(/@id:[0-9]+)', function($controller, $method, $id){
echo "$controller,$method,$id";
});
$this->request->url = '/user/delete/123';
$this->check('user,delete,123');
}
// Regex in optional parameters
function testRegexEmptyOptionalParameters(){
$this->router->map('/@controller/@method(/@id:[0-9]+)', function($controller, $method, $id){
echo "$controller,$method,$id";
});
$this->request->url = '/user/delete/';
$this->check('user,delete,');
}
// Wildcard matching
function testWildcard(){
$this->router->map('/account/*', 'ok');
$this->router->map('/account/*', array($this, 'ok'));
$this->request->url = '/account/123/abc/xyz';
$this->check();
}
}
function ok(){
echo 'OK';
}

@ -6,7 +6,7 @@
* @license http://www.opensource.org/licenses/mit-license.php
*/
require_once 'PHPUnit.php';
require_once 'PHPUnit/Autoload.php';
require_once __DIR__.'/../flight/Flight.php';
class VariableTest extends PHPUnit_Framework_TestCase

@ -6,7 +6,7 @@
* @license http://www.opensource.org/licenses/mit-license.php
*/
require_once 'PHPUnit.php';
require_once 'PHPUnit/Autoload.php';
require_once __DIR__.'/../flight/template/View.php';
class ViewTest extends PHPUnit_Framework_TestCase
@ -30,9 +30,9 @@ class ViewTest extends PHPUnit_Framework_TestCase
$this->assertTrue($this->view->has('test'));
$this->assertTrue(!$this->view->has('unknown'));
$this->view->clear('tests');
$this->view->clear('test');
$this->assertEquals(null, $this->view->get('tess'));
$this->assertEquals(null, $this->view->get('test'));
}
// Check if template files exist

Loading…
Cancel
Save