1: <?php
2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
26:
27: 28: 29: 30: 31: 32: 33:
34: class Mage_Api_Model_Server_Adapter_Soap
35: extends Varien_Object
36: implements Mage_Api_Model_Server_Adapter_Interface
37: {
38: 39: 40: 41: 42:
43: protected $_soap = null;
44:
45: 46: 47: 48: 49: 50:
51: public function setHandler($handler)
52: {
53: $this->setData('handler', $handler);
54: return $this;
55: }
56:
57: 58: 59: 60: 61:
62: public function getHandler()
63: {
64: return $this->getData('handler');
65: }
66:
67: 68: 69: 70: 71: 72:
73: public function setController(Mage_Api_Controller_Action $controller)
74: {
75: $this->setData('controller', $controller);
76: return $this;
77: }
78:
79: 80: 81: 82: 83:
84: public function getController()
85: {
86: $controller = $this->getData('controller');
87:
88: if (null === $controller) {
89: $controller = new Varien_Object(
90: array('request' => Mage::app()->getRequest(), 'response' => Mage::app()->getResponse())
91: );
92:
93: $this->setData('controller', $controller);
94: }
95: return $controller;
96: }
97:
98: 99: 100: 101: 102: 103:
104: public function run()
105: {
106: $apiConfigCharset = Mage::getStoreConfig("api/config/charset");
107:
108: if ($this->getController()->getRequest()->getParam('wsdl') !== null) {
109:
110: $io = new Varien_Io_File();
111: $io->open(array('path'=>Mage::getModuleDir('etc', 'Mage_Api')));
112:
113: $wsdlContent = $io->read('wsdl.xml');
114:
115: $template = Mage::getModel('core/email_template_filter');
116:
117: $wsdlConfig = new Varien_Object();
118: $queryParams = $this->getController()->getRequest()->getQuery();
119: if (isset($queryParams['wsdl'])) {
120: unset($queryParams['wsdl']);
121: }
122:
123: $wsdlConfig->setUrl(htmlspecialchars(Mage::getUrl('*/*/*', array('_query'=>$queryParams))));
124: $wsdlConfig->setName('Magento');
125: $wsdlConfig->setHandler($this->getHandler());
126:
127: $template->setVariables(array('wsdl' => $wsdlConfig));
128:
129: $this->getController()->getResponse()
130: ->clearHeaders()
131: ->setHeader('Content-Type','text/xml; charset='.$apiConfigCharset)
132: ->setBody(
133: preg_replace(
134: '/<\?xml version="([^\"]+)"([^\>]+)>/i',
135: '<?xml version="$1" encoding="'.$apiConfigCharset.'"?>',
136: $template->filter($wsdlContent)
137: )
138: );
139: } else {
140: try {
141: $this->_instantiateServer();
142:
143: $this->getController()->getResponse()
144: ->clearHeaders()
145: ->setHeader('Content-Type','text/xml; charset='.$apiConfigCharset)
146: ->setBody(
147: preg_replace(
148: '/<\?xml version="([^\"]+)"([^\>]+)>/i',
149: '<?xml version="$1" encoding="'.$apiConfigCharset.'"?>',
150: $this->_soap->handle()
151: )
152: );
153: } catch( Zend_Soap_Server_Exception $e ) {
154: $this->fault( $e->getCode(), $e->getMessage() );
155: } catch( Exception $e ) {
156: $this->fault( $e->getCode(), $e->getMessage() );
157: }
158: }
159:
160: return $this;
161: }
162:
163: 164: 165: 166: 167: 168:
169: public function fault($code, $message)
170: {
171: if ($this->_extensionLoaded()) {
172: throw new SoapFault($code, $message);
173: } else {
174: die('<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
175: <SOAP-ENV:Body>
176: <SOAP-ENV:Fault>
177: <faultcode>' . $code . '</faultcode>
178: <faultstring>' . $message . '</faultstring>
179: </SOAP-ENV:Fault>
180: </SOAP-ENV:Body>
181: </SOAP-ENV:Envelope>');
182: }
183:
184: }
185:
186: 187: 188: 189: 190:
191: protected function _extensionLoaded()
192: {
193: return class_exists('SoapServer', false);
194: }
195:
196: 197: 198: 199: 200: 201:
202: protected function getWsdlUrl($params = null, $withAuth = true)
203: {
204: $urlModel = Mage::getModel('core/url')
205: ->setUseSession(false);
206:
207: $wsdlUrl = $params !== null
208: ? $urlModel->getUrl('*/*/*', array('_current' => true, '_query' => $params))
209: : $urlModel->getUrl('*/*/*');
210:
211: if( $withAuth ) {
212: $phpAuthUser = $this->getController()->getRequest()->getServer('PHP_AUTH_USER', false);
213: $phpAuthPw = $this->getController()->getRequest()->getServer('PHP_AUTH_PW', false);
214:
215: if ($phpAuthUser && $phpAuthPw) {
216: $wsdlUrl = sprintf("http://%s:%s@%s", $phpAuthUser, $phpAuthPw, str_replace('http://', '', $wsdlUrl ));
217: }
218: }
219:
220: return $wsdlUrl;
221: }
222:
223: 224: 225: 226: 227: 228:
229: protected function _instantiateServer()
230: {
231: $apiConfigCharset = Mage::getStoreConfig('api/config/charset');
232: $wsdlCacheEnabled = (bool) Mage::getStoreConfig('api/config/wsdl_cache_enabled');
233:
234: if ($wsdlCacheEnabled) {
235: ini_set('soap.wsdl_cache_enabled', '1');
236: } else {
237: ini_set('soap.wsdl_cache_enabled', '0');
238: }
239:
240: $tries = 0;
241: do {
242: $retry = false;
243: try {
244: $this->_soap = new Zend_Soap_Server($this->getWsdlUrl(array("wsdl" => 1)),
245: array('encoding' => $apiConfigCharset));
246: } catch (SoapFault $e) {
247: if (false !== strpos($e->getMessage(),
248: "can't import schema from 'http://schemas.xmlsoap.org/soap/encoding/'")
249: ) {
250: $retry = true;
251: sleep(1);
252: } else {
253: throw $e;
254: }
255: $tries++;
256: }
257: } while ($retry && $tries < 5);
258: use_soap_error_handler(false);
259: $this->_soap
260: ->setReturnResponse(true)
261: ->setClass($this->getHandler());
262: }
263: }
264: