Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

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.