Skip to content

Commit

Permalink
Don't use the standard error formatting for exceptions that have occu…
Browse files Browse the repository at this point in the history
…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
Tim Almdal committed Jun 8, 2010
1 parent 0aafec0 commit d5b80f2
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 38 deletions.
2 changes: 1 addition & 1 deletion modules/gallery/helpers/item_rest.php
Expand Up @@ -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;
Expand Down
102 changes: 65 additions & 37 deletions modules/rest/controllers/rest.php
Expand Up @@ -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.