Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

add responseHeader() method to new base exception class, ExceptionRen…

…derer will pass the headers to the response.

Tests added.
  • Loading branch information...
commit d4986b5f2469c7f8fcbbc26a581849ccf228cdbf 1 parent 596f2c0
@ceeram ceeram authored
View
5 lib/Cake/Error/ExceptionRenderer.php
@@ -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);
View
41 lib/Cake/Error/exceptions.php
@@ -19,6 +19,43 @@
*/
/**
+ * 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
* catch blocks can be specifically typed.
@@ -26,7 +63,7 @@
* @package Cake.Error
*/
if (!class_exists('HttpException')) {
- class HttpException extends RuntimeException {
+ class HttpException extends CakeBaseException {
}
}
@@ -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
View
21 lib/Cake/Test/Case/Error/ExceptionRendererTest.php
@@ -481,6 +481,27 @@ public function testError500Message() {
}
/**
+ * 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
*
* @return void
Please sign in to comment.
Something went wrong with that request. Please try again.