summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBharat Mediratta <bharat@menalto.com>2010-06-19 13:53:22 -0700
committerBharat Mediratta <bharat@menalto.com>2010-06-19 14:07:37 -0700
commit456d54ea2dccbe55a2efd89ecb4bde29fb91b619 (patch)
tree91e7b71f4b167e99fa3e0494d358e9787300d0df
parent41ca2b0195bf6a29429dfc5405f3c2073b1c3aba (diff)
Throw exceptions as appropriate, but allow the Kohana exception
handling framework to handle the exception and delegate to our template, which will JSON encode the response.
-rw-r--r--modules/rest/controllers/rest.php41
-rw-r--r--modules/rest/libraries/Rest_Exception.php11
-rw-r--r--modules/rest/views/error_rest.php2
3 files changed, 17 insertions, 37 deletions
diff --git a/modules/rest/controllers/rest.php b/modules/rest/controllers/rest.php
index ccccc762..f8a46515 100644
--- a/modules/rest/controllers/rest.php
+++ b/modules/rest/controllers/rest.php
@@ -81,41 +81,12 @@ class Rest_Controller extends Controller {
}
$response = call_user_func(array($handler_class, $handler_method), $request);
- } catch (Exception $e) {
- $response = $this->_format_exception_response($e);
+ rest::reply($response);
+ } catch (ORM_Validation_Exception $e) {
+ // Note: this is totally insufficient because it doesn't take into account localization. We
+ // either need to map the result values to localized strings in the application code, or every
+ // client needs its own l10n string set.
+ throw new Rest_Exception("Bad Request", 400, $e->validation->errors());
}
-
- rest::reply($response);
- }
-
- private function _format_exception_response($e) {
- // Add this exception to the log
- Kohana_Log::add("error", Kohana_Exception::text($e));
-
- $rest_exception = array();
- if ($e instanceof ORM_Validation_Exception) {
- $detail_response = true;
- $rest_exception["code"] = 400;
- $rest_exception["message"] = "Validation errors";
- $rest_exception["fields"] = $e->validation->errors();
- } else if ($e instanceof Rest_Exception) {
- $rest_exception["code"] = $e->getCode();
- if ($e->getMessage() != "Bad Request") {
- $rest_exception["message"] = "Bad Request";
- $rest_exception["fields"] = array("type", $e->getMessage());
- } else {
- $rest_exception["message"] = $e->getMessage();
- }
- } else {
- $rest_exception["code"] = 500;
- $rest_exception["message"] = t("Remote server call failed. Please contact the Adminstrator.");
- }
-
- if (!headers_sent()) {
- header($rest_exception["code"] == 500 ? "HTTP/1.1 500 Internal Server Error" :
- "HTTP/1.1 400 Bad Request");
- }
-
- return $rest_exception;
}
} \ No newline at end of file
diff --git a/modules/rest/libraries/Rest_Exception.php b/modules/rest/libraries/Rest_Exception.php
index aa5b3281..c5baec63 100644
--- a/modules/rest/libraries/Rest_Exception.php
+++ b/modules/rest/libraries/Rest_Exception.php
@@ -18,13 +18,20 @@
* Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
*/
class Rest_Exception_Core extends Kohana_Exception {
- public function __construct($message, $code) {
+ var $response = array();
+
+ public function __construct($message, $code, $response) {
parent::__construct($message, null, $code);
+ $this->response = $response;
}
public function sendHeaders() {
if (!headers_sent()) {
- header("HTTP/1.1 " . $this->getCode() . "Bad Request");
+ header("HTTP/1.1 " . $this->getCode() . " " . $this->getMessage());
}
}
+
+ public function getTemplate() {
+ return "error_rest";
+ }
} \ No newline at end of file
diff --git a/modules/rest/views/error_rest.php b/modules/rest/views/error_rest.php
new file mode 100644
index 00000000..c018378e
--- /dev/null
+++ b/modules/rest/views/error_rest.php
@@ -0,0 +1,2 @@
+<?php defined("SYSPATH") or die("No direct script access.") ?>
+<?= json_encode($e->response) ?> \ No newline at end of file