Skip to content

Commit

Permalink
add responseHeader() method to new base exception class, ExceptionRen…
Browse files Browse the repository at this point in the history
…derer will pass the headers to the response.

Tests added.
  • Loading branch information
ceeram committed Aug 9, 2012
1 parent 596f2c0 commit d4986b5
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 2 deletions.
5 changes: 5 additions & 0 deletions lib/Cake/Error/ExceptionRenderer.php
Expand Up @@ -147,6 +147,11 @@ protected function _getController($exception) {
$request = new CakeRequest();
}
$response = new CakeResponse(array('charset' => Configure::read('App.encoding')));

if (method_exists($exception, 'responseHeader')) {
$response->header($exception->responseHeader());
}

try {
if (class_exists('AppController')) {
$controller = new CakeErrorController($request, $response);
Expand Down
41 changes: 39 additions & 2 deletions lib/Cake/Error/exceptions.php
Expand Up @@ -18,6 +18,43 @@
* @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.
* All HTTP status/error related exceptions should extend this class so
Expand All @@ -26,7 +63,7 @@
* @package Cake.Error
*/
if (!class_exists('HttpException')) {
class HttpException extends RuntimeException {
class HttpException extends CakeBaseException {
}
}

Expand Down Expand Up @@ -168,7 +205,7 @@ public function __construct($message = null, $code = 500) {
*
* @package Cake.Error
*/
class CakeException extends RuntimeException {
class CakeException extends CakeBaseException {

/**
* Array of attributes that are passed in from the constructor, and
Expand Down
21 changes: 21 additions & 0 deletions lib/Cake/Test/Case/Error/ExceptionRendererTest.php
Expand Up @@ -480,6 +480,27 @@ public function testError500Message() {
$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
*
Expand Down

0 comments on commit d4986b5

Please sign in to comment.