Browse Source

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

Ceeram 13 years ago
parent
commit
d4986b5f24

+ 5 - 0
lib/Cake/Error/ExceptionRenderer.php

@@ -147,6 +147,11 @@ class ExceptionRenderer {
 			$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);

+ 39 - 2
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 @@ class InternalErrorException extends HttpException {
  *
  * @package       Cake.Error
  */
-class CakeException extends RuntimeException {
+class CakeException extends CakeBaseException {
 
 /**
  * Array of attributes that are passed in from the constructor, and

+ 21 - 0
lib/Cake/Test/Case/Error/ExceptionRendererTest.php

@@ -481,6 +481,27 @@ class ExceptionRendererTest extends CakeTestCase {
 	}
 
 /**
+ * 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