/** * Parse Request body into array of params. * * @param string $encodedBody Posted content from request. * @return array|null Return NULL if content is invalid. * @throws InvalidArgumentException * @throws Mage_Webapi_Exception If decoding error was encountered. */ public function interpret($encodedBody) { if (!is_string($encodedBody)) { throw new InvalidArgumentException(sprintf('Invalid data type "%s". String is expected.', gettype($encodedBody))); } try { /** @var Mage_Core_Helper_Data $jsonHelper */ $jsonHelper = $this->_helperFactory->get('Mage_Core_Helper_Data'); $decodedBody = $jsonHelper->jsonDecode($encodedBody); } catch (Zend_Json_Exception $e) { if (!$this->_app->isDeveloperMode()) { throw new Mage_Webapi_Exception($this->_helper->__('Decoding error.'), Mage_Webapi_Exception::HTTP_BAD_REQUEST); } else { throw new Mage_Webapi_Exception('Decoding error: ' . PHP_EOL . $e->getMessage() . PHP_EOL . $e->getTraceAsString(), Mage_Webapi_Exception::HTTP_BAD_REQUEST); } } return $decodedBody; }
/** * Convert XML document into array. * * @param string $xmlRequestBody XML document * @return array Data converted from XML document to array. Root node is excluded from response. * @throws InvalidArgumentException In case of invalid argument type. * @throws Mage_Webapi_Exception If decoding error occurs. */ public function interpret($xmlRequestBody) { if (!is_string($xmlRequestBody)) { throw new InvalidArgumentException(sprintf('Invalid data type "%s". String is expected.', gettype($xmlRequestBody))); } /** Disable external entity loading to prevent possible vulnerability */ $previousLoaderState = libxml_disable_entity_loader(true); set_error_handler(array($this, 'handleErrors')); $this->_xmlParser->loadXML($xmlRequestBody); restore_error_handler(); libxml_disable_entity_loader($previousLoaderState); /** Process errors during XML parsing. */ if ($this->_errorMessage !== null) { if (!$this->_app->isDeveloperMode()) { $exceptionMessage = $this->_helper->__('Decoding error.'); } else { $exceptionMessage = 'Decoding Error: ' . $this->_errorMessage; } throw new Mage_Webapi_Exception($exceptionMessage, Mage_Webapi_Exception::HTTP_BAD_REQUEST); } $data = $this->_xmlParser->xmlToArray(); /** Data will always have exactly one element so it is safe to call reset here. */ return reset($data); }
public function apiShutdownFunction() { $fatalErrorFlag = E_ERROR | E_USER_ERROR | E_PARSE | E_CORE_ERROR | E_COMPILE_ERROR | E_RECOVERABLE_ERROR; $error = error_get_last(); if ($error && $error['type'] & $fatalErrorFlag) { $errorMessage = ''; switch ($error['type']) { case E_ERROR: $errorMessage .= "Fatal Error"; break; case E_PARSE: $errorMessage .= "Parse Error"; break; case E_CORE_ERROR: $errorMessage .= "Core Error"; break; case E_COMPILE_ERROR: $errorMessage .= "Compile Error"; break; case E_USER_ERROR: $errorMessage .= "User Error"; break; case E_RECOVERABLE_ERROR: $errorMessage .= "Recoverable Error"; break; default: $errorMessage .= "Unknown error ({$error['type']})"; break; } $errorMessage .= ": {$error['message']} in {$error['file']} on line {$error['line']}"; try { // call registered error dispatcher trigger_error("'{$errorMessage}'", E_USER_ERROR); } catch (Exception $e) { $errorMessage = $e->getMessage(); } if (!$this->_app->isDeveloperMode()) { $this->_saveFatalErrorReport($errorMessage); } $this->render($errorMessage); } }
/** * Check if specified method is deprecated or removed. * * Throw exception in two cases:<br/> * - method is removed<br/> * - method is deprecated and developer mode is enabled * * @param string $resourceName * @param string $method * @param string $resourceVersion * @throws Mage_Webapi_Exception * @throws LogicException */ public function checkDeprecationPolicy($resourceName, $method, $resourceVersion) { $deprecationPolicy = $this->getDeprecationPolicy($resourceName, $method, $resourceVersion); if ($deprecationPolicy) { /** Initialize message with information about what method should be used instead of requested one. */ if (isset($deprecationPolicy['use_resource']) && isset($deprecationPolicy['use_method']) && isset($deprecationPolicy['use_version'])) { $messageUseMethod = $this->_helper->__('Please use version "%s" of "%s" method in "%s" resource instead.', $deprecationPolicy['use_version'], $deprecationPolicy['use_method'], $deprecationPolicy['use_resource']); } else { $messageUseMethod = ''; } $badRequestCode = Mage_Webapi_Exception::HTTP_BAD_REQUEST; if (isset($deprecationPolicy['removed'])) { $removalMessage = $this->_helper->__('Version "%s" of "%s" method in "%s" resource was removed.', $resourceVersion, $method, $resourceName); throw new Mage_Webapi_Exception($removalMessage . ' ' . $messageUseMethod, $badRequestCode); } elseif (isset($deprecationPolicy['deprecated']) && $this->_app->isDeveloperMode()) { $deprecationMessage = $this->_helper->__('Version "%s" of "%s" method in "%s" resource is deprecated.', $resourceVersion, $method, $resourceName); throw new Mage_Webapi_Exception($deprecationMessage . ' ' . $messageUseMethod, $badRequestCode); } } }
/** * Generate and set HTTP response code, error messages to Response object. */ protected function _renderMessages() { $formattedMessages = array(); $formattedMessages['messages'] = $this->getMessages(); $responseHttpCode = null; /** @var Exception $exception */ foreach ($this->getException() as $exception) { $code = $exception instanceof Mage_Webapi_Exception ? $exception->getCode() : Mage_Webapi_Exception::HTTP_INTERNAL_ERROR; $messageData = array('code' => $code, 'message' => $exception->getMessage()); if ($this->_app->isDeveloperMode()) { $messageData['trace'] = $exception->getTraceAsString(); } $formattedMessages['messages']['error'][] = $messageData; // keep HTTP code for response $responseHttpCode = $code; } // set HTTP code of the last error, Content-Type, and all rendered error messages to body $this->setHttpResponseCode($responseHttpCode); $this->setMimeType($this->_renderer->getMimeType()); $this->setBody($this->_renderer->render($formattedMessages)); return $this; }