Permalink
Browse files

Don't use the standard error formatting for exceptions that have occu…

…rred as part of a REST request. Format the exception as a json encoded text string so the client can extract the fault information if they so choose.
  • Loading branch information...
1 parent 0aafec0 commit d5b80f29444e03aadc1130ab1624a09c0689fb93 @talmdal talmdal committed Jun 8, 2010
Showing with 66 additions and 38 deletions.
  1. +1 −1 modules/gallery/helpers/item_rest.php
  2. +65 −37 modules/rest/controllers/rest.php
@@ -161,7 +161,7 @@ static function post($request) {
case "photo":
case "movie":
if (empty($request->file)) {
- throw new Rest_Exception("Bad Request: Upload failed", 400);
+ throw new Rest_Exception("file: Upload failed", 400);
}
$item->type = $entity->type;
$item->parent_id = $parent->id;
@@ -39,54 +39,82 @@ public function index() {
}
public function __call($function, $args) {
- $input = Input::instance();
- $request = new stdClass();
-
- switch ($method = strtolower($input->server("REQUEST_METHOD"))) {
- case "get":
- $request->params = (object) $input->get();
- break;
-
- default:
- $request->params = (object) $input->post();
- if (isset($_FILES["file"])) {
- $request->file = upload::save("file");
+ try {
+ $input = Input::instance();
+ $request = new stdClass();
+
+ switch ($method = strtolower($input->server("REQUEST_METHOD"))) {
+ case "get":
+ $request->params = (object) $input->get();
+ break;
+
+ default:
+ $request->params = (object) $input->post();
+ if (isset($_FILES["file"])) {
+ $request->file = upload::save("file");
+ }
+ break;
}
- break;
- }
- if (isset($request->params->entity)) {
- $request->params->entity = json_decode($request->params->entity);
- }
- if (isset($request->params->members)) {
- $request->params->members = json_decode($request->params->members);
- }
+ if (isset($request->params->entity)) {
+ $request->params->entity = json_decode($request->params->entity);
+ }
+ if (isset($request->params->members)) {
+ $request->params->members = json_decode($request->params->members);
+ }
- $request->method = strtolower($input->server("HTTP_X_GALLERY_REQUEST_METHOD", $method));
- $request->access_key = $input->server("HTTP_X_GALLERY_REQUEST_KEY");
+ $request->method = strtolower($input->server("HTTP_X_GALLERY_REQUEST_METHOD", $method));
+ $request->access_key = $input->server("HTTP_X_GALLERY_REQUEST_KEY");
- if (empty($request->access_key) && !empty($request->params->access_key)) {
- $request->access_key = $request->params->access_key;
- }
+ if (empty($request->access_key) && !empty($request->params->access_key)) {
+ $request->access_key = $request->params->access_key;
+ }
+
+ $request->url = url::abs_current(true);
- $request->url = url::abs_current(true);
+ rest::set_active_user($request->access_key);
- rest::set_active_user($request->access_key);
+ $handler_class = "{$function}_rest";
+ $handler_method = $request->method;
- $handler_class = "{$function}_rest";
- $handler_method = $request->method;
+ if (!method_exists($handler_class, $handler_method)) {
+ throw new Rest_Exception("Bad Request", 400);
+ }
- if (!method_exists($handler_class, $handler_method)) {
- throw new Rest_Exception("Bad Request", 400);
+ $response = call_user_func(array($handler_class, $handler_method), $request);
+ } catch (Exception $e) {
+ $response = $this->_format_exception_response($e);
}
- try {
- rest::reply(call_user_func(array($handler_class, $handler_method), $request));
- } catch (ORM_Validation_Exception $e) {
- foreach ($e->validation->errors() as $key => $value) {
- $msgs[] = "$key: $value";
+ rest::reply($response);
+ }
+
+ private function _format_exception_response($e) {
+ // Add this exception to the log
+ Kohana_Log::add('error', Kohana_Exception::text($e));
+
+ $e->sendHeaders();
+
+ $rest_exception = array();
+ if ($e instanceof ORM_Validation_Exception) {
+ $detail_response = true;
+ $rest_exception["code"] = 400;
+ $rest_exception["message"] = t("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();
}
- throw new Rest_Exception("Bad Request: " . join(", ", $msgs), 400);
+ header("HTTP/1.1 400 Bad Request");
+ } else {
+ $rest_exception["code"] = 500;
+ $rest_exception["message"] = t("Remote server call failed. Please contact the Adminstrator.");
}
+
+ return $rest_exception;
}
}

0 comments on commit d5b80f2

Please sign in to comment.