diff --git a/webservice/rest/locallib.php b/webservice/rest/locallib.php index afe7c357862..3fe38ea8b9f 100644 --- a/webservice/rest/locallib.php +++ b/webservice/rest/locallib.php @@ -82,56 +82,69 @@ class webservice_rest_server extends webservice_base_server { * @return void */ protected function send_response() { - $this->send_headers(); - if ($this->restformat == 'json') { - try { - $response = external_api::clean_returnvalue($this->function->returns_desc, $this->returns); - } catch (Exception $ex) { - $error = new stdClass; - $error->exception = get_class($ex); - $error->message = $ex->getMessage(); - if (debugging() and isset($ex->debuginfo)) { - $error->debuginfo = $ex->debuginfo; - } - echo json_encode($error); - } - $json = json_encode($response); - echo $json; - } else { - $xml = '<?xml version="1.0" encoding="UTF-8" ?>'."\n"; - $xml .= '<RESPONSE>'."\n"; - $xml .= self::xmlize_result($this->returns, $this->function->returns_desc); - $xml .= '</RESPONSE>'."\n"; - echo $xml; + + //Check that the returned values are valid + try { + $validatedvalues = external_api::clean_returnvalue($this->function->returns_desc, $this->returns); + } catch (Exception $ex) { + $exception = $ex; } + + if (!empty($exception)) { + $response = $this->generate_error($exception); + } else { + //We can now convert the response to the requested REST format + if ($this->restformat == 'json') { + $response = json_encode($validatedvalues); + } else { + $response = '<?xml version="1.0" encoding="UTF-8" ?>'."\n"; + $response .= '<RESPONSE>'."\n"; + $response .= self::xmlize_result($this->returns, $this->function->returns_desc); + $response .= '</RESPONSE>'."\n"; + } + } + + $this->send_headers(); + echo $response; } /** * Send the error information to the WS client * formatted as XML document. + * Note: the exception is never passed as null, + * it only matches the abstract function declaration. * @param exception $ex * @return void */ protected function send_error($ex=null) { $this->send_headers(); + echo $this->generate_error($ex); + } + + /** + * Build the error information matching the REST returned value format (JSON or XML) + * @param exception $ex + * @return string the error in the requested REST format + */ + protected function generate_error($ex) { if ($this->restformat == 'json') { - $error = new stdClass; - $error->exception = get_class($ex); - $error->message = $ex->getMessage(); + $errorobject = new stdClass; + $errorobject->exception = get_class($ex); + $errorobject->message = $ex->getMessage(); if (debugging() and isset($ex->debuginfo)) { - $error->debuginfo = $ex->debuginfo; + $errorobject->debuginfo = $ex->debuginfo; } - echo json_encode($error); + $error = json_encode($errorobject); } else { - $xml = '<?xml version="1.0" encoding="UTF-8" ?>'."\n"; - $xml .= '<EXCEPTION class="'.get_class($ex).'">'."\n"; - $xml .= '<MESSAGE>'.htmlentities($ex->getMessage(), ENT_COMPAT, 'UTF-8').'</MESSAGE>'."\n"; + $error = '<?xml version="1.0" encoding="UTF-8" ?>'."\n"; + $error .= '<EXCEPTION class="'.get_class($ex).'">'."\n"; + $error .= '<MESSAGE>'.htmlentities($ex->getMessage(), ENT_COMPAT, 'UTF-8').'</MESSAGE>'."\n"; if (debugging() and isset($ex->debuginfo)) { - $xml .= '<DEBUGINFO>'.htmlentities($ex->debuginfo, ENT_COMPAT, 'UTF-8').'</DEBUGINFO>'."\n"; + $error .= '<DEBUGINFO>'.htmlentities($ex->debuginfo, ENT_COMPAT, 'UTF-8').'</DEBUGINFO>'."\n"; } - $xml .= '</EXCEPTION>'."\n"; - echo $xml; + $error .= '</EXCEPTION>'."\n"; } + return $error; } /** @@ -185,15 +198,6 @@ class webservice_rest_server extends webservice_base_server { } else if ($desc instanceof external_single_structure) { $single = '<SINGLE>'."\n"; foreach ($desc->keys as $key=>$subdesc) { - if (!array_key_exists($key, $returns)) { - if ($subdesc->required == VALUE_REQUIRED) { - $single .= '<ERROR>Missing required key "'.$key.'"</ERROR>'; - continue; - } else { - //optional field - continue; - } - } $single .= '<KEY name="'.$key.'">'.self::xmlize_result($returns[$key], $subdesc).'</KEY>'."\n"; } $single .= '</SINGLE>'."\n";