| 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 |
class soapclient extends nusoap_base { |
|---|
| 26 |
|
|---|
| 27 |
var $username = ''; |
|---|
| 28 |
var $password = ''; |
|---|
| 29 |
var $authtype = ''; |
|---|
| 30 |
var $certRequest = array(); |
|---|
| 31 |
var $requestHeaders = false; |
|---|
| 32 |
var $responseHeaders = ''; |
|---|
| 33 |
var $document = ''; |
|---|
| 34 |
var $endpoint; |
|---|
| 35 |
var $forceEndpoint = ''; |
|---|
| 36 |
var $proxyhost = ''; |
|---|
| 37 |
var $proxyport = ''; |
|---|
| 38 |
var $proxyusername = ''; |
|---|
| 39 |
var $proxypassword = ''; |
|---|
| 40 |
var $xml_encoding = ''; |
|---|
| 41 |
var $http_encoding = false; |
|---|
| 42 |
var $timeout = 0; |
|---|
| 43 |
var $response_timeout = 30; |
|---|
| 44 |
var $endpointType = ''; |
|---|
| 45 |
var $persistentConnection = false; |
|---|
| 46 |
var $defaultRpcParams = false; |
|---|
| 47 |
var $request = ''; |
|---|
| 48 |
var $response = ''; |
|---|
| 49 |
var $responseData = ''; |
|---|
| 50 |
var $cookies = array(); |
|---|
| 51 |
var $decode_utf8 = true; |
|---|
| 52 |
var $operations = array(); |
|---|
| 53 |
|
|---|
| 54 |
/* |
|---|
| 55 |
* fault related variables |
|---|
| 56 |
*/ |
|---|
| 57 |
/** |
|---|
| 58 |
* @var fault |
|---|
| 59 |
* @access public |
|---|
| 60 |
*/ |
|---|
| 61 |
var $fault; |
|---|
| 62 |
|
|---|
| 63 |
* @var faultcode |
|---|
| 64 |
* @access public |
|---|
| 65 |
*/ |
|---|
| 66 |
var $faultcode; |
|---|
| 67 |
|
|---|
| 68 |
* @var faultstring |
|---|
| 69 |
* @access public |
|---|
| 70 |
*/ |
|---|
| 71 |
var $faultstring; |
|---|
| 72 |
|
|---|
| 73 |
* @var faultdetail |
|---|
| 74 |
* @access public |
|---|
| 75 |
*/ |
|---|
| 76 |
var $faultdetail; |
|---|
| 77 |
|
|---|
| 78 |
|
|---|
| 79 |
* constructor |
|---|
| 80 |
* |
|---|
| 81 |
* @param mixed $endpoint SOAP server or WSDL URL (string), or wsdl instance (object) |
|---|
| 82 |
* @param bool $wsdl optional, set to true if using WSDL |
|---|
| 83 |
* @param int $portName optional portName in WSDL document |
|---|
| 84 |
* @param string $proxyhost |
|---|
| 85 |
* @param string $proxyport |
|---|
| 86 |
* @param string $proxyusername |
|---|
| 87 |
* @param string $proxypassword |
|---|
| 88 |
* @param integer $timeout set the connection timeout |
|---|
| 89 |
* @param integer $response_timeout set the response timeout |
|---|
| 90 |
* @access public |
|---|
| 91 |
*/ |
|---|
| 92 |
function soapclient($endpoint,$wsdl = false,$proxyhost = false,$proxyport = false,$proxyusername = false, $proxypassword = false, $timeout = 0, $response_timeout = 30){ |
|---|
| 93 |
parent::nusoap_base(); |
|---|
| 94 |
$this->endpoint = $endpoint; |
|---|
| 95 |
$this->proxyhost = $proxyhost; |
|---|
| 96 |
$this->proxyport = $proxyport; |
|---|
| 97 |
$this->proxyusername = $proxyusername; |
|---|
| 98 |
$this->proxypassword = $proxypassword; |
|---|
| 99 |
$this->timeout = $timeout; |
|---|
| 100 |
$this->response_timeout = $response_timeout; |
|---|
| 101 |
|
|---|
| 102 |
|
|---|
| 103 |
if($wsdl){ |
|---|
| 104 |
if (is_object($endpoint) && (get_class($endpoint) == 'wsdl')) { |
|---|
| 105 |
$this->wsdl = $endpoint; |
|---|
| 106 |
$this->endpoint = $this->wsdl->wsdl; |
|---|
| 107 |
$this->wsdlFile = $this->endpoint; |
|---|
| 108 |
$this->debug('existing wsdl instance created from ' . $this->endpoint); |
|---|
| 109 |
} else { |
|---|
| 110 |
$this->wsdlFile = $this->endpoint; |
|---|
| 111 |
|
|---|
| 112 |
|
|---|
| 113 |
$this->debug('instantiating wsdl class with doc: '.$endpoint); |
|---|
| 114 |
$this->wsdl =& new wsdl($this->wsdlFile,$this->proxyhost,$this->proxyport,$this->proxyusername,$this->proxypassword,$this->timeout,$this->response_timeout); |
|---|
| 115 |
} |
|---|
| 116 |
$this->appendDebug($this->wsdl->getDebug()); |
|---|
| 117 |
$this->wsdl->clearDebug(); |
|---|
| 118 |
|
|---|
| 119 |
if($errstr = $this->wsdl->getError()){ |
|---|
| 120 |
$this->debug('got wsdl error: '.$errstr); |
|---|
| 121 |
$this->setError('wsdl error: '.$errstr); |
|---|
| 122 |
} elseif($this->operations = $this->wsdl->getOperations()){ |
|---|
| 123 |
$this->debug( 'got '.count($this->operations).' operations from wsdl '.$this->wsdlFile); |
|---|
| 124 |
$this->endpointType = 'wsdl'; |
|---|
| 125 |
} else { |
|---|
| 126 |
$this->debug( 'getOperations returned false'); |
|---|
| 127 |
$this->setError('no operations defined in the WSDL document!'); |
|---|
| 128 |
} |
|---|
| 129 |
} else { |
|---|
| 130 |
$this->debug("instantiate SOAP with endpoint at $endpoint"); |
|---|
| 131 |
$this->endpointType = 'soap'; |
|---|
| 132 |
} |
|---|
| 133 |
} |
|---|
| 134 |
|
|---|
| 135 |
|
|---|
| 136 |
* calls method, returns PHP native type |
|---|
| 137 |
* |
|---|
| 138 |
* @param string $method SOAP server URL or path |
|---|
| 139 |
* @param mixed $params An array, associative or simple, of the parameters |
|---|
| 140 |
* for the method call, or a string that is the XML |
|---|
| 141 |
* for the call. For rpc style, this call will |
|---|
| 142 |
* wrap the XML in a tag named after the method, as |
|---|
| 143 |
* well as the SOAP Envelope and Body. For document |
|---|
| 144 |
* style, this will only wrap with the Envelope and Body. |
|---|
| 145 |
* IMPORTANT: when using an array with document style, |
|---|
| 146 |
* in which case there |
|---|
| 147 |
* is really one parameter, the root of the fragment |
|---|
| 148 |
* used in the call, which encloses what programmers |
|---|
| 149 |
* normally think of parameters. A parameter array |
|---|
| 150 |
* *must* include the wrapper. |
|---|
| 151 |
* @param string $namespace optional method namespace (WSDL can override) |
|---|
| 152 |
* @param string $soapAction optional SOAPAction value (WSDL can override) |
|---|
| 153 |
* @param mixed $headers optional string of XML with SOAP header content, or array of soapval objects for SOAP headers |
|---|
| 154 |
* @param boolean $rpcParams optional (no longer used) |
|---|
| 155 |
* @param string $style optional (rpc|document) the style to use when serializing parameters (WSDL can override) |
|---|
| 156 |
* @param string $use optional (encoded|literal) the use when serializing parameters (WSDL can override) |
|---|
| 157 |
* @return mixed response from SOAP call |
|---|
| 158 |
* @access public |
|---|
| 159 |
*/ |
|---|
| 160 |
function call($operation,$params=array(),$namespace='http://tempuri.org',$soapAction='',$headers=false,$rpcParams=null,$style='rpc',$use='encoded'){ |
|---|
| 161 |
$this->operation = $operation; |
|---|
| 162 |
$this->fault = false; |
|---|
| 163 |
$this->setError(''); |
|---|
| 164 |
$this->request = ''; |
|---|
| 165 |
$this->response = ''; |
|---|
| 166 |
$this->responseData = ''; |
|---|
| 167 |
$this->faultstring = ''; |
|---|
| 168 |
$this->faultcode = ''; |
|---|
| 169 |
$this->opData = array(); |
|---|
| 170 |
|
|---|
| 171 |
$this->debug("call: operation=$operation, namespace=$namespace, soapAction=$soapAction, rpcParams=$rpcParams, style=$style, use=$use, endpointType=$this->endpointType"); |
|---|
| 172 |
$this->appendDebug('params=' . $this->varDump($params)); |
|---|
| 173 |
$this->appendDebug('headers=' . $this->varDump($headers)); |
|---|
| 174 |
if ($headers) { |
|---|
| 175 |
$this->requestHeaders = $headers; |
|---|
| 176 |
} |
|---|
| 177 |
|
|---|
| 178 |
if($this->endpointType == 'wsdl' && $opData = $this->getOperationData($operation)){ |
|---|
| 179 |
|
|---|
| 180 |
$this->opData = $opData; |
|---|
| 181 |
$this->debug("found operation"); |
|---|
| 182 |
$this->appendDebug('opData=' . $this->varDump($opData)); |
|---|
| 183 |
if (isset($opData['soapAction'])) { |
|---|
| 184 |
$soapAction = $opData['soapAction']; |
|---|
| 185 |
} |
|---|
| 186 |
if (! $this->forceEndpoint) { |
|---|
| 187 |
$this->endpoint = $opData['endpoint']; |
|---|
| 188 |
} else { |
|---|
| 189 |
$this->endpoint = $this->forceEndpoint; |
|---|
| 190 |
} |
|---|
| 191 |
$namespace = isset($opData['input']['namespace']) ? $opData['input']['namespace'] : $namespace; |
|---|
| 192 |
$style = $opData['style']; |
|---|
| 193 |
$use = $opData['input']['use']; |
|---|
| 194 |
|
|---|
| 195 |
if($namespace != '' && !isset($this->wsdl->namespaces[$namespace])){ |
|---|
| 196 |
$nsPrefix = 'ns' . rand(1000, 9999); |
|---|
| 197 |
$this->wsdl->namespaces[$nsPrefix] = $namespace; |
|---|
| 198 |
} |
|---|
| 199 |
$nsPrefix = $this->wsdl->getPrefixFromNamespace($namespace); |
|---|
| 200 |
|
|---|
| 201 |
if (is_string($params)) { |
|---|
| 202 |
$this->debug("serializing param string for WSDL operation $operation"); |
|---|
| 203 |
$payload = $params; |
|---|
| 204 |
} elseif (is_array($params)) { |
|---|
| 205 |
$this->debug("serializing param array for WSDL operation $operation"); |
|---|
| 206 |
$payload = $this->wsdl->serializeRPCParameters($operation,'input',$params); |
|---|
| 207 |
} else { |
|---|
| 208 |
$this->debug('params must be array or string'); |
|---|
| 209 |
$this->setError('params must be array or string'); |
|---|
| 210 |
return false; |
|---|
| 211 |
} |
|---|
| 212 |
$usedNamespaces = $this->wsdl->usedNamespaces; |
|---|
| 213 |
if (isset($opData['input']['encodingStyle'])) { |
|---|
| 214 |
$encodingStyle = $opData['input']['encodingStyle']; |
|---|
| 215 |
} else { |
|---|
| 216 |
$encodingStyle = ''; |
|---|
| 217 |
} |
|---|
| 218 |
$this->appendDebug($this->wsdl->getDebug()); |
|---|
| 219 |
$this->wsdl->clearDebug(); |
|---|
| 220 |
if ($errstr = $this->wsdl->getError()) { |
|---|
| 221 |
$this->debug('got wsdl error: '.$errstr); |
|---|
| 222 |
$this->setError('wsdl error: '.$errstr); |
|---|
| 223 |
return false; |
|---|
| 224 |
} |
|---|
| 225 |
} elseif($this->endpointType == 'wsdl') { |
|---|
| 226 |
|
|---|
| 227 |
$this->appendDebug($this->wsdl->getDebug()); |
|---|
| 228 |
$this->wsdl->clearDebug(); |
|---|
| 229 |
$this->setError( 'operation '.$operation.' not present.'); |
|---|
| 230 |
$this->debug("operation '$operation' not present."); |
|---|
| 231 |
return false; |
|---|
| 232 |
} else { |
|---|
| 233 |
|
|---|
| 234 |
//$this->namespaces['ns1'] = $namespace; |
|---|
| 235 |
$nsPrefix = 'ns' . rand(1000, 9999); |
|---|
| 236 |
|
|---|
| 237 |
$payload = ''; |
|---|
| 238 |
if (is_string($params)) { |
|---|
| 239 |
$this->debug("serializing param string for operation $operation"); |
|---|
| 240 |
$payload = $params; |
|---|
| 241 |
} elseif (is_array($params)) { |
|---|
| 242 |
$this->debug("serializing param array for operation $operation"); |
|---|
| 243 |
foreach($params as $k => $v){ |
|---|
| 244 |
$payload .= $this->serialize_val($v,$k,false,false,false,false,$use); |
|---|
| 245 |
} |
|---|
| 246 |
} else { |
|---|
| 247 |
$this->debug('params must be array or string'); |
|---|
| 248 |
$this->setError('params must be array or string'); |
|---|
| 249 |
return false; |
|---|
| 250 |
} |
|---|
| 251 |
$usedNamespaces = array(); |
|---|
| 252 |
if ($use == 'encoded') { |
|---|
| 253 |
$encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/'; |
|---|
| 254 |
} else { |
|---|
| 255 |
$encodingStyle = ''; |
|---|
| 256 |
} |
|---|
| 257 |
} |
|---|
| 258 |
|
|---|
| 259 |
if ($style == 'rpc') { |
|---|
| 260 |
if ($use == 'literal') { |
|---|
| 261 |
$this->debug("wrapping RPC request with literal method element"); |
|---|
| 262 |
if ($namespace) { |
|---|
| 263 |
$payload = "<$operation xmlns=\"$namespace\">" . $payload . "</$operation>"; |
|---|
| 264 |
} else { |
|---|
| 265 |
$payload = "<$operation>" . $payload . "</$operation>"; |
|---|
| 266 |
} |
|---|
| 267 |
} else { |
|---|
| 268 |
$this->debug("wrapping RPC request with encoded method element"); |
|---|
| 269 |
if ($namespace) { |
|---|
| 270 |
$payload = "<$nsPrefix:$operation xmlns:$nsPrefix=\"$namespace\">" . |
|---|
| 271 |
$payload . |
|---|
| 272 |
"</$nsPrefix:$operation>"; |
|---|
| 273 |
} else { |
|---|
| 274 |
$payload = "<$operation>" . |
|---|
| 275 |
$payload . |
|---|
| 276 |
"</$operation>"; |
|---|
| 277 |
} |
|---|
| 278 |
} |
|---|
| 279 |
} |
|---|
| 280 |
|
|---|
| 281 |
$soapmsg = $this->serializeEnvelope($payload,$this->requestHeaders,$usedNamespaces,$style,$use,$encodingStyle); |
|---|
| 282 |
$this->debug("endpoint=$this->endpoint, soapAction=$soapAction, namespace=$namespace, style=$style, use=$use, encodingStyle=$encodingStyle"); |
|---|
| 283 |
$this->debug('SOAP message length=' . strlen($soapmsg) . ' contents (max 1000 bytes)=' . substr($soapmsg, 0, 1000)); |
|---|
| 284 |
|
|---|
| 285 |
$return = $this->send($this->getHTTPBody($soapmsg),$soapAction,$this->timeout,$this->response_timeout); |
|---|
| 286 |
if($errstr = $this->getError()){ |
|---|
| 287 |
$this->debug('Error: '.$errstr); |
|---|
| 288 |
return false; |
|---|
| 289 |
} else { |
|---|
| 290 |
$this->return = $return; |
|---|
| 291 |
$this->debug('sent message successfully and got a(n) '.gettype($return)); |
|---|
| 292 |
$this->appendDebug('return=' . $this->varDump($return)); |
|---|
| 293 |
|
|---|
| 294 |
|
|---|
| 295 |
if(is_array($return) && isset($return['faultcode'])){ |
|---|
| 296 |
$this->debug('got fault'); |
|---|
| 297 |
$this->setError($return['faultcode'].': '.$return['faultstring']); |
|---|
| 298 |
$this->fault = true; |
|---|
| 299 |
foreach($return as $k => $v){ |
|---|
| 300 |
$this->$k = $v; |
|---|
| 301 |
$this->debug("$k = $v<br>"); |
|---|
| 302 |
} |
|---|
| 303 |
return $return; |
|---|
| 304 |
} elseif ($style == 'document') { |
|---|
| 305 |
|
|---|
| 306 |
// we are only going to return the first part here...sorry about that |
|---|
| 307 |
return $return; |
|---|
| 308 |
} else { |
|---|
| 309 |
|
|---|
| 310 |
if(is_array($return)){ |
|---|
| 311 |
|
|---|
| 312 |
// in the array |
|---|
| 313 |
if(sizeof($return) > 1){ |
|---|
| 314 |
return $return; |
|---|
| 315 |
} |
|---|
| 316 |
|
|---|
| 317 |
$return = array_shift($return); |
|---|
| 318 |
$this->debug('return shifted value: '); |
|---|
| 319 |
$this->appendDebug($this->varDump($return)); |
|---|
| 320 |
return $return; |
|---|
| 321 |
|
|---|
| 322 |
} else { |
|---|
| 323 |
return ""; |
|---|
| 324 |
} |
|---|
| 325 |
} |
|---|
| 326 |
} |
|---|
| 327 |
} |
|---|
| 328 |
|
|---|
| 329 |
|
|---|
| 330 |
* get available data pertaining to an operation |
|---|
| 331 |
* |
|---|
| 332 |
* @param string $operation operation name |
|---|
| 333 |
* @return array array of data pertaining to the operation |
|---|
| 334 |
* @access public |
|---|
| 335 |
*/ |
|---|
| 336 |
function getOperationData($operation){ |
|---|
| 337 |
if(isset($this->operations[$operation])){ |
|---|
| 338 |
return $this->operations[$operation]; |
|---|
| 339 |
} |
|---|
| 340 |
$this->debug("No data for operation: $operation"); |
|---|
| 341 |
} |
|---|
| 342 |
|
|---|
| 343 |
|
|---|
| 344 |
* send the SOAP message |
|---|
| 345 |
* |
|---|
| 346 |
* Note: if the operation has multiple return values |
|---|
| 347 |
* the return value of this method will be an array |
|---|
| 348 |
* of those values. |
|---|
| 349 |
* |
|---|
| 350 |
* @param string $msg a SOAPx4 soapmsg object |
|---|
| 351 |
* @param string $soapaction SOAPAction value |
|---|
| 352 |
* @param integer $timeout set connection timeout in seconds |
|---|
| 353 |
* @param integer $response_timeout set response timeout in seconds |
|---|
| 354 |
* @return mixed native PHP types. |
|---|
| 355 |
* @access private |
|---|
| 356 |
*/ |
|---|
| 357 |
function send($msg, $soapaction = '', $timeout=0, $response_timeout=30) { |
|---|
| 358 |
$this->checkCookies(); |
|---|
| 359 |
|
|---|
| 360 |
switch(true){ |
|---|
| 361 |
|
|---|
| 362 |
case ereg('^http',$this->endpoint): |
|---|
| 363 |
$this->debug('transporting via HTTP'); |
|---|
| 364 |
if($this->persistentConnection == true && is_object($this->persistentConnection)){ |
|---|
| 365 |
$http =& $this->persistentConnection; |
|---|
| 366 |
} else { |
|---|
| 367 |
$http = new soap_transport_http($this->endpoint); |
|---|
| 368 |
if ($this->persistentConnection) { |
|---|
| 369 |
$http->usePersistentConnection(); |
|---|
| 370 |
} |
|---|
| 371 |
} |
|---|
| 372 |
$http->setContentType($this->getHTTPContentType(), $this->getHTTPContentTypeCharset()); |
|---|
| 373 |
$http->setSOAPAction($soapaction); |
|---|
| 374 |
if($this->proxyhost && $this->proxyport){ |
|---|
| 375 |
$http->setProxy($this->proxyhost,$this->proxyport,$this->proxyusername,$this->proxypassword); |
|---|
| 376 |
} |
|---|
| 377 |
if($this->authtype != '') { |
|---|
| 378 |
$http->setCredentials($this->username, $this->password, $this->authtype, array(), $this->certRequest); |
|---|
| 379 |
} |
|---|
| 380 |
if($this->http_encoding != ''){ |
|---|
| 381 |
$http->setEncoding($this->http_encoding); |
|---|
| 382 |
} |
|---|
| 383 |
$this->debug('sending message, length='.strlen($msg)); |
|---|
| 384 |
if(ereg('^http:',$this->endpoint)){ |
|---|
| 385 |
|
|---|
| 386 |
$this->responseData = $http->send($msg,$timeout,$response_timeout,$this->cookies); |
|---|
| 387 |
} elseif(ereg('^https',$this->endpoint)){ |
|---|
| 388 |
|
|---|
| 389 |
//if(phpversion() == '4.3.0-dev'){ |
|---|
| 390 |
//$response = $http->send($msg,$timeout,$response_timeout); |
|---|
| 391 |
//$this->request = $http->outgoing_payload; |
|---|
| 392 |
//$this->response = $http->incoming_payload; |
|---|
| 393 |
//} else |
|---|
| 394 |
$this->responseData = $http->sendHTTPS($msg,$timeout,$response_timeout,$this->cookies); |
|---|
| 395 |
} else { |
|---|
| 396 |
$this->setError('no http/s in endpoint url'); |
|---|
| 397 |
} |
|---|
| 398 |
$this->request = $http->outgoing_payload; |
|---|
| 399 |
$this->response = $http->incoming_payload; |
|---|
| 400 |
$this->appendDebug($http->getDebug()); |
|---|
| 401 |
$this->UpdateCookies($http->incoming_cookies); |
|---|
| 402 |
|
|---|
| 403 |
|
|---|
| 404 |
if ($this->persistentConnection) { |
|---|
| 405 |
$http->clearDebug(); |
|---|
| 406 |
if (!is_object($this->persistentConnection)) { |
|---|
| 407 |
$this->persistentConnection = $http; |
|---|
| 408 |
} |
|---|
| 409 |
} |
|---|
| 410 |
|
|---|
| 411 |
if($err = $http->getError()){ |
|---|
| 412 |
$this->setError('HTTP Error: '.$err); |
|---|
| 413 |
return false; |
|---|
| 414 |
} elseif($this->getError()){ |
|---|
| 415 |
return false; |
|---|
| 416 |
} else { |
|---|
| 417 |
$this->debug('got response, length='. strlen($this->responseData).' type='.$http->incoming_headers['content-type']); |
|---|
| 418 |
return $this->parseResponse($http->incoming_headers, $this->responseData); |
|---|
| 419 |
} |
|---|
| 420 |
break; |
|---|
| 421 |
default: |
|---|
| 422 |
$this->setError('no transport found, or selected transport is not yet supported!'); |
|---|
| 423 |
return false; |
|---|
| 424 |
break; |
|---|
| 425 |
} |
|---|
| 426 |
} |
|---|
| 427 |
|
|---|
| 428 |
|
|---|
| 429 |
* processes SOAP message returned from server |
|---|
| 430 |
* |
|---|
| 431 |
* @param array $headers The HTTP headers |
|---|
| 432 |
* @param string $data unprocessed response data from server |
|---|
| 433 |
* @return mixed value of the message, decoded into a PHP type |
|---|
| 434 |
* @access private |
|---|
| 435 |
*/ |
|---|
| 436 |
function parseResponse($headers, $data) { |
|---|
| 437 |
$this->debug('Entering parseResponse() for data of length ' . strlen($data) . ' and type ' . $headers['content-type']); |
|---|
| 438 |
if (!strstr($headers['content-type'], 'text/xml')) { |
|---|
| 439 |
$this->setError('Response not of type text/xml'); |
|---|
| 440 |
return false; |
|---|
| 441 |
} |
|---|
| 442 |
if (strpos($headers['content-type'], '=')) { |
|---|
| 443 |
$enc = str_replace('"', '', substr(strstr($headers["content-type"], '='), 1)); |
|---|
| 444 |
$this->debug('Got response encoding: ' . $enc); |
|---|
| 445 |
if(eregi('^(ISO-8859-1|US-ASCII|UTF-8)$',$enc)){ |
|---|
| 446 |
$this->xml_encoding = strtoupper($enc); |
|---|
| 447 |
} else { |
|---|
| 448 |
$this->xml_encoding = 'US-ASCII'; |
|---|
| 449 |
} |
|---|
| 450 |
} else { |
|---|
| 451 |
|
|---|
| 452 |
$this->xml_encoding = 'ISO-8859-1'; |
|---|
| 453 |
} |
|---|
| 454 |
$this->debug('Use encoding: ' . $this->xml_encoding . ' when creating soap_parser'); |
|---|
| 455 |
$parser = new soap_parser($data,$this->xml_encoding,$this->operation,$this->decode_utf8); |
|---|
| 456 |
|
|---|
| 457 |
$this->appendDebug($parser->getDebug()); |
|---|
| 458 |
|
|---|
| 459 |
if($errstr = $parser->getError()){ |
|---|
| 460 |
$this->setError( $errstr); |
|---|
| 461 |
|
|---|
| 462 |
unset($parser); |
|---|
| 463 |
return false; |
|---|
| 464 |
} else { |
|---|
| 465 |
|
|---|
| 466 |
$this->responseHeaders = $parser->getHeaders(); |
|---|
| 467 |
|
|---|
| 468 |
$return = $parser->get_response(); |
|---|
| 469 |
|
|---|
| 470 |
$this->document = $parser->document; |
|---|
| 471 |
|
|---|
| 472 |
unset($parser); |
|---|
| 473 |
|
|---|
| 474 |
return $return; |
|---|
| 475 |
} |
|---|
| 476 |
} |
|---|
| 477 |
|
|---|
| 478 |
|
|---|
| 479 |
* sets the SOAP endpoint, which can override WSDL |
|---|
| 480 |
* |
|---|
| 481 |
* @param $endpoint string The endpoint URL to use, or empty string or false to prevent override |
|---|
| 482 |
* @access public |
|---|
| 483 |
*/ |
|---|
| 484 |
function setEndpoint($endpoint) { |
|---|
| 485 |
$this->forceEndpoint = $endpoint; |
|---|
| 486 |
} |
|---|
| 487 |
|
|---|
| 488 |
|
|---|
| 489 |
* set the SOAP headers |
|---|
| 490 |
* |
|---|
| 491 |
* @param $headers mixed String of XML with SOAP header content, or array of soapval objects for SOAP headers |
|---|
| 492 |
* @access public |
|---|
| 493 |
*/ |
|---|
| 494 |
function setHeaders($headers){ |
|---|
| 495 |
$this->requestHeaders = $headers; |
|---|
| 496 |
} |
|---|
| 497 |
|
|---|
| 498 |
|
|---|
| 499 |
* get the SOAP response headers (namespace resolution incomplete) |
|---|
| 500 |
* |
|---|
| 501 |
* @return string |
|---|
| 502 |
* @access public |
|---|
| 503 |
*/ |
|---|
| 504 |
function getHeaders(){ |
|---|
| 505 |
return $this->responseHeaders; |
|---|
| 506 |
} |
|---|
| 507 |
|
|---|
| 508 |
|
|---|
| 509 |
* set proxy info here |
|---|
| 510 |
* |
|---|
| 511 |
* @param string $proxyhost |
|---|
| 512 |
* @param string $proxyport |
|---|
| 513 |
* @param string $proxyusername |
|---|
| 514 |
* @param string $proxypassword |
|---|
| 515 |
* @access public |
|---|
| 516 |
*/ |
|---|
| 517 |
function setHTTPProxy($proxyhost, $proxyport, $proxyusername = '', $proxypassword = '') { |
|---|
| 518 |
$this->proxyhost = $proxyhost; |
|---|
| 519 |
$this->proxyport = $proxyport; |
|---|
| 520 |
$this->proxyusername = $proxyusername; |
|---|
| 521 |
$this->proxypassword = $proxypassword; |
|---|
| 522 |
} |
|---|
| 523 |
|
|---|
| 524 |
|
|---|
| 525 |
* if authenticating, set user credentials here |
|---|
| 526 |
* |
|---|
| 527 |
* @param string $username |
|---|
| 528 |
* @param string $password |
|---|
| 529 |
* @param string $authtype (basic|digest|certificate) |
|---|
| 530 |
* @param array $certRequest (keys must be cainfofile (optional), sslcertfile, sslkeyfile, passphrase, verifypeer (optional), verifyhost (optional): see corresponding options in cURL docs) |
|---|
| 531 |
* @access public |
|---|
| 532 |
*/ |
|---|
| 533 |
function setCredentials($username, $password, $authtype = 'basic', $certRequest = array()) { |
|---|
| 534 |
$this->username = $username; |
|---|
| 535 |
$this->password = $password; |
|---|
| 536 |
$this->authtype = $authtype; |
|---|
| 537 |
$this->certRequest = $certRequest; |
|---|
| 538 |
} |
|---|
| 539 |
|
|---|
| 540 |
|
|---|
| 541 |
* use HTTP encoding |
|---|
| 542 |
* |
|---|
| 543 |
* @param string $enc |
|---|
| 544 |
* @access public |
|---|
| 545 |
*/ |
|---|
| 546 |
function setHTTPEncoding($enc='gzip, deflate'){ |
|---|
| 547 |
$this->http_encoding = $enc; |
|---|
| 548 |
} |
|---|
| 549 |
|
|---|
| 550 |
|
|---|
| 551 |
* use HTTP persistent connections if possible |
|---|
| 552 |
* |
|---|
| 553 |
* @access public |
|---|
| 554 |
*/ |
|---|
| 555 |
function useHTTPPersistentConnection(){ |
|---|
| 556 |
$this->persistentConnection = true; |
|---|
| 557 |
} |
|---|
| 558 |
|
|---|
| 559 |
|
|---|
| 560 |
* gets the default RPC parameter setting. |
|---|
| 561 |
* If true, default is that call params are like RPC even for document style. |
|---|
| 562 |
* Each call() can override this value. |
|---|
| 563 |
* |
|---|
| 564 |
* This is no longer used. |
|---|
| 565 |
* |
|---|
| 566 |
* @return boolean |
|---|
| 567 |
* @access public |
|---|
| 568 |
* @deprecated |
|---|
| 569 |
*/ |
|---|
| 570 |
function getDefaultRpcParams() { |
|---|
| 571 |
return $this->defaultRpcParams; |
|---|
| 572 |
} |
|---|
| 573 |
|
|---|
| 574 |
|
|---|
| 575 |
* sets the default RPC parameter setting. |
|---|
| 576 |
* If true, default is that call params are like RPC even for document style |
|---|
| 577 |
* Each call() can override this value. |
|---|
| 578 |
* |
|---|
| 579 |
* This is no longer used. |
|---|
| 580 |
* |
|---|
| 581 |
* @param boolean $rpcParams |
|---|
| 582 |
* @access public |
|---|
| 583 |
* @deprecated |
|---|
| 584 |
*/ |
|---|
| 585 |
function setDefaultRpcParams($rpcParams) { |
|---|
| 586 |
$this->defaultRpcParams = $rpcParams; |
|---|
| 587 |
} |
|---|
| 588 |
|
|---|
| 589 |
|
|---|
| 590 |
* dynamically creates an instance of a proxy class, |
|---|
| 591 |
* allowing user to directly call methods from wsdl |
|---|
| 592 |
* |
|---|
| 593 |
* @return object soap_proxy object |
|---|
| 594 |
* @access public |
|---|
| 595 |
*/ |
|---|
| 596 |
function getProxy(){ |
|---|
| 597 |
$r = rand(); |
|---|
| 598 |
$evalStr = $this->_getProxyClassCode($r); |
|---|
| 599 |
|
|---|
| 600 |
// eval the class |
|---|
| 601 |
eval($evalStr); |
|---|
| 602 |
|
|---|
| 603 |
eval("\$proxy = new soap_proxy_$r('');"); |
|---|
| 604 |
|
|---|
| 605 |
$proxy->endpointType = 'wsdl'; |
|---|
| 606 |
$proxy->wsdlFile = $this->wsdlFile; |
|---|
| 607 |
$proxy->wsdl = $this->wsdl; |
|---|
| 608 |
$proxy->operations = $this->operations; |
|---|
| 609 |
$proxy->defaultRpcParams = $this->defaultRpcParams; |
|---|
| 610 |
|
|---|
| 611 |
$proxy->username = $this->username; |
|---|
| 612 |
$proxy->password = $this->password; |
|---|
| 613 |
$proxy->authtype = $this->authtype; |
|---|
| 614 |
$proxy->proxyhost = $this->proxyhost; |
|---|
| 615 |
$proxy->proxyport = $this->proxyport; |
|---|
| 616 |
$proxy->proxyusername = $this->proxyusername; |
|---|
| 617 |
$proxy->proxypassword = $this->proxypassword; |
|---|
| 618 |
$proxy->timeout = $this->timeout; |
|---|
| 619 |
$proxy->response_timeout = $this->response_timeout; |
|---|
| 620 |
$proxy->http_encoding = $this->http_encoding; |
|---|
| 621 |
$proxy->persistentConnection = $this->persistentConnection; |
|---|
| 622 |
$proxy->requestHeaders = $this->requestHeaders; |
|---|
| 623 |
$proxy->soap_defencoding = $this->soap_defencoding; |
|---|
| 624 |
$proxy->endpoint = $this->endpoint; |
|---|
| 625 |
$proxy->forceEndpoint = $this->forceEndpoint; |
|---|
| 626 |
return $proxy; |
|---|
| 627 |
} |
|---|
| 628 |
|
|---|
| 629 |
|
|---|
| 630 |
* dynamically creates proxy class code |
|---|
| 631 |
* |
|---|
| 632 |
* @return string PHP/NuSOAP code for the proxy class |
|---|
| 633 |
* @access private |
|---|
| 634 |
*/ |
|---|
| 635 |
function _getProxyClassCode($r) { |
|---|
| 636 |
if ($this->endpointType != 'wsdl') { |
|---|
| 637 |
$evalStr = 'A proxy can only be created for a WSDL client'; |
|---|
| 638 |
$this->setError($evalStr); |
|---|
| 639 |
return $evalStr; |
|---|
| 640 |
} |
|---|
| 641 |
$evalStr = ''; |
|---|
| 642 |
foreach ($this->operations as $operation => $opData) { |
|---|
| 643 |
if ($operation != '') { |
|---|
| 644 |
|
|---|
| 645 |
if (sizeof($opData['input']['parts']) > 0) { |
|---|
| 646 |
$paramStr = ''; |
|---|
| 647 |
$paramArrayStr = ''; |
|---|
| 648 |
$paramCommentStr = ''; |
|---|
| 649 |
foreach ($opData['input']['parts'] as $name => $type) { |
|---|
| 650 |
$paramStr .= "\$$name, "; |
|---|
| 651 |
$paramArrayStr .= "'$name' => \$$name, "; |
|---|
| 652 |
$paramCommentStr .= "$type \$$name, "; |
|---|
| 653 |
} |
|---|
| 654 |
$paramStr = substr($paramStr, 0, strlen($paramStr)-2); |
|---|
| 655 |
$paramArrayStr = substr($paramArrayStr, 0, strlen($paramArrayStr)-2); |
|---|
| 656 |
$paramCommentStr = substr($paramCommentStr, 0, strlen($paramCommentStr)-2); |
|---|
| 657 |
} else { |
|---|
| 658 |
$paramStr = ''; |
|---|
| 659 |
$paramCommentStr = 'void'; |
|---|
| 660 |
} |
|---|
| 661 |
$opData['namespace'] = !isset($opData['namespace']) ? 'http://testuri.com' : $opData['namespace']; |
|---|
| 662 |
$evalStr .= "// $paramCommentStr |
|---|
| 663 |
function " . str_replace('.', '__', $operation) . "($paramStr) { |
|---|
| 664 |
\$params = array($paramArrayStr); |
|---|
| 665 |
return \$this->call('$operation', \$params, '".$opData['namespace']."', '".(isset($opData['soapAction']) ? $opData['soapAction'] : '')."'); |
|---|
| 666 |
} |
|---|
| 667 |
"; |
|---|
| 668 |
unset($paramStr); |
|---|
| 669 |
unset($paramCommentStr); |
|---|
| 670 |
} |
|---|
| 671 |
} |
|---|
| 672 |
$evalStr = 'class soap_proxy_'.$r.' extends soapclient { |
|---|
| 673 |
'.$evalStr.' |
|---|
| 674 |
}'; |
|---|
| 675 |
return $evalStr; |
|---|
| 676 |
} |
|---|
| 677 |
|
|---|
| 678 |
|
|---|
| 679 |
* dynamically creates proxy class code |
|---|
| 680 |
* |
|---|
| 681 |
* @return string PHP/NuSOAP code for the proxy class |
|---|
| 682 |
* @access public |
|---|
| 683 |
*/ |
|---|
| 684 |
function getProxyClassCode() { |
|---|
| 685 |
$r = rand(); |
|---|
| 686 |
return $this->_getProxyClassCode($r); |
|---|
| 687 |
} |
|---|
| 688 |
|
|---|
| 689 |
|
|---|
| 690 |
* gets the HTTP body for the current request. |
|---|
| 691 |
* |
|---|
| 692 |
* @param string $soapmsg The SOAP payload |
|---|
| 693 |
* @return string The HTTP body, which includes the SOAP payload |
|---|
| 694 |
* @access private |
|---|
| 695 |
*/ |
|---|
| 696 |
function getHTTPBody($soapmsg) { |
|---|
| 697 |
return $soapmsg; |
|---|
| 698 |
} |
|---|
| 699 |
|
|---|
| 700 |
|
|---|
| 701 |
* gets the HTTP content type for the current request. |
|---|
| 702 |
* |
|---|
| 703 |
* Note: getHTTPBody must be called before this. |
|---|
| 704 |
* |
|---|
| 705 |
* @return string the HTTP content type for the current request. |
|---|
| 706 |
* @access private |
|---|
| 707 |
*/ |
|---|
| 708 |
function getHTTPContentType() { |
|---|
| 709 |
return 'text/xml'; |
|---|
| 710 |
} |
|---|
| 711 |
|
|---|
| 712 |
|
|---|
| 713 |
* gets the HTTP content type charset for the current request. |
|---|
| 714 |
* returns false for non-text content types. |
|---|
| 715 |
* |
|---|
| 716 |
* Note: getHTTPBody must be called before this. |
|---|
| 717 |
* |
|---|
| 718 |
* @return string the HTTP content type charset for the current request. |
|---|
| 719 |
* @access private |
|---|
| 720 |
*/ |
|---|
| 721 |
function getHTTPContentTypeCharset() { |
|---|
| 722 |
return $this->soap_defencoding; |
|---|
| 723 |
} |
|---|
| 724 |
|
|---|
| 725 |
|
|---|
| 726 |
* whether or not parser should decode utf8 element content |
|---|
| 727 |
* |
|---|
| 728 |
* @return always returns true |
|---|
| 729 |
* @access public |
|---|
| 730 |
*/ |
|---|
| 731 |
function decodeUTF8($bool){ |
|---|
| 732 |
$this->decode_utf8 = $bool; |
|---|
| 733 |
return true; |
|---|
| 734 |
} |
|---|
| 735 |
|
|---|
| 736 |
|
|---|
| 737 |
* adds a new Cookie into $this->cookies array |
|---|
| 738 |
* |
|---|
| 739 |
* @param string $name Cookie Name |
|---|
| 740 |
* @param string $value Cookie Value |
|---|
| 741 |
* @return if cookie-set was successful returns true, else false |
|---|
| 742 |
* @access public |
|---|
| 743 |
*/ |
|---|
| 744 |
function setCookie($name, $value) { |
|---|
| 745 |
if (strlen($name) == 0) { |
|---|
| 746 |
return false; |
|---|
| 747 |
} |
|---|
| 748 |
$this->cookies[] = array('name' => $name, 'value' => $value); |
|---|
| 749 |
return true; |
|---|
| 750 |
} |
|---|
| 751 |
|
|---|
| 752 |
|
|---|
| 753 |
* gets all Cookies |
|---|
| 754 |
* |
|---|
| 755 |
* @return array with all internal cookies |
|---|
| 756 |
* @access public |
|---|
| 757 |
*/ |
|---|
| 758 |
function getCookies() { |
|---|
| 759 |
return $this->cookies; |
|---|
| 760 |
} |
|---|
| 761 |
|
|---|
| 762 |
|
|---|
| 763 |
* checks all Cookies and delete those which are expired |
|---|
| 764 |
* |
|---|
| 765 |
* @return always return true |
|---|
| 766 |
* @access private |
|---|
| 767 |
*/ |
|---|
| 768 |
function checkCookies() { |
|---|
| 769 |
if (sizeof($this->cookies) == 0) { |
|---|
| 770 |
return true; |
|---|
| 771 |
} |
|---|
| 772 |
$this->debug('checkCookie: check ' . sizeof($this->cookies) . ' cookies'); |
|---|
| 773 |
$curr_cookies = $this->cookies; |
|---|
| 774 |
$this->cookies = array(); |
|---|
| 775 |
foreach ($curr_cookies as $cookie) { |
|---|
| 776 |
if (! is_array($cookie)) { |
|---|
| 777 |
$this->debug('Remove cookie that is not an array'); |
|---|
| 778 |
continue; |
|---|
| 779 |
} |
|---|
| 780 |
if ((isset($cookie['expires'])) && (! empty($cookie['expires']))) { |
|---|
| 781 |
if (strtotime($cookie['expires']) > time()) { |
|---|
| 782 |
$this->cookies[] = $cookie; |
|---|
| 783 |
} else { |
|---|
| 784 |
$this->debug('Remove expired cookie ' . $cookie['name']); |
|---|
| 785 |
} |
|---|
| 786 |
} else { |
|---|
| 787 |
$this->cookies[] = $cookie; |
|---|
| 788 |
} |
|---|
| 789 |
} |
|---|
| 790 |
$this->debug('checkCookie: '.sizeof($this->cookies).' cookies left in array'); |
|---|
| 791 |
return true; |
|---|
| 792 |
} |
|---|
| 793 |
|
|---|
| 794 |
|
|---|
| 795 |
* updates the current cookies with a new set |
|---|
| 796 |
* |
|---|
| 797 |
* @param array $cookies new cookies with which to update current ones |
|---|
| 798 |
* @return always return true |
|---|
| 799 |
* @access private |
|---|
| 800 |
*/ |
|---|
| 801 |
function UpdateCookies($cookies) { |
|---|
| 802 |
if (sizeof($this->cookies) == 0) { |
|---|
| 803 |
|
|---|
| 804 |
if (sizeof($cookies) > 0) { |
|---|
| 805 |
$this->debug('Setting new cookie(s)'); |
|---|
| 806 |
$this->cookies = $cookies; |
|---|
| 807 |
} |
|---|
| 808 |
return true; |
|---|
| 809 |
} |
|---|
| 810 |
if (sizeof($cookies) == 0) { |
|---|
| 811 |
|
|---|
| 812 |
return true; |
|---|
| 813 |
} |
|---|
| 814 |
|
|---|
| 815 |
foreach ($cookies as $newCookie) { |
|---|
| 816 |
if (!is_array($newCookie)) { |
|---|
| 817 |
continue; |
|---|
| 818 |
} |
|---|
| 819 |
if ((!isset($newCookie['name'])) || (!isset($newCookie['value']))) { |
|---|
| 820 |
continue; |
|---|
| 821 |
} |
|---|
| 822 |
$newName = $newCookie['name']; |
|---|
| 823 |
|
|---|
| 824 |
$found = false; |
|---|
| 825 |
for ($i = 0; $i < count($this->cookies); $i++) { |
|---|
| 826 |
$cookie = $this->cookies[$i]; |
|---|
| 827 |
if (!is_array($cookie)) { |
|---|
| 828 |
continue; |
|---|
| 829 |
} |
|---|
| 830 |
if (!isset($cookie['name'])) { |
|---|
| 831 |
continue; |
|---|
| 832 |
} |
|---|
| 833 |
if ($newName != $cookie['name']) { |
|---|
| 834 |
continue; |
|---|
| 835 |
} |
|---|
| 836 |
$newDomain = isset($newCookie['domain']) ? $newCookie['domain'] : 'NODOMAIN'; |
|---|
| 837 |
$domain = isset($cookie['domain']) ? $cookie['domain'] : 'NODOMAIN'; |
|---|
| 838 |
if ($newDomain != $domain) { |
|---|
| 839 |
continue; |
|---|
| 840 |
} |
|---|
| 841 |
$newPath = isset($newCookie['path']) ? $newCookie['path'] : 'NOPATH'; |
|---|
| 842 |
$path = isset($cookie['path']) ? $cookie['path'] : 'NOPATH'; |
|---|
| 843 |
if ($newPath != $path) { |
|---|
| 844 |
continue; |
|---|
| 845 |
} |
|---|
| 846 |
$this->cookies[$i] = $newCookie; |
|---|
| 847 |
$found = true; |
|---|
| 848 |
$this->debug('Update cookie ' . $newName . '=' . $newCookie['value']); |
|---|
| 849 |
break; |
|---|
| 850 |
} |
|---|
| 851 |
if (! $found) { |
|---|
| 852 |
$this->debug('Add cookie ' . $newName . '=' . $newCookie['value']); |
|---|
| 853 |
$this->cookies[] = $newCookie; |
|---|
| 854 |
} |
|---|
| 855 |
} |
|---|
| 856 |
return true; |
|---|
| 857 |
} |
|---|
| 858 |
} |
|---|
| 859 |
?> |
|---|
| 860 |
|
|---|