Skip to content

Commit

Permalink
Issue [#1016374] voxpelli, kylebrownig, heyrocker, bsenftner, tedbow …
Browse files Browse the repository at this point in the history
…Improve services_error() - make more consistent and standards compliant
  • Loading branch information
Kyle Browning authored and Kyle Browning committed May 4, 2011
1 parent cc7005a commit 328e5cb
Show file tree
Hide file tree
Showing 6 changed files with 43 additions and 29 deletions.
4 changes: 2 additions & 2 deletions resources/comment_resource.inc
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,7 @@ function _comment_resource_create($comment) {
$ret = drupal_execute('comment_form', $form_state, $comment_empty);

if ($errors = form_get_errors()) {
return services_error(implode(" ", $errors), 406);
return services_error(implode(" ", $errors), 406, array('form_errors' => $errors));
}

// Load latest created comment.
Expand Down Expand Up @@ -240,7 +240,7 @@ function _comment_resource_update($cid, $comment) {
drupal_execute('comment_form', $form_state, $old_comment);

if ($errors = form_get_errors()) {
return services_error(implode("\n", $errors), 406);
return services_error(implode(" ", $errors), 406, array('form_errors' => $errors));
}

return $cid;
Expand Down
4 changes: 2 additions & 2 deletions resources/node_resource.inc
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,7 @@ function _node_resource_create($node) {
$ret = drupal_execute($node['type'] . '_node_form', $form_state, (object)$node);

if ($errors = form_get_errors()) {
return services_error(implode(" ", $errors), 406);
return services_error(implode(" ", $errors), 406, array('form_errors' => $errors));
}
// Fetch $nid out of $form_state
$nid = $form_state['nid'];
Expand Down Expand Up @@ -230,7 +230,7 @@ function _node_resource_update($nid, $node) {
drupal_execute($old_node->type . '_node_form', $form_state, $old_node);

if ($errors = form_get_errors()) {
return services_error(implode(" ", $errors), 406);
return services_error(implode(" ", $errors), 406, array('form_errors' => $errors));
}
}
else {
Expand Down
4 changes: 2 additions & 2 deletions resources/user_resource.inc
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,7 @@ function _user_resource_create($account) {

// Error if needed.
if ($errors = form_get_errors()) {
return services_error(implode(" ", $errors), 406);
return services_error(implode(" ", $errors), 406, array('form_errors' => $errors));
} else {
$user = array('uid' => $form_state['user']->uid);
if ($uri = services_resource_uri(array('user', $user['uid']))) {
Expand Down Expand Up @@ -292,7 +292,7 @@ function _user_resource_update($uid, $account) {

// Error if needed.
if ($errors = form_get_errors()) {
return services_error(implode(" ", $errors), 406);
return services_error(implode(" ", $errors), 406, array('form_errors' => $errors));
}

return $account;
Expand Down
33 changes: 32 additions & 1 deletion servers/rest_server/includes/RESTServer.inc
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,13 @@ class RESTServer {
}
}

$result = services_controller_execute($controller, $arguments, $auth_arguments);
try {
$result = services_controller_execute($controller, $arguments);
} catch (ServicesException $e) {
$errors = $this->handleException($e);
drupal_alter('rest_server_exectue_errors', $errors, $controller, $arguments);
$result = $errors;
}
$formatter = $formats[$response_format];

// Set the content type and render output
Expand Down Expand Up @@ -519,6 +525,31 @@ class RESTServer {
}
}

function handleException($e){
$code = $e->getCode();
switch ($code) {
case 401:
drupal_set_header('HTTP/1.0 401 Unauthorized: ' . $e->getMessage());
break;
case 404:
drupal_set_header('HTTP/1.0 404 Not found: ' . $e->getMessage());
break;
case 406:
drupal_set_header('HTTP/1.0 406 Not Acceptable: ' . $e->getMessage());
break;
default:
if ($code >= 400 && $code < 600) {
drupal_set_header('HTTP/1.0 ' . $code . ' ' . $e->getMessage());
}
else {
drupal_set_header('HTTP/1.0 500 An error occurred: (' . $code . ') ' . $e->getMessage());
}
break;
}
if(method_exists($e,'getData')){
return $e->getData();
}
}
private function resolveController($resource, $method, $path) {
$pc = count($path);
// Use the index handler for all empty path request, except on POST
Expand Down
21 changes: 1 addition & 20 deletions servers/rest_server/rest_server.module
Original file line number Diff line number Diff line change
Expand Up @@ -38,26 +38,7 @@ function rest_server_server() {
return $server->handle($canonical_path, $endpoint_path);
}
catch (Exception $e) {
$code = $e->getCode();
switch ($code) {
case 401:
drupal_set_header('HTTP/1.0 401 Unauthorized: ' . $e->getMessage());
break;
case 404:
drupal_set_header('HTTP/1.0 404 Not found: ' . $e->getMessage());
break;
case 406:
drupal_set_header('HTTP/1.0 406 Not Acceptable: ' . $e->getMessage());
break;
default:
if ($code >= 400 && $code < 600) {
drupal_set_header('HTTP/1.0 ' . $code . ' ' . $e->getMessage());
}
else {
drupal_set_header('HTTP/1.0 500 An error occurred: (' . $code . ') ' . $e->getMessage());
}
break;
}
$server->handleException($e);
}
}

Expand Down
6 changes: 4 additions & 2 deletions services.runtime.inc
Original file line number Diff line number Diff line change
Expand Up @@ -321,10 +321,12 @@ function services_server_info_object($reset = FALSE) {
* @param int $code
* Optional. Error code. This often maps to the HTTP status codes. Defaults
* to 0.
* @param mixed $data
* Optional. Information that can be used by the server to return information about the error. Defaults to null.
* @return mixed
*/
function services_error($message, $code = 0) {
throw new ServicesException($message, $code);
function services_error($message, $code = 0, $data = NULL) {
throw new ServicesException($message, $code, $data);
}

/**
Expand Down

0 comments on commit 328e5cb

Please sign in to comment.