From 8fd9acb2ce336a07a185339b8a7b273145928f40 Mon Sep 17 00:00:00 2001 From: Romain Quetiez Date: Mon, 26 Sep 2016 19:11:08 +0000 Subject: [PATCH] N.440 Remote troubleshooting: when the REST/JSON API fails due to malformed utf8 characters, return a meaningful json error message (explain + debug information) instead of an empty response SVN:trunk[4417] --- webservices/rest.php | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/webservices/rest.php b/webservices/rest.php index a307bd878c..9a49c3bd03 100644 --- a/webservices/rest.php +++ b/webservices/rest.php @@ -86,6 +86,22 @@ class RestResultListOperations extends RestResult } } +if (!function_exists('json_last_error_msg')) { + function json_last_error_msg() { + static $ERRORS = array( + JSON_ERROR_NONE => 'No error', + JSON_ERROR_DEPTH => 'Maximum stack depth exceeded', + JSON_ERROR_STATE_MISMATCH => 'State mismatch (invalid or malformed JSON)', + JSON_ERROR_CTRL_CHAR => 'Control character error, possibly incorrectly encoded', + JSON_ERROR_SYNTAX => 'Syntax error', + JSON_ERROR_UTF8 => 'Malformed UTF-8 characters, possibly incorrectly encoded' + ); + + $error = json_last_error(); + return isset($ERRORS[$error]) ? $ERRORS[$error] : 'Unknown error'; + } +} + //////////////////////////////////////////////////////////////////////////////// // // Main @@ -215,6 +231,14 @@ catch(Exception $e) // $sResponse = json_encode($oResult); +if ($sResponse === false) +{ + $oJsonIssue = new RestResult(); + $oJsonIssue->code = RestResult::INTERNAL_ERROR; + $oJsonIssue->message = 'json encoding failed with message: '.json_last_error_msg().'. Full response structure for debugging purposes (print_r+bin2hex): '.bin2hex(print_r($oResult, true)); + $sResponse = json_encode($oJsonIssue); +} + $oP->add_header('Access-Control-Allow-Origin: *'); $sCallback = utils::ReadParam('callback', null);