123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218 |
- <?php
- /**
- * Magento-specific SOAP server.
- *
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Webapi\Model\Soap;
- use Magento\Framework\Webapi\Request;
- /**
- * SOAP Server
- *
- * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
- */
- class Server
- {
- const SOAP_DEFAULT_ENCODING = 'UTF-8';
- /**#@+
- * Path in config to Webapi settings.
- */
- const CONFIG_PATH_SOAP_CHARSET = 'webapi/soap/charset';
- /**#@-*/
- const REQUEST_PARAM_SERVICES = 'services';
- const REQUEST_PARAM_WSDL = 'wsdl';
- const REQUEST_PARAM_LIST_WSDL = 'wsdl_list';
- /**
- * @var \Magento\Framework\App\AreaList
- */
- protected $_areaList;
- /**
- * @var \Magento\Framework\Config\ScopeInterface
- */
- protected $_configScope;
- /**
- * @var Request
- */
- protected $_request;
- /**
- * @var \Magento\Store\Model\StoreManagerInterface
- */
- protected $_storeManager;
- /**
- * @var \Magento\Webapi\Model\Soap\ServerFactory
- */
- protected $_soapServerFactory;
- /**
- * @var \Magento\Framework\Reflection\TypeProcessor
- */
- protected $_typeProcessor;
- /**
- * @var \Magento\Framework\App\Config\ScopeConfigInterface
- */
- protected $_scopeConfig;
- /**
- * @var Wsdl\Generator
- */
- private $wsdlGenerator;
- /**
- * Initialize dependencies, initialize WSDL cache.
- *
- * @param \Magento\Framework\App\AreaList $areaList
- * @param \Magento\Framework\Config\ScopeInterface $configScope
- * @param Request $request
- * @param \Magento\Store\Model\StoreManagerInterface $storeManager
- * @param \Magento\Webapi\Model\Soap\ServerFactory $soapServerFactory
- * @param \Magento\Framework\Reflection\TypeProcessor $typeProcessor
- * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
- * @param Wsdl\Generator $wsdlGenerator
- * @throws \Magento\Framework\Webapi\Exception
- */
- public function __construct(
- \Magento\Framework\App\AreaList $areaList,
- \Magento\Framework\Config\ScopeInterface $configScope,
- Request $request,
- \Magento\Store\Model\StoreManagerInterface $storeManager,
- \Magento\Webapi\Model\Soap\ServerFactory $soapServerFactory,
- \Magento\Framework\Reflection\TypeProcessor $typeProcessor,
- \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
- \Magento\Webapi\Model\Soap\Wsdl\Generator $wsdlGenerator
- ) {
- if (!extension_loaded('soap')) {
- throw new \Magento\Framework\Webapi\Exception(
- __('SOAP extension is not loaded.'),
- 0,
- \Magento\Framework\Webapi\Exception::HTTP_INTERNAL_ERROR
- );
- }
- $this->_areaList = $areaList;
- $this->_configScope = $configScope;
- $this->_request = $request;
- $this->_storeManager = $storeManager;
- $this->_soapServerFactory = $soapServerFactory;
- $this->_typeProcessor = $typeProcessor;
- $this->_scopeConfig = $scopeConfig;
- $this->wsdlGenerator = $wsdlGenerator;
- }
- /**
- * Handle SOAP request. Response is sent by SOAP server.
- *
- * @return void
- */
- public function handle()
- {
- $rawRequestBody = file_get_contents('php://input');
- $this->_checkRequest($rawRequestBody);
- $options = ['encoding' => $this->getApiCharset(), 'soap_version' => SOAP_1_2];
- $soapServer = $this->_soapServerFactory->create($this->getWsdlLocalUri(), $options);
- $soapServer->handle($rawRequestBody);
- }
- /**
- * Get WSDL local URI
- *
- * Local WSDL URI is used to be able to pass wsdl schema to SoapServer without authorization
- *
- * @return string
- */
- private function getWsdlLocalUri()
- {
- $wsdlBody = $this->wsdlGenerator->generate(
- $this->_request->getRequestedServices(),
- $this->_request->getScheme(),
- $this->_request->getHttpHost(),
- $this->generateUri()
- );
- return 'data://text/plain;base64,'.base64_encode($wsdlBody);
- }
- /**
- * Retrieve charset used in SOAP API.
- *
- * @return string
- */
- public function getApiCharset()
- {
- $charset = $this->_scopeConfig->getValue(
- self::CONFIG_PATH_SOAP_CHARSET,
- \Magento\Store\Model\ScopeInterface::SCOPE_STORE
- );
- return $charset ? $charset : self::SOAP_DEFAULT_ENCODING;
- }
- /**
- * Get SOAP endpoint URL.
- *
- * @param bool $isWsdl
- * @return string
- */
- public function generateUri($isWsdl = false)
- {
- $params = [self::REQUEST_PARAM_SERVICES => $this->_request->getParam(self::REQUEST_PARAM_SERVICES)];
- if ($isWsdl) {
- $params[self::REQUEST_PARAM_WSDL] = true;
- }
- $query = http_build_query($params, '', '&');
- return $this->getEndpointUri() . '?' . $query;
- }
- /**
- * Generate URI of SOAP endpoint.
- *
- * @return string
- */
- public function getEndpointUri()
- {
- $storeCode = $this->_storeManager->getStore()->getCode() === \Magento\Store\Model\Store::ADMIN_CODE
- ? \Magento\Webapi\Controller\PathProcessor::ALL_STORE_CODE
- : $this->_storeManager->getStore()->getCode();
- return $this->_storeManager->getStore()->getBaseUrl()
- . $this->_areaList->getFrontName($this->_configScope->getCurrentScope())
- . '/' . $storeCode;
- }
- /**
- * Generate exception if request is invalid.
- *
- * @param string $soapRequest
- * @throws \Magento\Framework\Webapi\Exception With invalid SOAP extension
- * @return $this
- */
- protected function _checkRequest($soapRequest)
- {
- $dom = new \DOMDocument();
- if (strlen($soapRequest) == 0 || !$dom->loadXML($soapRequest)) {
- throw new \Magento\Framework\Webapi\Exception(
- __('Invalid XML'),
- 0,
- \Magento\Framework\Webapi\Exception::HTTP_INTERNAL_ERROR
- );
- }
- foreach ($dom->childNodes as $child) {
- if ($child->nodeType === XML_DOCUMENT_TYPE_NODE) {
- throw new \Magento\Framework\Webapi\Exception(
- __('Invalid XML: Detected use of illegal DOCTYPE'),
- 0,
- \Magento\Framework\Webapi\Exception::HTTP_INTERNAL_ERROR
- );
- }
- }
- return $this;
- }
- }
|