add responseHeader() method to new base exception class, ExceptionRenderer will pass the headers to the response.

Tests added.
This commit is contained in:
Ceeram 2012-08-08 13:13:28 +02:00
parent 596f2c0d91
commit d4986b5f24
3 changed files with 65 additions and 2 deletions

View file

@ -147,6 +147,11 @@ class ExceptionRenderer {
$request = new CakeRequest(); $request = new CakeRequest();
} }
$response = new CakeResponse(array('charset' => Configure::read('App.encoding'))); $response = new CakeResponse(array('charset' => Configure::read('App.encoding')));
if (method_exists($exception, 'responseHeader')) {
$response->header($exception->responseHeader());
}
try { try {
if (class_exists('AppController')) { if (class_exists('AppController')) {
$controller = new CakeErrorController($request, $response); $controller = new CakeErrorController($request, $response);

View file

@ -18,6 +18,43 @@
* @license MIT License (http://www.opensource.org/licenses/mit-license.php) * @license MIT License (http://www.opensource.org/licenses/mit-license.php)
*/ */
/**
* Base class that all Exceptions extend.
*
* @package Cake.Error
*/
class CakeBaseException extends RuntimeException {
/**
* Array of headers to be passed to CakeResponse::header()
*
* @var array
*/
protected $_responseHeaders = null;
/**
* Get/set the response header to be used
*
* See also CakeResponse::header()
*
* @param string|array $header. An array of header strings or a single header string
* - an associative array of "header name" => "header value"
* - an array of string headers is also accepted
* @param string $value. The header value.
* @return array
*/
public function responseHeader($header = null, $value = null) {
if ($header) {
if (is_array($header)) {
return $this->_responseHeaders = $header;
}
$this->_responseHeaders = array($header => $value);
}
return $this->_responseHeaders;
}
}
/** /**
* Parent class for all of the HTTP related exceptions in CakePHP. * Parent class for all of the HTTP related exceptions in CakePHP.
* All HTTP status/error related exceptions should extend this class so * All HTTP status/error related exceptions should extend this class so
@ -26,7 +63,7 @@
* @package Cake.Error * @package Cake.Error
*/ */
if (!class_exists('HttpException')) { if (!class_exists('HttpException')) {
class HttpException extends RuntimeException { class HttpException extends CakeBaseException {
} }
} }
@ -168,7 +205,7 @@ class InternalErrorException extends HttpException {
* *
* @package Cake.Error * @package Cake.Error
*/ */
class CakeException extends RuntimeException { class CakeException extends CakeBaseException {
/** /**
* Array of attributes that are passed in from the constructor, and * Array of attributes that are passed in from the constructor, and

View file

@ -480,6 +480,27 @@ class ExceptionRendererTest extends CakeTestCase {
$this->assertRegExp('/<h2>An Internal Error Has Occurred<\/h2>/', $result); $this->assertRegExp('/<h2>An Internal Error Has Occurred<\/h2>/', $result);
} }
/**
* testExceptionResponseHeader method
*
* @return void
*/
public function testExceptionResponseHeader() {
$exception = new MethodNotAllowedException('Only allowing POST and DELETE');
$exception->responseHeader(array('Allow: POST, DELETE'));
$ExceptionRenderer = new ExceptionRenderer($exception);
//Replace response object with mocked object add back the original headers which had been set in ExceptionRenderer constructor
$headers = $ExceptionRenderer->controller->response->header();
$ExceptionRenderer->controller->response = $this->getMock('CakeResponse', array('_sendHeader'));
$ExceptionRenderer->controller->response->header($headers);
$ExceptionRenderer->controller->response->expects($this->at(1))->method('_sendHeader')->with('Allow', 'POST, DELETE');
ob_start();
$ExceptionRenderer->render();
$result = ob_get_clean();
}
/** /**
* testMissingController method * testMissingController method
* *