2008-04-06 06:00:43 +02:00
|
|
|
<?php
|
2008-06-15 15:33:53 +02:00
|
|
|
/**
|
2012-04-12 08:02:46 +02:00
|
|
|
* @package framework
|
2008-06-15 15:33:53 +02:00
|
|
|
* @subpackage tests
|
2014-08-15 08:53:05 +02:00
|
|
|
*
|
2008-09-27 18:04:01 +02:00
|
|
|
* @todo test Director::alternateBaseFolder()
|
2008-06-15 15:33:53 +02:00
|
|
|
*/
|
2010-10-19 02:36:06 +02:00
|
|
|
class DirectorTest extends SapphireTest {
|
2010-10-19 02:33:30 +02:00
|
|
|
|
2010-10-19 02:50:15 +02:00
|
|
|
protected static $originalRequestURI;
|
|
|
|
|
2013-05-10 12:03:54 +02:00
|
|
|
protected $originalProtocolHeaders = array();
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2014-07-01 09:07:13 +02:00
|
|
|
protected $originalGet = array();
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2014-07-01 09:07:13 +02:00
|
|
|
protected $originalSession = array();
|
2013-05-10 12:03:54 +02:00
|
|
|
|
2012-09-19 12:07:39 +02:00
|
|
|
public function setUp() {
|
2010-10-15 03:10:43 +02:00
|
|
|
parent::setUp();
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2014-04-22 05:21:12 +02:00
|
|
|
// Required for testRequestFilterInDirectorTest
|
|
|
|
Injector::nest();
|
2010-10-19 02:50:15 +02:00
|
|
|
|
|
|
|
// Hold the original request URI once so it doesn't get overwritten
|
|
|
|
if(!self::$originalRequestURI) {
|
|
|
|
self::$originalRequestURI = $_SERVER['REQUEST_URI'];
|
|
|
|
}
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2014-07-01 09:07:13 +02:00
|
|
|
$this->originalGet = $_GET;
|
|
|
|
$this->originalSession = $_SESSION;
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2012-05-22 07:13:05 +02:00
|
|
|
Config::inst()->update('Director', 'rules', array(
|
2012-08-27 00:56:59 +02:00
|
|
|
'DirectorTestRule/$Action/$ID/$OtherID' => 'DirectorTestRequest_Controller',
|
|
|
|
'en-nz/$Action/$ID/$OtherID' => array(
|
|
|
|
'Controller' => 'DirectorTestRequest_Controller',
|
|
|
|
'Locale' => 'en_NZ'
|
|
|
|
)
|
2010-10-15 03:10:43 +02:00
|
|
|
));
|
2013-05-10 12:03:54 +02:00
|
|
|
|
|
|
|
$headers = array(
|
|
|
|
'HTTP_X_FORWARDED_PROTOCOL', 'HTTPS', 'SSL'
|
|
|
|
);
|
|
|
|
|
|
|
|
foreach($headers as $header) {
|
|
|
|
if(isset($_SERVER[$header])) {
|
|
|
|
$this->originalProtocolHeaders[$header] = $_SERVER[$header];
|
|
|
|
}
|
|
|
|
}
|
2010-10-15 03:10:43 +02:00
|
|
|
}
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2012-09-19 12:07:39 +02:00
|
|
|
public function tearDown() {
|
2010-10-15 03:10:43 +02:00
|
|
|
// TODO Remove director rule, currently API doesnt allow this
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2014-04-08 07:10:07 +02:00
|
|
|
// Remove base URL override (setting to false reverts to default behaviour)
|
2014-04-22 03:28:44 +02:00
|
|
|
Config::inst()->update('Director', 'alternate_base_url', false);
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2014-07-01 09:07:13 +02:00
|
|
|
$_GET = $this->originalGet;
|
|
|
|
$_SESSION = $this->originalSession;
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2010-10-19 02:50:15 +02:00
|
|
|
// Reinstate the original REQUEST_URI after it was modified by some tests
|
|
|
|
$_SERVER['REQUEST_URI'] = self::$originalRequestURI;
|
2013-05-10 12:03:54 +02:00
|
|
|
|
|
|
|
if($this->originalProtocolHeaders) {
|
|
|
|
foreach($this->originalProtocolHeaders as $header => $value) {
|
|
|
|
$_SERVER[$header] = $value;
|
|
|
|
}
|
|
|
|
}
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2014-04-22 05:21:12 +02:00
|
|
|
Injector::unnest();
|
2013-05-10 12:03:54 +02:00
|
|
|
|
2010-10-15 03:10:43 +02:00
|
|
|
parent::tearDown();
|
|
|
|
}
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2008-04-06 06:00:43 +02:00
|
|
|
public function testFileExists() {
|
|
|
|
$tempFileName = 'DirectorTest_testFileExists.tmp';
|
|
|
|
$tempFilePath = TEMP_FOLDER . '/' . $tempFileName;
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2008-04-06 06:00:43 +02:00
|
|
|
// create temp file
|
|
|
|
file_put_contents($tempFilePath, '');
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2008-04-06 06:00:43 +02:00
|
|
|
$this->assertTrue(
|
2014-08-15 08:53:05 +02:00
|
|
|
Director::fileExists($tempFilePath),
|
2008-04-06 06:00:43 +02:00
|
|
|
'File exist check with absolute path'
|
|
|
|
);
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2008-04-06 06:00:43 +02:00
|
|
|
$this->assertTrue(
|
2014-08-15 08:53:05 +02:00
|
|
|
Director::fileExists($tempFilePath . '?queryparams=1&foo[bar]=bar'),
|
2008-04-06 06:00:43 +02:00
|
|
|
'File exist check with query params ignored'
|
|
|
|
);
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2008-04-06 06:00:43 +02:00
|
|
|
unlink($tempFilePath);
|
|
|
|
}
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2014-04-08 07:10:07 +02:00
|
|
|
public function testAbsoluteURL() {
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2014-04-08 07:10:07 +02:00
|
|
|
$rootURL = Director::protocolAndHost();
|
|
|
|
$_SERVER['REQUEST_URI'] = "$rootURL/mysite/sub-page/";
|
2014-04-22 03:28:44 +02:00
|
|
|
Config::inst()->update('Director', 'alternate_base_url', '/mysite/');
|
2014-07-31 00:22:37 +02:00
|
|
|
|
2014-04-08 07:10:07 +02:00
|
|
|
// Test already absolute url
|
|
|
|
$this->assertEquals($rootURL, Director::absoluteURL($rootURL));
|
|
|
|
$this->assertEquals($rootURL, Director::absoluteURL($rootURL, true));
|
|
|
|
$this->assertEquals('http://www.mytest.com', Director::absoluteURL('http://www.mytest.com'));
|
|
|
|
$this->assertEquals('http://www.mytest.com', Director::absoluteURL('http://www.mytest.com', true));
|
|
|
|
$this->assertEquals("$rootURL/test", Director::absoluteURL("$rootURL/test"));
|
|
|
|
$this->assertEquals("$rootURL/test", Director::absoluteURL("$rootURL/test", true));
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2014-04-08 07:10:07 +02:00
|
|
|
// Test relative to base
|
|
|
|
$this->assertEquals("$rootURL/mysite/test", Director::absoluteURL("test", true));
|
|
|
|
$this->assertEquals("$rootURL/mysite/test/url", Director::absoluteURL("test/url", true));
|
|
|
|
$this->assertEquals("$rootURL/root", Director::absoluteURL("/root", true));
|
|
|
|
$this->assertEquals("$rootURL/root/url", Director::absoluteURL("/root/url", true));
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2014-04-08 07:10:07 +02:00
|
|
|
// Test relative to requested page
|
|
|
|
$this->assertEquals("$rootURL/mysite/sub-page/test", Director::absoluteURL("test"));
|
|
|
|
// Legacy behaviour resolves this to $rootURL/mysite/test/url
|
|
|
|
//$this->assertEquals("$rootURL/mysite/sub-page/test/url", Director::absoluteURL("test/url"));
|
|
|
|
$this->assertEquals("$rootURL/root", Director::absoluteURL("/root"));
|
|
|
|
$this->assertEquals("$rootURL/root/url", Director::absoluteURL("/root/url"));
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2014-04-08 07:10:07 +02:00
|
|
|
// Test that javascript links are not left intact
|
|
|
|
$this->assertStringStartsNotWith('javascript', Director::absoluteURL('javascript:alert("attack")'));
|
|
|
|
$this->assertStringStartsNotWith('alert', Director::absoluteURL('javascript:alert("attack")'));
|
|
|
|
$this->assertStringStartsNotWith('javascript', Director::absoluteURL('alert("attack")'));
|
|
|
|
$this->assertStringStartsNotWith('alert', Director::absoluteURL('alert("attack")'));
|
|
|
|
}
|
2008-09-30 01:41:50 +02:00
|
|
|
|
2008-09-27 18:04:01 +02:00
|
|
|
public function testAlternativeBaseURL() {
|
2008-09-30 01:41:50 +02:00
|
|
|
// relative base URLs - you should end them in a /
|
2013-03-21 19:48:54 +01:00
|
|
|
Config::inst()->update('Director', 'alternate_base_url', '/relativebase/');
|
2008-09-30 01:41:50 +02:00
|
|
|
$this->assertEquals('/relativebase/', Director::baseURL());
|
|
|
|
$this->assertEquals(Director::protocolAndHost() . '/relativebase/', Director::absoluteBaseURL());
|
2012-09-26 23:34:00 +02:00
|
|
|
$this->assertEquals(Director::protocolAndHost() . '/relativebase/subfolder/test',
|
|
|
|
Director::absoluteURL('subfolder/test'));
|
2008-09-30 01:41:50 +02:00
|
|
|
|
|
|
|
// absolute base URLs - you should end them in a /
|
2013-03-21 19:48:54 +01:00
|
|
|
Config::inst()->update('Director', 'alternate_base_url', 'http://www.example.org/');
|
2008-09-30 01:41:50 +02:00
|
|
|
$this->assertEquals('http://www.example.org/', Director::baseURL());
|
|
|
|
$this->assertEquals('http://www.example.org/', Director::absoluteBaseURL());
|
|
|
|
$this->assertEquals('http://www.example.org/subfolder/test', Director::absoluteURL('subfolder/test'));
|
|
|
|
|
|
|
|
// Setting it to false restores functionality
|
2013-03-21 19:48:54 +01:00
|
|
|
Config::inst()->update('Director', 'alternate_base_url', false);
|
2008-09-30 01:41:50 +02:00
|
|
|
$this->assertEquals(BASE_URL.'/', Director::baseURL());
|
|
|
|
$this->assertEquals(Director::protocolAndHost().BASE_URL.'/', Director::absoluteBaseURL(BASE_URL));
|
2012-09-26 23:34:00 +02:00
|
|
|
$this->assertEquals(Director::protocolAndHost().BASE_URL . '/subfolder/test',
|
|
|
|
Director::absoluteURL('subfolder/test'));
|
2008-09-27 18:04:01 +02:00
|
|
|
}
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2008-10-12 18:16:25 +02:00
|
|
|
/**
|
|
|
|
* Tests that {@link Director::is_absolute()} works under different environment types
|
|
|
|
*/
|
|
|
|
public function testIsAbsolute() {
|
|
|
|
$expected = array (
|
|
|
|
'C:/something' => true,
|
|
|
|
'd:\\' => true,
|
|
|
|
'e/' => false,
|
|
|
|
's:/directory' => true,
|
|
|
|
'/var/www' => true,
|
|
|
|
'\\Something' => true,
|
|
|
|
'something/c:' => false,
|
|
|
|
'folder' => false,
|
|
|
|
'a/c:/' => false
|
|
|
|
);
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2008-10-12 18:16:25 +02:00
|
|
|
foreach($expected as $path => $result) {
|
|
|
|
$this->assertEquals(Director::is_absolute($path), $result, "Test result for $path");
|
|
|
|
}
|
|
|
|
}
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2009-02-11 22:07:58 +01:00
|
|
|
public function testIsAbsoluteUrl() {
|
2012-05-04 11:55:40 +02:00
|
|
|
$this->assertTrue(Director::is_absolute_url('http://test.com/testpage'));
|
2009-02-11 22:07:58 +01:00
|
|
|
$this->assertTrue(Director::is_absolute_url('ftp://test.com'));
|
2012-05-04 11:55:40 +02:00
|
|
|
$this->assertFalse(Director::is_absolute_url('test.com/testpage'));
|
2009-02-11 22:07:58 +01:00
|
|
|
$this->assertFalse(Director::is_absolute_url('/relative'));
|
|
|
|
$this->assertFalse(Director::is_absolute_url('relative'));
|
2012-06-29 07:14:28 +02:00
|
|
|
$this->assertFalse(Director::is_absolute_url("/relative/?url=http://foo.com"));
|
|
|
|
$this->assertFalse(Director::is_absolute_url("/relative/#http://foo.com"));
|
2012-05-04 11:55:40 +02:00
|
|
|
$this->assertTrue(Director::is_absolute_url("https://test.com/?url=http://foo.com"));
|
|
|
|
$this->assertTrue(Director::is_absolute_url("trickparseurl:http://test.com"));
|
|
|
|
$this->assertTrue(Director::is_absolute_url('//test.com'));
|
|
|
|
$this->assertTrue(Director::is_absolute_url('/////test.com'));
|
|
|
|
$this->assertTrue(Director::is_absolute_url(' ///test.com'));
|
|
|
|
$this->assertTrue(Director::is_absolute_url('http:test.com'));
|
|
|
|
$this->assertTrue(Director::is_absolute_url('//http://test.com'));
|
2009-03-17 23:22:55 +01:00
|
|
|
}
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2009-03-17 23:22:55 +01:00
|
|
|
public function testIsRelativeUrl() {
|
|
|
|
$siteUrl = Director::absoluteBaseURL();
|
|
|
|
$this->assertFalse(Director::is_relative_url('http://test.com'));
|
|
|
|
$this->assertFalse(Director::is_relative_url('https://test.com'));
|
|
|
|
$this->assertFalse(Director::is_relative_url(' https://test.com/testpage '));
|
|
|
|
$this->assertTrue(Director::is_relative_url('test.com/testpage'));
|
|
|
|
$this->assertFalse(Director::is_relative_url('ftp://test.com'));
|
|
|
|
$this->assertTrue(Director::is_relative_url('/relative'));
|
|
|
|
$this->assertTrue(Director::is_relative_url('relative'));
|
2012-06-29 07:14:28 +02:00
|
|
|
$this->assertTrue(Director::is_relative_url('/relative/?url=http://test.com'));
|
|
|
|
$this->assertTrue(Director::is_relative_url('/relative/#=http://test.com'));
|
2009-03-17 23:22:55 +01:00
|
|
|
}
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2009-03-17 23:22:55 +01:00
|
|
|
public function testMakeRelative() {
|
|
|
|
$siteUrl = Director::absoluteBaseURL();
|
|
|
|
$siteUrlNoProtocol = preg_replace('/https?:\/\//', '', $siteUrl);
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2009-03-17 23:22:55 +01:00
|
|
|
$this->assertEquals(Director::makeRelative("$siteUrl"), '');
|
2012-07-01 12:07:07 +02:00
|
|
|
$this->assertEquals(Director::makeRelative("https://$siteUrlNoProtocol"), '');
|
|
|
|
$this->assertEquals(Director::makeRelative("http://$siteUrlNoProtocol"), '');
|
|
|
|
|
2009-03-17 23:22:55 +01:00
|
|
|
$this->assertEquals(Director::makeRelative(" $siteUrl/testpage "), 'testpage');
|
2012-07-01 12:07:07 +02:00
|
|
|
$this->assertEquals(Director::makeRelative("$siteUrlNoProtocol/testpage"), 'testpage');
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2009-03-17 23:22:55 +01:00
|
|
|
$this->assertEquals(Director::makeRelative('ftp://test.com'), 'ftp://test.com');
|
|
|
|
$this->assertEquals(Director::makeRelative('http://test.com'), 'http://test.com');
|
2012-07-01 12:07:07 +02:00
|
|
|
|
2009-03-17 23:22:55 +01:00
|
|
|
$this->assertEquals(Director::makeRelative('relative'), 'relative');
|
|
|
|
$this->assertEquals(Director::makeRelative("$siteUrl/?url=http://test.com"), '?url=http://test.com');
|
2012-07-01 12:07:07 +02:00
|
|
|
|
|
|
|
$this->assertEquals("test", Director::makeRelative("https://".$siteUrlNoProtocol."/test"));
|
|
|
|
$this->assertEquals("test", Director::makeRelative("http://".$siteUrlNoProtocol."/test"));
|
2009-03-17 23:22:55 +01:00
|
|
|
}
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2012-05-04 11:55:40 +02:00
|
|
|
/**
|
|
|
|
* Mostly tested by {@link testIsRelativeUrl()},
|
|
|
|
* just adding the host name matching aspect here.
|
|
|
|
*/
|
2009-03-17 23:22:55 +01:00
|
|
|
public function testIsSiteUrl() {
|
2012-05-04 11:55:40 +02:00
|
|
|
$this->assertFalse(Director::is_site_url("http://test.com"));
|
|
|
|
$this->assertTrue(Director::is_site_url(Director::absoluteBaseURL()));
|
|
|
|
$this->assertFalse(Director::is_site_url("http://test.com?url=" . Director::absoluteBaseURL()));
|
|
|
|
$this->assertFalse(Director::is_site_url("http://test.com?url=" . urlencode(Director::absoluteBaseURL())));
|
|
|
|
$this->assertFalse(Director::is_site_url("//test.com?url=" . Director::absoluteBaseURL()));
|
2009-02-11 22:07:58 +01:00
|
|
|
}
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2014-07-01 09:07:13 +02:00
|
|
|
/**
|
|
|
|
* Tests isDev, isTest, isLive set from querystring
|
|
|
|
*/
|
|
|
|
public function testQueryIsEnvironment() {
|
|
|
|
// Reset
|
|
|
|
unset($_SESSION['isDev']);
|
|
|
|
unset($_SESSION['isLive']);
|
|
|
|
unset($_GET['isTest']);
|
|
|
|
unset($_GET['isDev']);
|
2014-09-26 06:01:23 +02:00
|
|
|
$_SESSION = $_SESSION ?: array();
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2014-07-01 09:07:13 +02:00
|
|
|
// Test isDev=1
|
|
|
|
$_GET['isDev'] = '1';
|
|
|
|
$this->assertTrue(Director::isDev());
|
|
|
|
$this->assertFalse(Director::isTest());
|
|
|
|
$this->assertFalse(Director::isLive());
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2014-07-01 09:07:13 +02:00
|
|
|
// Test persistence
|
|
|
|
unset($_GET['isDev']);
|
|
|
|
$this->assertTrue(Director::isDev());
|
|
|
|
$this->assertFalse(Director::isTest());
|
|
|
|
$this->assertFalse(Director::isLive());
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2014-07-01 09:07:13 +02:00
|
|
|
// Test change to isTest
|
|
|
|
$_GET['isTest'] = '1';
|
|
|
|
$this->assertFalse(Director::isDev());
|
|
|
|
$this->assertTrue(Director::isTest());
|
|
|
|
$this->assertFalse(Director::isLive());
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2014-07-01 09:07:13 +02:00
|
|
|
// Test persistence
|
|
|
|
unset($_GET['isTest']);
|
|
|
|
$this->assertFalse(Director::isDev());
|
|
|
|
$this->assertTrue(Director::isTest());
|
|
|
|
$this->assertFalse(Director::isLive());
|
|
|
|
}
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2009-12-16 06:42:50 +01:00
|
|
|
public function testResetGlobalsAfterTestRequest() {
|
|
|
|
$_GET = array('somekey' => 'getvalue');
|
|
|
|
$_POST = array('somekey' => 'postvalue');
|
|
|
|
$_COOKIE = array('somekey' => 'cookievalue');
|
|
|
|
|
2014-09-26 06:01:23 +02:00
|
|
|
$cookies = Injector::inst()->createWithArgs(
|
|
|
|
'Cookie_Backend',
|
|
|
|
array(array('somekey' => 'sometestcookievalue'))
|
|
|
|
);
|
2014-05-04 15:34:58 +02:00
|
|
|
|
2012-09-26 23:34:00 +02:00
|
|
|
$getresponse = Director::test('errorpage?somekey=sometestgetvalue', array('somekey' => 'sometestpostvalue'),
|
2014-05-04 15:34:58 +02:00
|
|
|
null, null, null, null, $cookies);
|
2009-12-16 06:42:50 +01:00
|
|
|
|
2012-09-26 23:34:00 +02:00
|
|
|
$this->assertEquals('getvalue', $_GET['somekey'],
|
|
|
|
'$_GET reset to original value after Director::test()');
|
|
|
|
$this->assertEquals('postvalue', $_POST['somekey'],
|
|
|
|
'$_POST reset to original value after Director::test()');
|
|
|
|
$this->assertEquals('cookievalue', $_COOKIE['somekey'],
|
|
|
|
'$_COOKIE reset to original value after Director::test()');
|
2009-12-16 06:42:50 +01:00
|
|
|
}
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2009-12-16 06:42:50 +01:00
|
|
|
public function testTestRequestCarriesGlobals() {
|
|
|
|
$fixture = array('somekey' => 'sometestvalue');
|
|
|
|
foreach(array('get', 'post') as $method) {
|
|
|
|
foreach(array('return%sValue', 'returnRequestValue', 'returnCookieValue') as $testfunction) {
|
2012-09-26 23:34:00 +02:00
|
|
|
$url = 'DirectorTestRequest_Controller/' . sprintf($testfunction, ucfirst($method))
|
|
|
|
. '?' . http_build_query($fixture);
|
2014-05-04 15:34:58 +02:00
|
|
|
|
|
|
|
$getresponse = Director::test(
|
|
|
|
$url,
|
|
|
|
$fixture,
|
|
|
|
null,
|
|
|
|
strtoupper($method),
|
|
|
|
null,
|
|
|
|
null,
|
2014-09-26 06:01:23 +02:00
|
|
|
Injector::inst()->createWithArgs('Cookie_Backend', array($fixture))
|
2014-05-04 15:34:58 +02:00
|
|
|
);
|
2009-12-16 06:42:50 +01:00
|
|
|
|
2012-05-09 12:43:22 +02:00
|
|
|
$this->assertInstanceOf('SS_HTTPResponse', $getresponse, 'Director::test() returns SS_HTTPResponse');
|
2009-12-16 06:43:02 +01:00
|
|
|
$this->assertEquals($fixture['somekey'], $getresponse->getBody(), 'Director::test() ' . $testfunction);
|
2009-12-16 06:42:50 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2012-08-27 00:56:59 +02:00
|
|
|
/**
|
2014-08-15 08:53:05 +02:00
|
|
|
* Tests that additional parameters specified in the routing table are
|
|
|
|
* saved in the request
|
2012-08-27 00:56:59 +02:00
|
|
|
*/
|
2012-09-19 12:07:39 +02:00
|
|
|
public function testRouteParams() {
|
2012-08-27 00:56:59 +02:00
|
|
|
Director::test('en-nz/myaction/myid/myotherid', null, null, null, null, null, null, $request);
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2012-08-27 00:56:59 +02:00
|
|
|
$this->assertEquals(
|
2014-08-15 08:53:05 +02:00
|
|
|
$request->params(),
|
2012-08-27 00:56:59 +02:00
|
|
|
array(
|
|
|
|
'Controller' => 'DirectorTestRequest_Controller',
|
2014-08-15 08:53:05 +02:00
|
|
|
'Action' => 'myaction',
|
|
|
|
'ID' => 'myid',
|
2012-08-27 00:56:59 +02:00
|
|
|
'OtherID' => 'myotherid',
|
|
|
|
'Locale' => 'en_NZ'
|
|
|
|
)
|
|
|
|
);
|
|
|
|
}
|
2010-10-19 02:32:42 +02:00
|
|
|
|
2012-09-19 12:07:39 +02:00
|
|
|
public function testForceSSLProtectsEntireSite() {
|
2010-10-19 02:32:42 +02:00
|
|
|
$_SERVER['REQUEST_URI'] = Director::baseURL() . 'admin';
|
|
|
|
$output = Director::forceSSL();
|
|
|
|
$this->assertEquals($output, 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
|
|
|
|
|
|
|
|
$_SERVER['REQUEST_URI'] = Director::baseURL() . 'some-url';
|
|
|
|
$output = Director::forceSSL();
|
|
|
|
$this->assertEquals($output, 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
|
|
|
|
}
|
|
|
|
|
2012-09-19 12:07:39 +02:00
|
|
|
public function testForceSSLOnTopLevelPagePattern() {
|
2010-10-19 02:32:42 +02:00
|
|
|
$_SERVER['REQUEST_URI'] = Director::baseURL() . 'admin';
|
|
|
|
$output = Director::forceSSL(array('/^admin/'));
|
|
|
|
$this->assertEquals($output, 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
|
|
|
|
}
|
|
|
|
|
2012-09-19 12:07:39 +02:00
|
|
|
public function testForceSSLOnSubPagesPattern() {
|
2011-03-16 04:13:14 +01:00
|
|
|
$_SERVER['REQUEST_URI'] = Director::baseURL() . Config::inst()->get('Security', 'login_url');
|
2010-10-19 02:32:42 +02:00
|
|
|
$output = Director::forceSSL(array('/^Security/'));
|
|
|
|
$this->assertEquals($output, 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
|
|
|
|
}
|
|
|
|
|
2012-09-19 12:07:39 +02:00
|
|
|
public function testForceSSLWithPatternDoesNotMatchOtherPages() {
|
2010-10-19 02:32:42 +02:00
|
|
|
$_SERVER['REQUEST_URI'] = Director::baseURL() . 'normal-page';
|
|
|
|
$output = Director::forceSSL(array('/^admin/'));
|
|
|
|
$this->assertFalse($output);
|
|
|
|
|
|
|
|
$_SERVER['REQUEST_URI'] = Director::baseURL() . 'just-another-page/sub-url';
|
|
|
|
$output = Director::forceSSL(array('/^admin/', '/^Security/'));
|
|
|
|
$this->assertFalse($output);
|
|
|
|
}
|
|
|
|
|
2013-04-03 05:53:58 +02:00
|
|
|
public function testForceSSLAlternateDomain() {
|
2013-04-09 14:02:16 +02:00
|
|
|
Config::inst()->update('Director', 'alternate_base_url', '/');
|
2013-04-03 05:53:58 +02:00
|
|
|
$_SERVER['REQUEST_URI'] = Director::baseURL() . 'admin';
|
|
|
|
$output = Director::forceSSL(array('/^admin/'), 'secure.mysite.com');
|
|
|
|
$this->assertEquals($output, 'https://secure.mysite.com/admin');
|
|
|
|
}
|
|
|
|
|
2011-03-19 00:38:30 +01:00
|
|
|
/**
|
|
|
|
* @covers Director::extract_request_headers()
|
|
|
|
*/
|
|
|
|
public function testExtractRequestHeaders() {
|
|
|
|
$request = array(
|
|
|
|
'REDIRECT_STATUS' => '200',
|
|
|
|
'HTTP_HOST' => 'host',
|
|
|
|
'HTTP_USER_AGENT' => 'User Agent',
|
|
|
|
'HTTP_ACCEPT' => 'text/html',
|
|
|
|
'HTTP_ACCEPT_LANGUAGE' => 'en-us',
|
2013-09-27 20:06:25 +02:00
|
|
|
'HTTP_COOKIE' => 'MyCookie=1',
|
2011-03-19 00:38:30 +01:00
|
|
|
'SERVER_PROTOCOL' => 'HTTP/1.1',
|
|
|
|
'REQUEST_METHOD' => 'GET',
|
|
|
|
'REQUEST_URI' => '/',
|
2012-03-24 04:38:57 +01:00
|
|
|
'SCRIPT_NAME' => FRAMEWORK_DIR . '/main.php',
|
2011-03-19 00:38:30 +01:00
|
|
|
'CONTENT_TYPE' => 'text/xml',
|
|
|
|
'CONTENT_LENGTH' => 10
|
|
|
|
);
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2011-03-19 00:38:30 +01:00
|
|
|
$headers = array(
|
|
|
|
'Host' => 'host',
|
|
|
|
'User-Agent' => 'User Agent',
|
|
|
|
'Accept' => 'text/html',
|
|
|
|
'Accept-Language' => 'en-us',
|
2013-09-27 20:06:25 +02:00
|
|
|
'Cookie' => 'MyCookie=1',
|
2011-03-19 00:38:30 +01:00
|
|
|
'Content-Type' => 'text/xml',
|
|
|
|
'Content-Length' => '10'
|
|
|
|
);
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2011-09-19 16:01:33 +02:00
|
|
|
$this->assertEquals($headers, Director::extract_request_headers($request));
|
2011-03-19 00:38:30 +01:00
|
|
|
}
|
|
|
|
|
2013-04-06 09:19:03 +02:00
|
|
|
public function testUnmatchedRequestReturns404() {
|
|
|
|
$this->assertEquals(404, Director::test('no-route')->getStatusCode());
|
|
|
|
}
|
|
|
|
|
2013-05-10 12:03:54 +02:00
|
|
|
public function testIsHttps() {
|
|
|
|
// nothing available
|
|
|
|
$headers = array(
|
|
|
|
'HTTP_X_FORWARDED_PROTOCOL', 'HTTPS', 'SSL'
|
|
|
|
);
|
|
|
|
|
2013-06-18 23:24:22 +02:00
|
|
|
$origServer = $_SERVER;
|
|
|
|
|
2013-05-10 12:03:54 +02:00
|
|
|
foreach($headers as $header) {
|
|
|
|
if(isset($_SERVER[$header])) {
|
|
|
|
unset($_SERVER['HTTP_X_FORWARDED_PROTOCOL']);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$this->assertFalse(Director::is_https());
|
|
|
|
|
|
|
|
$_SERVER['HTTP_X_FORWARDED_PROTOCOL'] = 'https';
|
|
|
|
$this->assertTrue(Director::is_https());
|
|
|
|
|
|
|
|
$_SERVER['HTTP_X_FORWARDED_PROTOCOL'] = 'http';
|
|
|
|
$this->assertFalse(Director::is_https());
|
|
|
|
|
|
|
|
$_SERVER['HTTP_X_FORWARDED_PROTOCOL'] = 'ftp';
|
|
|
|
$this->assertFalse(Director::is_https());
|
|
|
|
|
2014-05-22 08:34:15 +02:00
|
|
|
$_SERVER['HTTP_X_FORWARDED_PROTO'] = 'https';
|
|
|
|
$this->assertTrue(Director::is_https());
|
|
|
|
|
|
|
|
$_SERVER['HTTP_X_FORWARDED_PROTO'] = 'http';
|
|
|
|
$this->assertFalse(Director::is_https());
|
|
|
|
|
|
|
|
$_SERVER['HTTP_X_FORWARDED_PROTO'] = 'ftp';
|
|
|
|
$this->assertFalse(Director::is_https());
|
|
|
|
|
|
|
|
$_SERVER['HTTP_FRONT_END_HTTPS'] = 'On';
|
|
|
|
$this->assertTrue(Director::is_https());
|
|
|
|
|
|
|
|
$_SERVER['HTTP_FRONT_END_HTTPS'] = 'Off';
|
|
|
|
$this->assertFalse(Director::is_https());
|
|
|
|
|
2013-05-10 12:03:54 +02:00
|
|
|
// https via HTTPS
|
|
|
|
$_SERVER['HTTPS'] = 'true';
|
|
|
|
$this->assertTrue(Director::is_https());
|
|
|
|
|
|
|
|
$_SERVER['HTTPS'] = '1';
|
|
|
|
$this->assertTrue(Director::is_https());
|
|
|
|
|
|
|
|
$_SERVER['HTTPS'] = 'off';
|
|
|
|
$this->assertFalse(Director::is_https());
|
|
|
|
|
|
|
|
// https via SSL
|
|
|
|
$_SERVER['SSL'] = '';
|
|
|
|
$this->assertTrue(Director::is_https());
|
2013-06-18 23:24:22 +02:00
|
|
|
|
|
|
|
$_SERVER = $origServer;
|
2013-05-10 12:03:54 +02:00
|
|
|
}
|
2014-02-26 13:04:47 +01:00
|
|
|
|
|
|
|
public function testTestIgnoresHashes() {
|
|
|
|
//test that hashes are ignored
|
|
|
|
$url = "DirectorTestRequest_Controller/returnGetValue?somekey=key";
|
|
|
|
$hash = "#test";
|
|
|
|
$response = Director::test($url . $hash, null, null, null, null, null, null, $request);
|
|
|
|
$this->assertFalse($response->isError());
|
|
|
|
$this->assertEquals('key', $response->getBody());
|
|
|
|
$this->assertEquals($request->getURL(true), $url);
|
|
|
|
|
|
|
|
//test encoded hashes are accepted
|
|
|
|
$url = "DirectorTestRequest_Controller/returnGetValue?somekey=test%23key";
|
|
|
|
$response = Director::test($url, null, null, null, null, null, null, $request);
|
|
|
|
$this->assertFalse($response->isError());
|
|
|
|
$this->assertEquals('test#key', $response->getBody());
|
|
|
|
$this->assertEquals($request->getURL(true), $url);
|
|
|
|
}
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2013-10-14 22:53:34 +02:00
|
|
|
public function testRequestFilterInDirectorTest() {
|
|
|
|
$filter = new TestRequestFilter;
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2013-10-14 22:53:34 +02:00
|
|
|
$processor = new RequestProcessor(array($filter));
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2013-10-14 22:53:34 +02:00
|
|
|
Injector::inst()->registerService($processor, 'RequestProcessor');
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2013-10-14 22:53:34 +02:00
|
|
|
$response = Director::test('some-dummy-url');
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2013-10-14 22:53:34 +02:00
|
|
|
$this->assertEquals(1, $filter->preCalls);
|
|
|
|
$this->assertEquals(1, $filter->postCalls);
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2013-10-14 22:53:34 +02:00
|
|
|
$filter->failPost = true;
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2013-10-14 22:53:34 +02:00
|
|
|
$this->setExpectedException('SS_HTTPResponse_Exception');
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2013-10-14 22:53:34 +02:00
|
|
|
$response = Director::test('some-dummy-url');
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2013-10-14 22:53:34 +02:00
|
|
|
$this->assertEquals(2, $filter->preCalls);
|
|
|
|
$this->assertEquals(2, $filter->postCalls);
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2013-10-14 22:53:34 +02:00
|
|
|
$filter->failPre = true;
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2013-10-14 22:53:34 +02:00
|
|
|
$response = Director::test('some-dummy-url');
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2013-10-14 22:53:34 +02:00
|
|
|
$this->assertEquals(3, $filter->preCalls);
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2013-10-14 22:53:34 +02:00
|
|
|
// preCall 'false' will trigger an exception and prevent post call execution
|
|
|
|
$this->assertEquals(2, $filter->postCalls);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
class TestRequestFilter implements RequestFilter, TestOnly {
|
|
|
|
public $preCalls = 0;
|
|
|
|
public $postCalls = 0;
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2013-10-14 22:53:34 +02:00
|
|
|
public $failPre = false;
|
|
|
|
public $failPost = false;
|
|
|
|
|
|
|
|
public function preRequest(\SS_HTTPRequest $request, \Session $session, \DataModel $model) {
|
|
|
|
++$this->preCalls;
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2013-10-14 22:53:34 +02:00
|
|
|
if ($this->failPre) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public function postRequest(\SS_HTTPRequest $request, \SS_HTTPResponse $response, \DataModel $model) {
|
|
|
|
++$this->postCalls;
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2013-10-14 22:53:34 +02:00
|
|
|
if ($this->failPost) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public function reset() {
|
|
|
|
$this->preCalls = 0;
|
|
|
|
$this->postCalls = 0;
|
|
|
|
}
|
|
|
|
|
2008-04-06 06:00:43 +02:00
|
|
|
}
|
2009-12-16 06:42:50 +01:00
|
|
|
|
|
|
|
class DirectorTestRequest_Controller extends Controller implements TestOnly {
|
|
|
|
|
2013-06-20 11:40:55 +02:00
|
|
|
private static $allowed_actions = array(
|
|
|
|
'returnGetValue',
|
|
|
|
'returnPostValue',
|
|
|
|
'returnRequestValue',
|
|
|
|
'returnCookieValue',
|
|
|
|
);
|
|
|
|
|
2009-12-16 06:42:50 +01:00
|
|
|
public function returnGetValue($request) { return $_GET['somekey']; }
|
|
|
|
|
|
|
|
public function returnPostValue($request) { return $_POST['somekey']; }
|
|
|
|
|
|
|
|
public function returnRequestValue($request) { return $_REQUEST['somekey']; }
|
|
|
|
|
|
|
|
public function returnCookieValue($request) { return $_COOKIE['somekey']; }
|
|
|
|
|
2012-03-24 04:38:57 +01:00
|
|
|
}
|