/** Executes the needed operator(s). Checks operator names, and calls the appropriate functions. */ function modify(&$tpl, &$operatorName, &$operatorParameters, &$rootNamespace, &$currentNamespace, &$operatorValue, &$namedParameters) { switch ($operatorName) { case 'washxml': $operatorValue = str_replace(array('&', '"', "'", '<', '>'), array('&', '"', ''', '<', '>'), $operatorValue); break; case 'washxmlcomment': // in xml comments the -- string is not permitted $operatorValue = str_replace('--', '_-', $operatorValue); break; case 'washxmlcdata': /// @todo eZDebug::writeWarning('Template operator washxmlcdata not yet implemented, it should not be used!', __METHOD__); break; case 'xsdtype': $operatorValue = ggWSDLParser::phpType2xsdType($operatorValue, $namedParameters['targetprefix'], $namedParameters['xsdprefix'], $namedParameters['soapencprefix']); break; case 'classInspect': $operatorValue = ggeZWebservices::classInspect($operatorValue); break; } }
/** * This method intercepts calls to system.listMethods and syste.methodSignature * to transform them into wsdl-based calls. This way client-side code which * uses those method calls can be used identically regardless of protocol * in use */ function send($request) { $this->RequestPayload = ''; $this->ResponsePayload = ''; /// @todo add a check that request is a soap / phpsoap one, or it will have no namespace method... // nb: php soap code wants an integer as SoapVersion, eg. "2" will not work $options = array('exceptions' => true, 'soap_version' => (int) $this->SoapVersion); if ($this->CacheWSDL >= 0) { $options['cache_wsdl'] = $this->CacheWSDL; } /* if ( $this->Login != '' ) { $options['login'] = $this->Login; $options['password'] = $this->Password; } if ( $this->Proxy != '' ) { $options['proxy_host'] = $this->Proxy; $options['proxy_port'] = $this->ProxyPort; if ( $this->ProxyLogin != '' ) { $options['proxy_login'] = $this->ProxyLogin; $options['proxy_password'] = $this->ProxyPassword; } }*/ if ($this->Wsdl == null) { // non-wsdl mode $options['location'] = $this->Protocol . "://" . $this->Server . ":" . $this->Port . $this->Path; /// @todo test if request is not a ggsoaprequest / ggphpsoaprequest /// and has thus no ->ns() method $options['uri'] = $request->ns(); } else { if (preg_match('#^https?://#', $this->Wsdl) && $this->Timeout != 0) { // patch around buggy soapclient behaviour: force socket timeout on getting wsdl call $deftimeout = ini_get('default_socket_timeout'); if ($deftimeout != $this->Timeout) { ini_set('default_socket_timeout', $this->Timeout); } else { unset($deftimeout); } } } try { $response = new $this->ResponseClass(); $client = new ggPhpSOAPClientTransport($this->Wsdl, $options, $this, $request); if (isset($deftimeout)) { ini_set('default_socket_timeout', $deftimeout); } // a hackish way to emulate listMethods calls $rname = $request->name(); if ($rname == 'system.listMethods' || $rname == 'system.methodSignature') { $results = $client->__getFunctions(); if (!is_array($results)) { throw new Exception('Could not parse wsdl into array of functions'); } else { $mname = ''; if ($rname == 'system.methodSignature') { $mname = $request->parameters(); $mname = $mname[0]; } $results = ggWSDLParser::transformGetFunctionsResults($results, $rname, $mname); } } else { $results = $client->__soapCall($rname, $request->parameters(), array(), array(), $output_headers); } // phpSoapResponse responses do not parse anything anyway - no need to call this //$rawResponse = $client->__getLastResponse(); //$response->decodeStream( $request, $rawResponse ); if (is_soap_fault($results)) { $response->setValue(new ggWebservicesFault($results->faultcode, $results->faultstring)); } else { if ($this->returnArrays) { $results = $this->toArray($results); } $response->setValue($results); } return $response; } catch (exception $e) { if (isset($deftimeout)) { ini_set('default_socket_timeout', $deftimeout); } if ($this->errorNumber()) { $response->setValue(new ggWebservicesFault($this->errorNumber(), $this->errorString())); } else { if ($e instanceof SoapFault) { $response->setValue(new ggWebservicesFault($e->faultcode, $e->faultstring)); } else { $response->setValue(new ggWebservicesFault($e->getCode(), $e->getMessage())); } } return $response; } }