diff --git a/cake/libs/controller/components/request_handler.php b/cake/libs/controller/components/request_handler.php index c5bc6184ec9..681d8b34a67 100644 --- a/cake/libs/controller/components/request_handler.php +++ b/cake/libs/controller/components/request_handler.php @@ -230,6 +230,9 @@ function beforeRedirect(&$controller, $url) { foreach ($_POST as $key => $val) { unset($_POST[$key]); } + if (is_array($url)) { + $url = Router::url($url + array('base' => false)); + } echo $this->requestAction($url, array('return')); $this->_stop(); } diff --git a/cake/tests/cases/libs/controller/components/request_handler.test.php b/cake/tests/cases/libs/controller/components/request_handler.test.php index b9cc6e76285..97f1e0751fd 100644 --- a/cake/tests/cases/libs/controller/components/request_handler.test.php +++ b/cake/tests/cases/libs/controller/components/request_handler.test.php @@ -70,6 +70,15 @@ function destination() { $this->viewPath = 'posts'; $this->render('index'); } +/** + * test method for ajax redirection + parameter parsing + * + * @return void + */ + function param_method($one = null, $two = null) { + echo "one: $one two: $two"; + $this->autoRender = false; + } } /** * RequestHandlerTestDisabledController class @@ -541,5 +550,35 @@ function testAjaxRedirectAsRequestAction() { Configure::write('viewPaths', $_paths); unset($_SERVER['HTTP_X_REQUESTED_WITH']); } + +/** + * test that the beforeRedirect callback properly converts + * array urls into their correct string ones, and adds base => false so + * the correct urls are generated. + * + * @link http://cakephp.lighthouseapp.com/projects/42648-cakephp-1x/tickets/276 + * @return void + */ + function testBeforeRedirectCallbackWithArrayUrl() { + $_SERVER['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest'; + App::build(array( + 'views' => array(TEST_CAKE_CORE_INCLUDE_PATH . 'tests' . DS . 'test_app' . DS . 'views'. DS) + ), true); + Router::setRequestInfo(array( + array('plugin' => null, 'controller' => 'accounts', 'action' => 'index', 'pass' => array(), 'named' => array(), 'form' => array(), 'url' => array('url' => 'accounts/'), 'bare' => 0), + array('base' => '/officespace', 'here' => '/officespace/accounts/', 'webroot' => '/officespace/') + )); + + $RequestHandler =& new NoStopRequestHandler(); + + ob_start(); + $RequestHandler->beforeRedirect( + $this->Controller, + array('controller' => 'request_handler_test', 'action' => 'param_method', 'first', 'second') + ); + $result = ob_get_clean(); + $this->assertEqual($result, 'one: first two: second'); + App::build(); + } } ?> \ No newline at end of file