Exemple #1
0
 /**
  * Processes API responses.
  *
  * @param string $response The raw response from an API call.
  * @param array $expectedstructure A structure to validate.
  * @return array|null Array if successful, null if not.
  */
 public function process_apicall_response($response, array $expectedstructure = array())
 {
     $backtrace = debug_backtrace(0);
     $callingclass = isset($backtrace[1]['class']) ? $backtrace[1]['class'] : '?';
     $callingfunc = isset($backtrace[1]['function']) ? $backtrace[1]['function'] : '?';
     $callingline = isset($backtrace[0]['line']) ? $backtrace[0]['line'] : '?';
     $caller = $callingclass . '::' . $callingfunc . ':' . $callingline;
     $result = @json_decode($response, true);
     if (empty($result) || !is_array($result)) {
         \local_o365\utils::debug('Bad response received', $caller, $response);
         throw new \moodle_exception('erroro365apibadcall', 'local_o365');
     }
     if (isset($result['odata.error'])) {
         $errmsg = 'Error response received.';
         \local_o365\utils::debug($errmsg, $caller, $result['odata.error']);
         if (isset($result['odata.error']['message']) && isset($result['odata.error']['message']['value'])) {
             $apierrormessage = $result['odata.error']['message']['value'];
             throw new \moodle_exception('erroro365apibadcall_message', 'local_o365', '', htmlentities($apierrormessage));
         } else {
             throw new \moodle_exception('erroro365apibadcall', 'local_o365');
         }
     }
     if (isset($result['error'])) {
         $errmsg = 'Error response received.';
         \local_o365\utils::debug($errmsg, $caller, $result['error']);
         if (isset($result['error']['message'])) {
             $apierrormessage = 'Unknown error, check logs for more information.';
             if (is_string($result['error']['message'])) {
                 $apierrormessage = $result['error']['message'];
             } else {
                 if (is_array($result['error']['message']) && isset($result['error']['message']['value'])) {
                     $apierrormessage = $result['error']['message']['value'];
                 }
             }
             throw new \moodle_exception('erroro365apibadcall_message', 'local_o365', '', htmlentities($apierrormessage));
         } else {
             throw new \moodle_exception('erroro365apibadcall', 'local_o365');
         }
     }
     foreach ($expectedstructure as $key => $val) {
         if (!isset($result[$key])) {
             $errmsg = 'Invalid structure received. No "' . $key . '"';
             \local_o365\utils::debug($errmsg, $caller, $result);
             throw new \moodle_exception('erroro365apibadcall_message', 'local_o365', '', $errmsg);
         }
         if ($val !== null && $result[$key] !== $val) {
             $strreceivedval = \local_o365\utils::tostring($result[$key]);
             $strval = \local_o365\utils::tostring($val);
             $errmsg = 'Invalid structure received. Invalid "' . $key . '". Received "' . $strreceivedval . '", expected "' . $strval . '"';
             \local_o365\utils::debug($errmsg, $caller, $result);
             throw new \moodle_exception('erroro365apibadcall_message', 'local_o365', '', $errmsg);
         }
     }
     return $result;
 }