37 !isset(
$GLOBALS[
'_transient'][
'static']) ||
38 !isset(
$GLOBALS[
'_transient'][
'static'][
'nusoap_base']) ||
39 !is_object(
$GLOBALS[
'_transient'][
'static'][
'nusoap_base'])
41 $GLOBALS[
'_transient'][
'static'][
'nusoap_base'] =
new stdClass();
43$GLOBALS[
'_transient'][
'static'][
'nusoap_base']->globalDebugLevel = 0;
133 'SOAP-ENV' =>
'http://schemas.xmlsoap.org/soap/envelope/',
134 'xsd' =>
'http://www.w3.org/2001/XMLSchema',
135 'xsi' =>
'http://www.w3.org/2001/XMLSchema-instance',
136 'SOAP-ENC' =>
'http://schemas.xmlsoap.org/soap/encoding/'
155 'http://www.w3.org/2001/XMLSchema' => array(
156 'string' =>
'string',
'boolean' =>
'boolean',
'float' =>
'double',
'double' =>
'double',
'decimal' =>
'double',
157 'duration' =>
'',
'dateTime' =>
'string',
'time' =>
'string',
'date' =>
'string',
'gYearMonth' =>
'',
158 'gYear' =>
'',
'gMonthDay' =>
'',
'gDay' =>
'',
'gMonth' =>
'',
'hexBinary' =>
'string',
'base64Binary' =>
'string',
160 'anyType' =>
'string',
'anySimpleType' =>
'string',
162 'normalizedString' =>
'string',
'token' =>
'string',
'language' =>
'',
'NMTOKEN' =>
'',
'NMTOKENS' =>
'',
'Name' =>
'',
'NCName' =>
'',
'ID' =>
'',
163 'IDREF' =>
'',
'IDREFS' =>
'',
'ENTITY' =>
'',
'ENTITIES' =>
'',
'integer' =>
'integer',
'nonPositiveInteger' =>
'integer',
164 'negativeInteger' =>
'integer',
'long' =>
'integer',
'int' =>
'integer',
'short' =>
'integer',
'byte' =>
'integer',
'nonNegativeInteger' =>
'integer',
165 'unsignedLong' =>
'',
'unsignedInt' =>
'',
'unsignedShort' =>
'',
'unsignedByte' =>
'',
'positiveInteger' =>
''),
166 'http://www.w3.org/2000/10/XMLSchema' => array(
167 'i4' =>
'',
'int' =>
'integer',
'boolean' =>
'boolean',
'string' =>
'string',
'double' =>
'double',
168 'float' =>
'double',
'dateTime' =>
'string',
169 'timeInstant' =>
'string',
'base64Binary' =>
'string',
'base64' =>
'string',
'ur-type' =>
'array'),
170 'http://www.w3.org/1999/XMLSchema' => array(
171 'i4' =>
'',
'int' =>
'integer',
'boolean' =>
'boolean',
'string' =>
'string',
'double' =>
'double',
172 'float' =>
'double',
'dateTime' =>
'string',
173 'timeInstant' =>
'string',
'base64Binary' =>
'string',
'base64' =>
'string',
'ur-type' =>
'array'),
174 'http://soapinterop.org/xsd' => array(
'SOAPStruct' =>
'struct'),
175 'http://schemas.xmlsoap.org/soap/encoding/' => array(
'base64' =>
'string',
'array' =>
'array',
'Array' =>
'array'),
176 'http://xml.apache.org/xml-soap' => array(
'Map')
188 'lt' =>
'<',
'gt' =>
'>',
'apos' =>
"'");
197 $this->debugLevel =
$GLOBALS[
'_transient'][
'static'][
'nusoap_base']->globalDebugLevel;
208 return $GLOBALS[
'_transient'][
'static'][
'nusoap_base']->globalDebugLevel;
219 $GLOBALS[
'_transient'][
'static'][
'nusoap_base']->globalDebugLevel = $level;
241 $this->debugLevel = $level;
252 if ($this->debugLevel > 0) {
265 if ($this->debugLevel > 0) {
268 $this->debug_str .= $string;
281 $this->debug_str =
'';
308 while (strpos($this->debug_str,
'--')) {
309 $this->debug_str = str_replace(
'--',
'- -', $this->debug_str);
311 $ret =
"<!--\n" . $this->debug_str .
"\n-->";
323 if ($this->charencoding) {
324 $val = str_replace(
'&',
'&', $val);
325 $val = str_replace(
"'",
''', $val);
326 $val = str_replace(
'"',
'"', $val);
327 $val = str_replace(
'<',
'<', $val);
328 $val = str_replace(
'>',
'>', $val);
341 if ($this->error_str !=
'') {
355 $this->error_str = $str;
367 $keyList = array_keys($val);
368 foreach ($keyList as $keyListValue) {
369 if (!is_int($keyListValue)) {
370 return 'arrayStruct';
373 return 'arraySimple';
391 public function serialize_val($val, $name =
false, $type =
false, $name_ns =
false, $type_ns =
false, $attributes =
false, $use =
'encoded', $soapval =
false)
393 $this->
debug(
"in serialize_val: name=$name, type=$type, name_ns=$name_ns, type_ns=$type_ns, use=$use, soapval=$soapval");
397 if (is_object($val) && get_class($val) ==
'soapval' && (! $soapval)) {
398 $this->
debug(
"serialize_val: serialize soapval");
399 $xml = $val->serialize($use);
402 $this->
debug(
"serialize_val of soapval returning $xml");
406 if (is_numeric($name)) {
407 $name =
'__numeric_' . $name;
414 $prefix =
'nu' . rand(1000, 9999);
415 $name = $prefix .
':' . $name;
416 $xmlns .=
" xmlns:$prefix=\"$name_ns\"";
419 if ($type_ns !=
'' && $type_ns == $this->namespaces[
'xsd']) {
422 $type_prefix =
'xsd';
423 } elseif ($type_ns) {
424 $type_prefix =
'ns' . rand(1000, 9999);
425 $xmlns .=
" xmlns:$type_prefix=\"$type_ns\"";
430 foreach ($attributes as $k => $v) {
436 $this->
debug(
"serialize_val: serialize null");
437 if ($use ==
'literal') {
439 $xml =
"<$name$xmlns$atts/>";
440 $this->
debug(
"serialize_val returning $xml");
443 if (isset($type) && isset($type_prefix)) {
444 $type_str =
" xsi:type=\"$type_prefix:$type\"";
448 $xml =
"<$name$xmlns$type_str$atts xsi:nil=\"true\"/>";
449 $this->
debug(
"serialize_val returning $xml");
454 if ($type !=
'' && isset($this->typemap[$this->XMLSchemaVersion][$type])) {
455 $this->
debug(
"serialize_val: serialize xsd built-in primitive type");
457 if ($type ==
'boolean') {
458 $val = $val ?
'true' :
'false';
462 } elseif (is_string($val)) {
465 if ($use ==
'literal') {
466 $xml =
"<$name$xmlns$atts>$val</$name>";
467 $this->
debug(
"serialize_val returning $xml");
470 $xml =
"<$name$xmlns xsi:type=\"xsd:$type\"$atts>$val</$name>";
471 $this->
debug(
"serialize_val returning $xml");
478 case (is_bool($val) || $type ==
'boolean'):
479 $this->
debug(
"serialize_val: serialize boolean");
480 if ($type ==
'boolean') {
481 $val = $val ?
'true' :
'false';
485 if ($use ==
'literal') {
486 $xml .=
"<$name$xmlns$atts>$val</$name>";
488 $xml .=
"<$name$xmlns xsi:type=\"xsd:boolean\"$atts>$val</$name>";
491 case (is_int($val) || is_long($val) || $type ==
'int'):
492 $this->
debug(
"serialize_val: serialize int");
493 if ($use ==
'literal') {
494 $xml .=
"<$name$xmlns$atts>$val</$name>";
496 $xml .=
"<$name$xmlns xsi:type=\"xsd:int\"$atts>$val</$name>";
499 case (is_float($val) || is_double($val) || $type ==
'float'):
500 $this->
debug(
"serialize_val: serialize float");
501 if ($use ==
'literal') {
502 $xml .=
"<$name$xmlns$atts>$val</$name>";
504 $xml .=
"<$name$xmlns xsi:type=\"xsd:float\"$atts>$val</$name>";
507 case (is_string($val) || $type ==
'string'):
508 $this->
debug(
"serialize_val: serialize string");
510 if ($use ==
'literal') {
511 $xml .=
"<$name$xmlns$atts>$val</$name>";
513 $xml .=
"<$name$xmlns xsi:type=\"xsd:string\"$atts>$val</$name>";
516 case is_object($val):
517 $this->
debug(
"serialize_val: serialize object");
518 if (get_class($val) ==
'soapval') {
519 $this->
debug(
"serialize_val: serialize soapval object");
520 $pXml = $val->serialize($use);
525 $name = get_class($val);
526 $this->
debug(
"In serialize_val, used class name $name as element name");
528 $this->
debug(
"In serialize_val, do not override name $name for element name for class " . get_class($val));
530 foreach (get_object_vars($val) as $k => $v) {
531 $pXml = isset($pXml) ? $pXml . $this->
serialize_val($v, $k,
false,
false,
false,
false, $use) : $this->
serialize_val($v, $k,
false,
false,
false,
false, $use);
534 if (isset($type) && isset($type_prefix)) {
535 $type_str =
" xsi:type=\"$type_prefix:$type\"";
539 if ($use ==
'literal') {
540 $xml .=
"<$name$xmlns$atts>$pXml</$name>";
542 $xml .=
"<$name$xmlns$type_str$atts>$pXml</$name>";
546 case (is_array($val) || $type):
549 if ($valueType ==
'arraySimple' || preg_match(
'/^ArrayOf/', $type)) {
550 $this->
debug(
"serialize_val: serialize array");
552 if (is_array($val) && count($val) > 0) {
553 foreach ($val as $v) {
554 if (is_object($v) && get_class($v) ==
'soapval') {
555 $tt_ns = $v->type_ns;
557 } elseif (is_array($v)) {
562 $array_types[$tt] = 1;
564 $xml .= $this->
serialize_val($v,
'item',
false,
false,
false,
false, $use);
567 if (count($array_types) > 1) {
568 $array_typename =
'xsd:anyType';
569 } elseif (isset($tt) && isset($this->typemap[$this->XMLSchemaVersion][$tt])) {
570 if ($tt ==
'integer') {
573 $array_typename =
'xsd:' . $tt;
574 } elseif (isset($tt) && $tt ==
'arraySimple') {
575 $array_typename =
'SOAP-ENC:Array';
576 } elseif (isset($tt) && $tt ==
'arrayStruct') {
577 $array_typename =
'unnamed_struct_use_soapval';
580 if ($tt_ns !=
'' && $tt_ns == $this->namespaces[
'xsd']) {
581 $array_typename =
'xsd:' . $tt;
583 $tt_prefix =
'ns' . rand(1000, 9999);
584 $array_typename =
"$tt_prefix:$tt";
585 $xmlns .=
" xmlns:$tt_prefix=\"$tt_ns\"";
587 $array_typename = $tt;
591 if ($use ==
'literal') {
593 } elseif (isset($type) && isset($type_prefix)) {
594 $type_str =
" xsi:type=\"$type_prefix:$type\"";
596 $type_str =
" xsi:type=\"SOAP-ENC:Array\" SOAP-ENC:arrayType=\"" . $array_typename .
"[$array_type]\"";
600 if ($use ==
'literal') {
602 } elseif (isset($type) && isset($type_prefix)) {
603 $type_str =
" xsi:type=\"$type_prefix:$type\"";
605 $type_str =
" xsi:type=\"SOAP-ENC:Array\" SOAP-ENC:arrayType=\"xsd:anyType[0]\"";
609 $xml =
"<$name$xmlns$type_str$atts>" . $xml .
"</$name>";
612 $this->
debug(
"serialize_val: serialize struct");
613 if (isset($type) && isset($type_prefix)) {
614 $type_str =
" xsi:type=\"$type_prefix:$type\"";
618 if ($use ==
'literal') {
619 $xml .=
"<$name$xmlns$atts>";
621 $xml .=
"<$name$xmlns$type_str$atts>";
623 foreach ($val as $k => $v) {
625 if ($type ==
'Map' && $type_ns ==
'http://xml.apache.org/xml-soap') {
627 $xml .= $this->
serialize_val($k,
'key',
false,
false,
false,
false, $use);
628 $xml .= $this->
serialize_val($v,
'value',
false,
false,
false,
false, $use);
631 $xml .= $this->
serialize_val($v, $k,
false,
false,
false,
false, $use);
638 $this->
debug(
"serialize_val: serialize unknown");
639 $xml .=
'not detected, got ' . gettype($val) .
' for ' . $val;
642 $this->
debug(
"serialize_val returning $xml");
658 public function serializeEnvelope($body, $headers =
false,
$namespaces = array(), $style =
'rpc', $use =
'encoded', $encodingStyle =
'http://schemas.xmlsoap.org/soap/encoding/')
664 $this->
debug(
"In serializeEnvelope length=" . strlen($body) .
" body (max 1000 characters)=" . substr($body, 0, 1000) .
" style=$style use=$use encodingStyle=$encodingStyle");
665 $this->
debug(
"headers:");
667 $this->
debug(
"namespaces:");
672 foreach (array_merge($this->namespaces,
$namespaces) as $k => $v) {
673 $ns_string .=
" xmlns:$k=\"$v\"";
675 if ($encodingStyle) {
676 $ns_string =
" SOAP-ENV:encodingStyle=\"$encodingStyle\"$ns_string";
681 if (is_array($headers)) {
683 foreach ($headers as $k => $v) {
684 if (is_object($v) && get_class($v) ==
'soapval') {
685 $xml .= $this->
serialize_val($v,
false,
false,
false,
false,
false, $use);
687 $xml .= $this->
serialize_val($v, $k,
false,
false,
false,
false, $use);
691 $this->
debug(
"In serializeEnvelope, serialized array of headers to $headers");
693 $headers =
"<SOAP-ENV:Header>" . $headers .
"</SOAP-ENV:Header>";
697 '<?xml version="1.0" encoding="' . $this->soap_defencoding .
'"?' .
">" .
698 '<SOAP-ENV:Envelope' . $ns_string .
">" .
703 "</SOAP-ENV:Envelope>";
716 $str = htmlspecialchars($str);
731 if (strrpos($qname,
':')) {
733 $name = substr($qname, strrpos($qname,
':') + 1);
735 $ns = substr($qname, 0, strrpos($qname,
':'));
738 return $p .
':' . $name;
756 if (strpos($qname,
':') && !preg_match(
'/^http:\/\//', $qname)) {
758 $name = substr(strstr($qname,
':'), 1);
760 $prefix = substr($qname, 0, strpos($qname,
':'));
761 if (isset($this->namespaces[$prefix])) {
762 return $this->namespaces[$prefix] .
':' . $name;
781 if ($sstr = strrchr($str,
':')) {
783 return substr($sstr, 1);
799 if ($pos = strrpos($str,
':')) {
801 return substr($str, 0, $pos);
815 if (isset($this->namespaces[$prefix])) {
816 return $this->namespaces[$prefix];
832 foreach ($this->namespaces as $p => $n) {
833 if ($ns == $n || $ns == $p) {
834 $this->usedNamespaces[$p] = $n;
849 if (function_exists(
'gettimeofday')) {
850 $tod = gettimeofday();
852 $usec = $tod[
'usec'];
857 return strftime(
'%Y-%m-%d %H:%M:%S', $sec) .
'.' . sprintf(
'%06d', $usec);
871 $ret_val = ob_get_contents();
910 '([0-9]{2})(\.[0-9]*)?' .
911 '(Z|[+\-][0-9]{2}:?[0-9]{2})?' .
914 if (preg_match($pattern, $datestr, $regs)) {
915 return sprintf(
'%04d-%02d-%02dT%02d:%02d:%02dZ', $regs[1], $regs[2], $regs[3], $regs[4], $regs[5], $regs[6]);
938 '([0-9]{2})(\.[0-9]+)?' .
939 '(Z|[+\-][0-9]{2}:?[0-9]{2})?' .
942 if (preg_match($pattern, $datestr, $regs)) {
944 if ($regs[8] !=
'Z') {
945 $op = substr($regs[8], 0, 1);
946 $h = substr($regs[8], 1, 2);
947 $m = substr($regs[8], strlen($regs[8]) - 2, 2);
949 $regs[4] = $regs[4] + $h;
950 $regs[5] = $regs[5] + $m;
951 } elseif ($op ==
'+') {
952 $regs[4] = $regs[4] - $h;
953 $regs[5] = $regs[5] - $m;
956 return gmmktime($regs[4], $regs[5], $regs[6], $regs[2], $regs[3], $regs[1]);
972 $start = gettimeofday();
975 $stop = gettimeofday();
976 $timePassed = 1000000 * ($stop[
'sec'] - $start[
'sec'])
977 + $stop[
'usec'] - $start[
'usec'];
978 }
while ($timePassed < $usec);
1046 foreach ($this->namespaces as $k => $v) {
1047 $ns_string .=
"\n xmlns:$k=\"$v\"";
1050 '<?xml version="1.0" encoding="' . $this->soap_defencoding .
'"?>' .
1051 '<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"' . $ns_string .
">\n" .
1053 '<SOAP-ENV:Fault>' .
1058 '</SOAP-ENV:Fault>' .
1059 '</SOAP-ENV:Body>' .
1060 '</SOAP-ENV:Envelope>';
1127 $this->
debug(
'nusoap_xmlschema class instantiated, inside constructor');
1134 $this->namespaces = array_merge($this->namespaces,
$namespaces);
1144 $this->
debug(
'initial xml file: ' .
$xml);
1161 $xmlStr = @join(
"", @file(
$xml));
1162 if ($xmlStr ==
"") {
1163 $msg =
'Error reading XML from ' .
$xml;
1168 $this->
debug(
"parsing $xml");
1170 $this->
debug(
"done parsing $xml");
1189 $this->parser = xml_parser_create();
1191 xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, 0);
1194 if ($type ==
"schema") {
1197 } elseif ($type ==
"xml") {
1198 xml_set_element_handler($this->parser, $this->xmlStartElement(...), $this->xmlEndElement(...));
1199 xml_set_character_data_handler($this->parser, $this->xmlCharacterData(...));
1203 if (!xml_parse($this->parser,
$xml,
true)) {
1206 'XML error parsing XML schema on line %d: %s',
1207 xml_get_current_line_number($this->parser),
1208 xml_error_string(xml_get_error_code($this->parser))
1210 $this->
debug($errstr);
1215 $this->
debug(
'no xml passed to parseString()!!');
1216 $this->
setError(
'no xml passed to parseString()!!');
1230 for ($i = 0; $i < count($this->complexTypeStack); $i++) {
1231 $scope .= $this->complexTypeStack[$i] .
'_';
1233 return $scope . $ename .
'_ContainedType';
1248 $pos = $this->position++;
1251 $this->depth_array[
$depth] = $pos;
1252 $this->message[$pos] = array(
'cdata' =>
'');
1254 $this->defaultNamespace[$pos] = $this->defaultNamespace[$this->depth_array[
$depth - 1]];
1256 $this->defaultNamespace[$pos] =
false;
1260 if ($prefix = $this->
getPrefix($name)) {
1268 if (count($attrs) > 0) {
1269 foreach ($attrs as $k => $v) {
1271 if (preg_match(
'/^xmlns/', $k)) {
1274 if ($ns_prefix = substr(strrchr($k,
':'), 1)) {
1276 $this->namespaces[$ns_prefix] = $v;
1278 $this->defaultNamespace[$pos] = $v;
1280 $this->namespaces[
'ns' . (count($this->namespaces) + 1)] = $v;
1283 if ($v ==
'http://www.w3.org/2001/XMLSchema' || $v ==
'http://www.w3.org/1999/XMLSchema' || $v ==
'http://www.w3.org/2000/10/XMLSchema') {
1284 $this->XMLSchemaVersion = $v;
1285 $this->namespaces[
'xsi'] = $v .
'-instance';
1289 foreach ($attrs as $k => $v) {
1291 $k = strpos($k,
':') ? $this->
expandQname($k) : $k;
1292 $v = strpos($v,
':') ? $this->
expandQname($v) : $v;
1313 $this->
xdebug(
"parsing attribute:");
1315 if (!isset($attrs[
'form'])) {
1316 $attrs[
'form'] = $this->schemaInfo[
'attributeFormDefault'];
1318 if (isset($attrs[
'http://schemas.xmlsoap.org/wsdl/:arrayType'])) {
1319 $v = $attrs[
'http://schemas.xmlsoap.org/wsdl/:arrayType'];
1320 if (!strpos($v,
':')) {
1322 if ($this->defaultNamespace[$pos]) {
1324 $attrs[
'http://schemas.xmlsoap.org/wsdl/:arrayType'] = $this->defaultNamespace[$pos] .
':' . $attrs[
'http://schemas.xmlsoap.org/wsdl/:arrayType'];
1328 if (isset($attrs[
'name'])) {
1329 $this->attributes[$attrs[
'name']] = $attrs;
1330 $aname = $attrs[
'name'];
1331 } elseif (isset($attrs[
'ref']) && $attrs[
'ref'] ==
'http://schemas.xmlsoap.org/soap/encoding/:arrayType') {
1332 if (isset($attrs[
'http://schemas.xmlsoap.org/wsdl/:arrayType'])) {
1333 $aname = $attrs[
'http://schemas.xmlsoap.org/wsdl/:arrayType'];
1337 } elseif (isset($attrs[
'ref'])) {
1338 $aname = $attrs[
'ref'];
1339 $this->attributes[$attrs[
'ref']] = $attrs;
1342 if ($this->currentComplexType) {
1346 if (isset($attrs[
'http://schemas.xmlsoap.org/wsdl/:arrayType']) || $this->
getLocalPart($aname) ==
'arrayType') {
1349 if (isset($attrs[
'http://schemas.xmlsoap.org/wsdl/:arrayType'])) {
1350 $v = $attrs[
'http://schemas.xmlsoap.org/wsdl/:arrayType'];
1354 if (strpos($v,
'[,]')) {
1357 $v = substr($v, 0, strpos($v,
'['));
1358 if (!strpos($v,
':') && isset($this->typemap[$this->XMLSchemaVersion][$v])) {
1359 $v = $this->XMLSchemaVersion .
':' . $v;
1364 case 'complexContent':
1367 array_push($this->complexTypeStack, $this->currentComplexType);
1368 if (isset($attrs[
'name'])) {
1371 $this->
xdebug(
'processing named complexType ' . $attrs[
'name']);
1373 $this->currentComplexType = $attrs[
'name'];
1383 if (isset($attrs[
'base']) && preg_match(
'/:Array$/', $attrs[
'base'])) {
1384 $this->
xdebug(
'complexType is unusual array');
1391 $this->
xdebug(
'processing unnamed complexType for element ' . $this->currentElement .
' named ' . $name);
1392 $this->currentComplexType = $name;
1403 if (isset($attrs[
'base']) && preg_match(
'/:Array$/', $attrs[
'base'])) {
1404 $this->
xdebug(
'complexType is unusual array');
1412 array_push($this->elementStack, $this->currentElement);
1413 if (!isset($attrs[
'form'])) {
1414 $attrs[
'form'] = $this->schemaInfo[
'elementFormDefault'];
1416 if (isset($attrs[
'type'])) {
1417 $this->
xdebug(
"processing typed element " . $attrs[
'name'] .
" of type " . $attrs[
'type']);
1418 if (! $this->
getPrefix($attrs[
'type'])) {
1419 if ($this->defaultNamespace[$pos]) {
1420 $attrs[
'type'] = $this->defaultNamespace[$pos] .
':' . $attrs[
'type'];
1421 $this->
xdebug(
'used default namespace to make type ' . $attrs[
'type']);
1431 if ($this->currentComplexType && $this->complexTypes[$this->currentComplexType][
'phpType'] ==
'array') {
1432 $this->
xdebug(
'arrayType for unusual array is ' . $attrs[
'type']);
1435 $this->currentElement = $attrs[
'name'];
1436 $ename = $attrs[
'name'];
1437 } elseif (isset($attrs[
'ref'])) {
1438 $this->
xdebug(
"processing element as ref to " . $attrs[
'ref']);
1439 $this->currentElement =
"ref to " . $attrs[
'ref'];
1442 $type = $this->
CreateTypeName($this->currentComplexType .
'_' . $attrs[
'name']);
1443 $this->
xdebug(
"processing untyped element " . $attrs[
'name'] .
' type ' . $type);
1444 $this->currentElement = $attrs[
'name'];
1445 $attrs[
'type'] = $this->schemaTargetNamespace .
':' . $type;
1446 $ename = $attrs[
'name'];
1448 if (isset($ename) && $this->currentComplexType) {
1449 $this->
xdebug(
"add element $ename to complexType $this->currentComplexType");
1451 } elseif (!isset($attrs[
'ref'])) {
1452 $this->
xdebug(
"add element $ename to elements array");
1453 $this->elements[ $attrs[
'name'] ] = $attrs;
1454 $this->elements[ $attrs[
'name'] ][
'typeClass'] =
'element';
1458 $this->
xdebug(
'enumeration ' . $attrs[
'value']);
1459 if ($this->currentSimpleType) {
1461 } elseif ($this->currentComplexType) {
1466 $this->
xdebug(
'extension ' . $attrs[
'base']);
1467 if ($this->currentComplexType) {
1472 if (isset($attrs[
'schemaLocation'])) {
1474 $this->imports[$attrs[
'namespace']][] = array(
'location' => $attrs[
'schemaLocation'],
'loaded' =>
false);
1477 $this->imports[$attrs[
'namespace']][] = array(
'location' =>
'',
'loaded' =>
true);
1479 $this->namespaces[
'ns' . (count($this->namespaces) + 1)] = $attrs[
'namespace'];
1486 $this->
xdebug(
'restriction ' . $attrs[
'base']);
1487 if ($this->currentSimpleType) {
1489 } elseif ($this->currentComplexType) {
1491 if (strstr($attrs[
'base'],
':') ==
':Array') {
1497 $this->schemaInfo = $attrs;
1499 if (isset($attrs[
'targetNamespace'])) {
1500 $this->schemaTargetNamespace = $attrs[
'targetNamespace'];
1502 if (!isset($attrs[
'elementFormDefault'])) {
1503 $this->schemaInfo[
'elementFormDefault'] =
'unqualified';
1505 if (!isset($attrs[
'attributeFormDefault'])) {
1506 $this->schemaInfo[
'attributeFormDefault'] =
'unqualified';
1509 case 'simpleContent':
1512 array_push($this->simpleTypeStack, $this->currentSimpleType);
1513 if (isset($attrs[
'name'])) {
1514 $this->
xdebug(
"processing simpleType for name " . $attrs[
'name']);
1515 $this->currentSimpleType = $attrs[
'name'];
1516 $this->simpleTypes[ $attrs[
'name'] ] = $attrs;
1517 $this->simpleTypes[ $attrs[
'name'] ][
'typeClass'] =
'simpleType';
1518 $this->simpleTypes[ $attrs[
'name'] ][
'phpType'] =
'scalar';
1520 $name = $this->
CreateTypeName($this->currentComplexType .
'_' . $this->currentElement);
1521 $this->
xdebug(
'processing unnamed simpleType for element ' . $this->currentElement .
' named ' . $name);
1522 $this->currentSimpleType = $name;
1547 if (isset($this->depth_array[$this->depth])) {
1551 if ($prefix = $this->
getPrefix($name)) {
1558 if ($name ==
'complexType') {
1559 $this->
xdebug(
'done processing complexType ' . ($this->currentComplexType ? $this->currentComplexType :
'(unknown)'));
1560 $this->currentComplexType = array_pop($this->complexTypeStack);
1563 if ($name ==
'element') {
1564 $this->
xdebug(
'done processing element ' . ($this->currentElement ? $this->currentElement :
'(unknown)'));
1565 $this->currentElement = array_pop($this->elementStack);
1567 if ($name ==
'simpleType') {
1568 $this->
xdebug(
'done processing simpleType ' . ($this->currentSimpleType ? $this->currentSimpleType :
'(unknown)'));
1569 $this->currentSimpleType = array_pop($this->simpleTypeStack);
1582 $pos = $this->depth_array[$this->depth - 1];
1583 $this->message[$pos][
'cdata'] .=
$data;
1596 if (
sizeof($this->imports) > 0) {
1597 foreach ($this->imports as $ns => $list) {
1598 foreach ($list as $ii) {
1599 if ($ii[
'location'] !=
'') {
1600 $xml .=
" <$schemaPrefix:import location=\"" . $ii[
'location'] .
'" namespace="' . $ns .
"\" />\n";
1602 $xml .=
" <$schemaPrefix:import namespace=\"" . $ns .
"\" />\n";
1608 foreach ($this->complexTypes as $typeName => $attrs) {
1611 if (isset($attrs[
'elements']) && (count($attrs[
'elements']) > 0)) {
1612 foreach ($attrs[
'elements'] as $element => $eParts) {
1613 if (isset($eParts[
'ref'])) {
1614 $contentStr .=
" <$schemaPrefix:element ref=\"$element\"/>\n";
1616 $contentStr .=
" <$schemaPrefix:element name=\"$element\" type=\"" . $this->contractQName($eParts[
'type']) .
"\"";
1617 foreach ($eParts as $aName => $aValue) {
1619 if ($aName !=
'name' && $aName !=
'type') {
1620 $contentStr .=
" $aName=\"$aValue\"";
1623 $contentStr .=
"/>\n";
1627 if (isset($attrs[
'compositor']) && ($attrs[
'compositor'] !=
'')) {
1628 $contentStr =
" <$schemaPrefix:$attrs[compositor]>\n" . $contentStr .
" </$schemaPrefix:$attrs[compositor]>\n";
1632 if (isset($attrs[
'attrs']) && (count($attrs[
'attrs']) >= 1)) {
1633 foreach ($attrs[
'attrs'] as $attr => $aParts) {
1634 $contentStr .=
" <$schemaPrefix:attribute";
1635 foreach ($aParts as
$a => $v) {
1636 if (
$a ==
'ref' ||
$a ==
'type') {
1637 $contentStr .=
" $a=\"" . $this->contractQName($v) .
'"';
1638 } elseif (
$a ==
'http://schemas.xmlsoap.org/wsdl/:arrayType') {
1639 $this->usedNamespaces[
'wsdl'] = $this->namespaces[
'wsdl'];
1640 $contentStr .=
' wsdl:arrayType="' . $this->contractQName($v) .
'"';
1642 $contentStr .=
" $a=\"$v\"";
1645 $contentStr .=
"/>\n";
1649 if (isset($attrs[
'restrictionBase']) && $attrs[
'restrictionBase'] !=
'') {
1650 $contentStr =
" <$schemaPrefix:restriction base=\"" . $this->contractQName($attrs[
'restrictionBase']) .
"\">\n" . $contentStr .
" </$schemaPrefix:restriction>\n";
1652 if ((isset($attrs[
'elements']) && count($attrs[
'elements']) > 0) || (isset($attrs[
'attrs']) && count($attrs[
'attrs']) > 0)) {
1653 $contentStr =
" <$schemaPrefix:complexContent>\n" . $contentStr .
" </$schemaPrefix:complexContent>\n";
1657 if ($contentStr !=
'') {
1658 $contentStr =
" <$schemaPrefix:complexType name=\"$typeName\">\n" . $contentStr .
" </$schemaPrefix:complexType>\n";
1660 $contentStr =
" <$schemaPrefix:complexType name=\"$typeName\"/>\n";
1662 $xml .= $contentStr;
1665 if (isset($this->simpleTypes) && count($this->simpleTypes) > 0) {
1666 foreach ($this->simpleTypes as $typeName => $eParts) {
1667 $xml .=
" <$schemaPrefix:simpleType name=\"$typeName\">\n <$schemaPrefix:restriction base=\"" . $this->contractQName($eParts[
'type']) .
"\">\n";
1668 if (isset($eParts[
'enumeration'])) {
1669 foreach ($eParts[
'enumeration'] as
$e) {
1670 $xml .=
" <$schemaPrefix:enumeration value=\"$e\"/>\n";
1673 $xml .=
" </$schemaPrefix:restriction>\n </$schemaPrefix:simpleType>";
1677 if (isset($this->elements) && count($this->elements) > 0) {
1678 foreach ($this->elements as $element => $eParts) {
1679 $xml .=
" <$schemaPrefix:element name=\"$element\" type=\"" . $this->contractQName($eParts[
'type']) .
"\"/>\n";
1683 if (isset($this->attributes) && count($this->attributes) > 0) {
1684 foreach ($this->attributes as $attr => $aParts) {
1685 $xml .=
" <$schemaPrefix:attribute name=\"$attr\" type=\"" . $this->contractQName($aParts[
'type']) .
"\"\n/>";
1690 foreach ($this->schemaInfo as $k => $v) {
1691 if ($k ==
'elementFormDefault' || $k ==
'attributeFormDefault') {
1692 $attr .=
" $k=\"$v\"";
1695 $el =
"<$schemaPrefix:schema$attr targetNamespace=\"$this->schemaTargetNamespace\"\n";
1696 foreach (array_diff($this->usedNamespaces, $this->enclosingNamespaces) as $nsp => $ns) {
1697 $el .=
" xmlns:$nsp=\"$ns\"";
1699 $xml = $el .
">\n" .
$xml .
"</$schemaPrefix:schema>\n";
1711 $this->
debug(
'<' . $this->schemaTargetNamespace .
'> ' . $string);
1728 if (isset($this->typemap[$ns][$type])) {
1730 return $this->typemap[$ns][$type];
1731 } elseif (isset($this->complexTypes[$type])) {
1733 return $this->complexTypes[$type][
'phpType'];
1763 if (substr($type, -1) ==
'^') {
1765 $type = substr($type, 0, -1);
1770 if ((! $is_element) && isset($this->complexTypes[$type])) {
1771 $this->
xdebug(
"in getTypeDef, found complexType $type");
1772 return $this->complexTypes[$type];
1773 } elseif ((! $is_element) && isset($this->simpleTypes[$type])) {
1774 $this->
xdebug(
"in getTypeDef, found simpleType $type");
1775 if (!isset($this->simpleTypes[$type][
'phpType'])) {
1778 $uqType = substr($this->simpleTypes[$type][
'type'], strrpos($this->simpleTypes[$type][
'type'],
':') + 1);
1779 $ns = substr($this->simpleTypes[$type][
'type'], 0, strrpos($this->simpleTypes[$type][
'type'],
':'));
1782 $this->
xdebug(
"in getTypeDef, found type for simpleType $type:");
1784 if (isset($etype[
'phpType'])) {
1785 $this->simpleTypes[$type][
'phpType'] = $etype[
'phpType'];
1787 if (isset($etype[
'elements'])) {
1788 $this->simpleTypes[$type][
'elements'] = $etype[
'elements'];
1792 return $this->simpleTypes[$type];
1793 } elseif (isset($this->elements[$type])) {
1794 $this->
xdebug(
"in getTypeDef, found element $type");
1795 if (!isset($this->elements[$type][
'phpType'])) {
1797 $uqType = substr($this->elements[$type][
'type'], strrpos($this->elements[$type][
'type'],
':') + 1);
1798 $ns = substr($this->elements[$type][
'type'], 0, strrpos($this->elements[$type][
'type'],
':'));
1801 $this->
xdebug(
"in getTypeDef, found type for element $type:");
1803 if (isset($etype[
'phpType'])) {
1804 $this->elements[$type][
'phpType'] = $etype[
'phpType'];
1806 if (isset($etype[
'elements'])) {
1807 $this->elements[$type][
'elements'] = $etype[
'elements'];
1809 } elseif ($ns ==
'http://www.w3.org/2001/XMLSchema') {
1810 $this->
xdebug(
"in getTypeDef, element $type is an XSD type");
1811 $this->elements[$type][
'phpType'] =
'scalar';
1814 return $this->elements[$type];
1815 } elseif (isset($this->attributes[$type])) {
1816 $this->
xdebug(
"in getTypeDef, found attribute $type");
1817 return $this->attributes[$type];
1818 } elseif (preg_match(
'/_ContainedType$/', $type)) {
1819 $this->
xdebug(
"in getTypeDef, have an untyped element $type");
1820 $typeDef[
'typeClass'] =
'simpleType';
1821 $typeDef[
'phpType'] =
'scalar';
1822 $typeDef[
'type'] =
'http://www.w3.org/2001/XMLSchema:string';
1825 $this->
xdebug(
"in getTypeDef, did not find $type");
1841 $str .=
'<' . $type;
1842 if (is_array($typeDef[
'attrs'])) {
1843 foreach ($typeDef[
'attrs'] as $attName =>
$data) {
1844 $str .=
" $attName=\"{type = " .
$data[
'type'] .
"}\"";
1847 $str .=
" xmlns=\"" . $this->schema[
'targetNamespace'] .
"\"";
1848 if (count($typeDef[
'elements']) > 0) {
1850 foreach ($typeDef[
'elements'] as $element => $eData) {
1854 } elseif ($typeDef[
'typeClass'] ==
'element') {
1855 $str .=
"></$type>";
1879 if ($typeDef[
'phpType'] ==
'struct') {
1880 $buffer .=
'<table>';
1881 foreach ($typeDef[
'elements'] as $child => $childDef) {
1883 <tr><td align='right'>$childDef[name] (type: " . $this->
getLocalPart($childDef[
'type']) .
"):</td>
1884 <td><input type='text' name='parameters[" . $name .
"][$childDef[name]]'></td></tr>";
1886 $buffer .=
'</table>';
1888 } elseif ($typeDef[
'phpType'] ==
'array') {
1889 $buffer .=
'<table>';
1890 for ($i = 0;$i < 3; $i++) {
1892 <tr><td align='right'>array item (type: $typeDef[arrayType]):</td>
1893 <td><input type='text' name='parameters[" . $name .
"][]'></td></tr>";
1895 $buffer .=
'</table>';
1898 $buffer .=
"<input type='text' name='parameters[$name]'>";
1901 $buffer .=
"<input type='text' name='parameters[$name]'>";
1947 public function addComplexType($name, $typeClass =
'complexType', $phpType =
'array', $compositor =
'', $restrictionBase =
'',
$elements = array(), $attrs = array(), $arrayType =
'')
1949 $this->complexTypes[$name] = array(
1951 'typeClass' => $typeClass,
1952 'phpType' => $phpType,
1953 'compositor' => $compositor,
1954 'restrictionBase' => $restrictionBase,
1957 'arrayType' => $arrayType
1960 $this->
xdebug(
"addComplexType $name:");
1976 public function addSimpleType($name, $restrictionBase =
'', $typeClass =
'simpleType', $phpType =
'scalar', $enumeration = array())
1978 $this->simpleTypes[$name] = array(
1980 'typeClass' => $typeClass,
1981 'phpType' => $phpType,
1982 'type' => $restrictionBase,
1983 'enumeration' => $enumeration
1986 $this->
xdebug(
"addSimpleType $name:");
1999 if (! $this->
getPrefix($attrs[
'type'])) {
2000 $attrs[
'type'] = $this->schemaTargetNamespace .
':' . $attrs[
'type'];
2002 $this->elements[ $attrs[
'name'] ] = $attrs;
2003 $this->elements[ $attrs[
'name'] ][
'typeClass'] =
'element';
2005 $this->
xdebug(
"addElement " . $attrs[
'name']);
2091 $this->name =
$name;
2092 $this->type =
$type;
2108 return $this->
serialize_val($this->value, $this->name, $this->type, $this->element_ns, $this->type_ns, $this->attributes, $use,
true);
2188 $this->
debug(
"ctor url=$url use_curl=$use_curl curl_options:");
2191 if (is_array($curl_options)) {
2192 $this->ch_options = $curl_options;
2195 preg_match(
'/\$Revisio' .
'n: ([^ ]+)/', $this->revision, $rev);
2197 $this->
setHeader(
'User-Agent', $this->title .
'/' . $this->version .
' (' . ($rev[1] ??
'1.1') .
')');
2209 $this->
debug(
"setCurlOption option=$option, value=");
2211 curl_setopt($this->ch, $option, $value);
2223 $this->outgoing_headers[$name] = $value;
2224 $this->
debug(
"set header $name: $value");
2235 if (isset($this->outgoing_headers[$name])) {
2236 $this->
debug(
"unset header $name");
2237 unset($this->outgoing_headers[$name]);
2251 $u = parse_url(
$url);
2252 foreach ($u as $k => $v) {
2253 $this->
debug(
"parsed URL $k = $v");
2258 if (isset($u[
'query']) && $u[
'query'] !=
'') {
2259 $this->path .=
'?' . $u[
'query'];
2263 if (!isset($u[
'port'])) {
2264 if ($u[
'scheme'] ==
'https') {
2275 if (!isset($u[
'port'])) {
2278 $this->
setHeader(
'Host', $this->host .
':' . $this->port);
2281 if (isset($u[
'user']) && $u[
'user'] !=
'') {
2282 $this->
setCredentials(urldecode($u[
'user']), isset($u[
'pass']) ? urldecode($u[
'pass']) :
'');
2294 if ($this->use_curl || ($this->scheme ==
'https') || ($this->scheme ==
'http' && $this->authtype ==
'ntlm') || ($this->scheme ==
'http' && is_array($this->proxy) && $this->proxy[
'authtype'] ==
'ntlm')) {
2297 if (($this->scheme ==
'http' || $this->scheme ==
'ssl') && $this->authtype !=
'ntlm' && (!is_array($this->proxy) || $this->proxy[
'authtype'] !=
'ntlm')) {
2311 public function connect($connection_timeout = 0, $response_timeout = 30)
2325 $this->
debug(
"connect connection_timeout $connection_timeout, response_timeout $response_timeout, scheme $this->scheme, host $this->host, port $this->port");
2327 if (!is_array($this->proxy)) {
2331 $host = $this->proxy[
'host'];
2332 $port = $this->proxy[
'port'];
2336 if ($this->persistentConnection && isset($this->fp) && is_resource($this->fp)) {
2337 if (!feof($this->fp)) {
2338 $this->
debug(
'Re-use persistent connection');
2342 $this->
debug(
'Closed persistent connection at EOF');
2346 if ($this->scheme ==
'ssl') {
2349 $this->
debug(
'calling fsockopen with host ' .
$host .
' connection_timeout ' . $connection_timeout);
2352 if ($connection_timeout > 0) {
2353 $this->fp = @fsockopen(
$host, $this->port, $this->errno, $this->error_str, $connection_timeout);
2355 $this->fp = @fsockopen(
$host, $this->port, $this->errno, $this->error_str);
2360 $msg =
'Couldn\'t open socket connection to server ' .
$this->url;
2364 $msg .=
' prior to connect(). This is often a problem looking up the host name.';
2372 $this->
debug(
'set response timeout to ' . $response_timeout);
2373 socket_set_timeout($this->fp, $response_timeout);
2375 $this->
debug(
'socket connected');
2377 } elseif ($this->
io_method() ==
'curl') {
2378 if (!extension_loaded(
'curl')) {
2380 $this->
setError(
'The PHP cURL Extension is required for HTTPS or NLTM. You will need to re-build or update your PHP to included cURL.');
2384 if (defined(
'CURLOPT_CONNECTIONTIMEOUT')) {
2385 $CURLOPT_CONNECTIONTIMEOUT = CURLOPT_CONNECTIONTIMEOUT;
2387 $CURLOPT_CONNECTIONTIMEOUT = 78;
2389 if (defined(
'CURLOPT_HTTPAUTH')) {
2390 $CURLOPT_HTTPAUTH = CURLOPT_HTTPAUTH;
2392 $CURLOPT_HTTPAUTH = 107;
2394 if (defined(
'CURLOPT_PROXYAUTH')) {
2395 $CURLOPT_PROXYAUTH = CURLOPT_PROXYAUTH;
2397 $CURLOPT_PROXYAUTH = 111;
2399 if (defined(
'CURLAUTH_BASIC')) {
2400 $CURLAUTH_BASIC = CURLAUTH_BASIC;
2402 $CURLAUTH_BASIC = 1;
2404 if (defined(
'CURLAUTH_DIGEST')) {
2405 $CURLAUTH_DIGEST = CURLAUTH_DIGEST;
2407 $CURLAUTH_DIGEST = 2;
2409 if (defined(
'CURLAUTH_NTLM')) {
2410 $CURLAUTH_NTLM = CURLAUTH_NTLM;
2415 $this->
debug(
'connect using cURL');
2417 $this->ch = curl_init();
2419 $hostURL = ($this->port !=
'') ?
"$this->scheme://$this->host:$this->port" :
"$this->scheme://$this->host";
2424 if (ini_get(
'safe_mode') || ini_get(
'open_basedir')) {
2425 $this->
debug(
'safe_mode or open_basedir set, so do not set CURLOPT_FOLLOWLOCATION');
2426 $this->
debug(
'safe_mode = ');
2428 $this->
debug(
'open_basedir = ');
2443 if ($this->persistentConnection) {
2449 $this->persistentConnection =
false;
2450 $this->
setHeader(
'Connection',
'close');
2453 if ($connection_timeout != 0) {
2454 $this->
setCurlOption($CURLOPT_CONNECTIONTIMEOUT, $connection_timeout);
2456 if ($response_timeout != 0) {
2460 if ($this->scheme ==
'https') {
2461 $this->
debug(
'set cURL SSL verify options');
2470 if ($this->authtype ==
'certificate') {
2471 $this->
debug(
'set cURL certificate options');
2472 if (isset($this->certRequest[
'cainfofile'])) {
2473 $this->
setCurlOption(CURLOPT_CAINFO, $this->certRequest[
'cainfofile']);
2475 if (isset($this->certRequest[
'verifypeer'])) {
2476 $this->
setCurlOption(CURLOPT_SSL_VERIFYPEER, $this->certRequest[
'verifypeer']);
2480 if (isset($this->certRequest[
'verifyhost'])) {
2481 $this->
setCurlOption(CURLOPT_SSL_VERIFYHOST, $this->certRequest[
'verifyhost']);
2485 if (isset($this->certRequest[
'sslcertfile'])) {
2486 $this->
setCurlOption(CURLOPT_SSLCERT, $this->certRequest[
'sslcertfile']);
2488 if (isset($this->certRequest[
'sslkeyfile'])) {
2489 $this->
setCurlOption(CURLOPT_SSLKEY, $this->certRequest[
'sslkeyfile']);
2491 if (isset($this->certRequest[
'passphrase'])) {
2492 $this->
setCurlOption(CURLOPT_SSLKEYPASSWD, $this->certRequest[
'passphrase']);
2494 if (isset($this->certRequest[
'certpassword'])) {
2495 $this->
setCurlOption(CURLOPT_SSLCERTPASSWD, $this->certRequest[
'certpassword']);
2499 if ($this->authtype && ($this->authtype !=
'certificate')) {
2500 if ($this->username) {
2501 $this->
debug(
'set cURL username/password');
2502 $this->
setCurlOption(CURLOPT_USERPWD,
"$this->username:$this->password");
2504 if ($this->authtype ==
'basic') {
2505 $this->
debug(
'set cURL for Basic authentication');
2508 if ($this->authtype ==
'digest') {
2509 $this->
debug(
'set cURL for digest authentication');
2512 if ($this->authtype ==
'ntlm') {
2513 $this->
debug(
'set cURL for NTLM authentication');
2517 if (is_array($this->proxy)) {
2518 $this->
debug(
'set cURL proxy options');
2519 if ($this->proxy[
'port'] !=
'') {
2520 $this->
setCurlOption(CURLOPT_PROXY, $this->proxy[
'host'] .
':' . $this->proxy[
'port']);
2524 if ($this->proxy[
'username'] || $this->proxy[
'password']) {
2525 $this->
debug(
'set cURL proxy authentication options');
2526 $this->
setCurlOption(CURLOPT_PROXYUSERPWD, $this->proxy[
'username'] .
':' . $this->proxy[
'password']);
2527 if ($this->proxy[
'authtype'] ==
'basic') {
2530 if ($this->proxy[
'authtype'] ==
'ntlm') {
2535 $this->
debug(
'cURL connection set up');
2538 $this->
setError(
'Unknown scheme ' . $this->scheme);
2539 $this->
debug(
'Unknown scheme ' . $this->scheme);
2554 public function send(
$data, $timeout = 0, $response_timeout = 30, $cookies =
null)
2556 $this->
debug(
'entered send() with data of length: ' . strlen(
$data));
2558 $this->tryagain =
true;
2560 while ($this->tryagain) {
2561 $this->tryagain =
false;
2564 if (!$this->
connect($timeout, $response_timeout)) {
2576 $this->
setError(
"Too many tries to get an OK response ($this->response_status_line)");
2579 $this->
debug(
'end of send()');
2595 public function sendHTTPS(
$data, $timeout = 0, $response_timeout = 30, $cookies =
null)
2597 return $this->
send(
$data, $timeout, $response_timeout, $cookies);
2612 $this->
debug(
"setCredentials username=$username authtype=$authtype digestRequest=");
2614 $this->
debug(
"certRequest=");
2648 $unhashedDigest =
'';
2652 $unhashedDigest = $HA1 .
':' . $nonce .
':' . sprintf(
"%08d",
$digestRequest[
'nc']) .
':' . $cnonce .
':' .
$digestRequest[
'qop'] .
':' . $HA2;
2654 $unhashedDigest = $HA1 .
':' . $nonce .
':' . $HA2;
2657 $hashedDigest = md5($unhashedDigest);
2664 $this->
setHeader(
'Authorization',
'Digest username="' .
$username .
'", realm="' .
$digestRequest[
'realm'] .
'", nonce="' . $nonce .
'", uri="' . $this->digest_uri . $opaque .
'", cnonce="' . $cnonce .
'", nc=' . sprintf(
"%08x",
$digestRequest[
'nc']) .
', qop="' .
$digestRequest[
'qop'] .
'", response="' . $hashedDigest .
'"');
2668 $this->
debug(
'Authorization header not set for certificate');
2671 $this->
debug(
'Authorization header not set for ntlm');
2687 $this->
setHeader(
'SOAPAction',
'"' . $soapaction .
'"');
2698 if (function_exists(
'gzdeflate')) {
2699 $this->protocol_version =
'1.1';
2700 $this->
setHeader(
'Accept-Encoding', $enc);
2701 if (!isset($this->outgoing_headers[
'Connection'])) {
2702 $this->
setHeader(
'Connection',
'close');
2703 $this->persistentConnection =
false;
2705 #set_magic_quotes_runtime(0);
2707 $this->encoding = $enc;
2721 public function setProxy($proxyhost, $proxyport, $proxyusername =
'', $proxypassword =
'', $proxyauthtype =
'basic')
2724 $this->proxy = array(
2725 'host' => $proxyhost,
2726 'port' => $proxyport,
2727 'username' => $proxyusername,
2728 'password' => $proxypassword,
2729 'authtype' => $proxyauthtype
2731 if ($proxyusername !=
'' && $proxypassword !=
'' && $proxyauthtype =
'basic') {
2732 $this->
setHeader(
'Proxy-Authorization',
' Basic ' . base64_encode($proxyusername .
':' . $proxypassword));
2735 $this->
debug(
'remove proxy');
2752 $skipHeaders = array(
'HTTP/1.1 100',
2759 'HTTP/1.0 200 Connection established');
2760 foreach ($skipHeaders as $hd) {
2761 $prefix = substr(
$data, 0, strlen($hd));
2762 if ($prefix == $hd) {
2788 $chunkend = strpos($buffer, $lb);
2789 if ($chunkend ==
false) {
2790 $this->
debug(
'no linebreak found in decodeChunked');
2793 $temp = substr($buffer, 0, $chunkend);
2794 $chunk_size = hexdec(trim($temp));
2795 $chunkstart = $chunkend + strlen($lb);
2797 while ($chunk_size > 0) {
2798 $this->
debug(
"chunkstart: $chunkstart chunk_size: $chunk_size");
2799 $chunkend = strpos($buffer, $lb, $chunkstart + $chunk_size);
2802 if ($chunkend ==
false) {
2803 $chunk = substr($buffer, $chunkstart);
2806 $length += strlen($chunk);
2811 $chunk = substr($buffer, $chunkstart, $chunkend - $chunkstart);
2815 $length += strlen($chunk);
2817 $chunkstart = $chunkend + strlen($lb);
2819 $chunkend = strpos($buffer, $lb, $chunkstart) + strlen($lb);
2820 if ($chunkend ==
false) {
2823 $temp = substr($buffer, $chunkstart, $chunkend - $chunkstart);
2824 $chunk_size = hexdec(trim($temp));
2825 $chunkstart = $chunkend;
2853 $req =
"$this->request_method $uri HTTP/$this->protocol_version";
2854 $this->
debug(
"HTTP request: $req");
2855 $this->outgoing_payload =
"$req\r\n";
2858 foreach ($this->outgoing_headers as $k => $v) {
2859 $hdr = $k .
': ' . $v;
2860 $this->
debug(
"HTTP header: $hdr");
2861 $this->outgoing_payload .=
"$hdr\r\n";
2865 if ($cookie_str !=
'') {
2866 $hdr =
'Cookie: ' . $cookie_str;
2867 $this->
debug(
"HTTP header: $hdr");
2868 $this->outgoing_payload .=
"$hdr\r\n";
2872 $this->outgoing_payload .=
"\r\n";
2875 $this->outgoing_payload .=
$data;
2889 $cookie_str = $this->
getCookiesForRequest($cookies, (($this->scheme ==
'ssl') || ($this->scheme ==
'https')));
2896 if (!fputs($this->fp, $this->outgoing_payload, strlen($this->outgoing_payload))) {
2897 $this->
setError(
'couldn\'t write message data to socket');
2898 $this->
debug(
'couldn\'t write message data to socket');
2901 $this->
debug(
'wrote data to socket, length = ' . strlen($this->outgoing_payload));
2903 } elseif ($this->
io_method() ==
'curl') {
2909 $curl_headers = array();
2910 foreach ($this->outgoing_headers as $k => $v) {
2911 if ($k ==
'Connection' || $k ==
'Content-Length' || $k ==
'Host' || $k ==
'Authorization' || $k ==
'Proxy-Authorization') {
2912 $this->
debug(
"Skip cURL header $k: $v");
2914 $curl_headers[] =
"$k: $v";
2917 if ($cookie_str !=
'') {
2918 $curl_headers[] =
'Cookie: ' . $cookie_str;
2921 $this->
debug(
'set cURL HTTP headers');
2922 if ($this->request_method ==
"POST") {
2925 $this->
debug(
'set cURL POST data');
2929 foreach ($this->ch_options as $key => $val) {
2933 $this->
debug(
'set cURL payload');
2946 $this->incoming_payload =
'';
2951 while (!isset($lb)) {
2953 if (feof($this->fp)) {
2954 $this->incoming_payload =
$data;
2955 $this->
debug(
'found no headers before EOF after length ' . strlen(
$data));
2956 $this->
debug(
"received before EOF:\n" .
$data);
2957 $this->
setError(
'server failed to send headers');
2961 $tmp = fgets($this->fp, 256);
2962 $tmplen = strlen($tmp);
2963 $this->
debug(
"read line of $tmplen bytes: " . trim($tmp));
2966 $this->incoming_payload =
$data;
2967 $this->
debug(
'socket read of headers timed out after length ' . strlen(
$data));
2968 $this->
debug(
"read before timeout: " .
$data);
2969 $this->
setError(
'socket read of headers timed out');
2974 $pos = strpos(
$data,
"\r\n\r\n");
2978 $pos = strpos(
$data,
"\n\n");
2984 if (isset($lb) && preg_match(
'/^HTTP\/1.1 100/',
$data)) {
2990 $this->incoming_payload .=
$data;
2991 $this->
debug(
'found end of headers after length ' . strlen(
$data));
2993 $header_data = trim(substr(
$data, 0, $pos));
2994 $header_array = explode($lb, $header_data);
2995 $this->incoming_headers = array();
2996 $this->incoming_cookies = array();
2997 foreach ($header_array as $header_line) {
2998 $arr = explode(
':', $header_line, 2);
2999 if (count($arr) > 1) {
3000 $header_name = strtolower(trim($arr[0]));
3001 $this->incoming_headers[$header_name] = trim($arr[1]);
3002 if ($header_name ==
'set-cookie') {
3006 $this->incoming_cookies[] = $cookie;
3007 $this->
debug(
'found cookie: ' . $cookie[
'name'] .
' = ' . $cookie[
'value']);
3009 $this->
debug(
'did not find cookie in ' . trim($arr[1]));
3012 } elseif (isset($header_name)) {
3014 $this->incoming_headers[$header_name] .= $lb .
' ' . $header_line;
3019 if (isset($this->incoming_headers[
'transfer-encoding']) && strtolower($this->incoming_headers[
'transfer-encoding']) ==
'chunked') {
3020 $content_length = 2147483647;
3022 $this->
debug(
"want to read chunked content");
3023 } elseif (isset($this->incoming_headers[
'content-length'])) {
3024 $content_length = $this->incoming_headers[
'content-length'];
3026 $this->
debug(
"want to read content of length $content_length");
3028 $content_length = 2147483647;
3030 $this->
debug(
"want to read content to EOF");
3035 $tmp = fgets($this->fp, 256);
3036 $tmplen = strlen($tmp);
3037 $this->
debug(
"read chunk line of $tmplen bytes");
3039 $this->incoming_payload =
$data;
3040 $this->
debug(
'socket read of chunk length timed out after length ' . strlen(
$data));
3041 $this->
debug(
"read before timeout:\n" .
$data);
3042 $this->
setError(
'socket read of chunk length timed out');
3045 $content_length = hexdec(trim($tmp));
3046 $this->
debug(
"chunk length $content_length");
3049 while (($strlen < $content_length) && (!feof($this->fp))) {
3050 $readlen = min(8192, $content_length - $strlen);
3051 $tmp = fread($this->fp, $readlen);
3052 $tmplen = strlen($tmp);
3053 $this->
debug(
"read buffer of $tmplen bytes");
3054 if (($tmplen == 0) && (!feof($this->fp))) {
3055 $this->incoming_payload =
$data;
3056 $this->
debug(
'socket read of body timed out after length ' . strlen(
$data));
3057 $this->
debug(
"read before timeout:\n" .
$data);
3058 $this->
setError(
'socket read of body timed out');
3064 if ($chunked && ($content_length > 0)) {
3065 $tmp = fgets($this->fp, 256);
3066 $tmplen = strlen($tmp);
3067 $this->
debug(
"read chunk terminator of $tmplen bytes");
3069 $this->incoming_payload =
$data;
3070 $this->
debug(
'socket read of chunk terminator timed out after length ' . strlen(
$data));
3071 $this->
debug(
"read before timeout:\n" .
$data);
3072 $this->
setError(
'socket read of chunk terminator timed out');
3076 }
while ($chunked && ($content_length > 0) && (!feof($this->fp)));
3077 if (feof($this->fp)) {
3078 $this->
debug(
'read to EOF');
3080 $this->
debug(
'read body of length ' . strlen(
$data));
3081 $this->incoming_payload .=
$data;
3082 $this->
debug(
'received a total of ' . strlen($this->incoming_payload) .
' bytes of data from server');
3086 (isset($this->incoming_headers[
'connection']) && strtolower($this->incoming_headers[
'connection']) ==
'close') ||
3087 (! $this->persistentConnection) || feof($this->fp)) {
3090 $this->
debug(
'closed socket');
3094 if ($this->incoming_payload ==
'') {
3095 $this->
setError(
'no response from server');
3109 } elseif ($this->
io_method() ==
'curl') {
3111 $this->
debug(
'send and receive with cURL');
3112 $this->incoming_payload = curl_exec($this->ch);
3115 $cErr = curl_error($this->ch);
3117 $err =
'cURL ERROR: ' . curl_errno($this->ch) .
': ' . $cErr .
'<br>';
3119 foreach (curl_getinfo($this->ch) as $k => $v) {
3120 $err .=
"$k: $v<br>";
3132 $this->
debug(
'No cURL error, closing cURL');
3138 $this->
debug(
"Found HTTP header to skip");
3139 if ($pos = strpos(
$data,
"\r\n\r\n")) {
3141 } elseif ($pos = strpos(
$data,
"\n\n")) {
3149 while (preg_match(
'/^HTTP\/1.1 100/',
$data)) {
3150 if ($pos = strpos(
$data,
"\r\n\r\n")) {
3152 } elseif ($pos = strpos(
$data,
"\n\n")) {
3159 if ($pos = strpos(
$data,
"\r\n\r\n")) {
3161 } elseif ($pos = strpos(
$data,
"\n\n")) {
3164 $this->
debug(
'no proper separation of headers and document');
3165 $this->
setError(
'no proper separation of headers and document');
3168 $header_data = trim(substr(
$data, 0, $pos));
3169 $header_array = explode($lb, $header_data);
3171 $this->
debug(
'found proper separation of headers and document');
3172 $this->
debug(
'cleaned data, stringlen: ' . strlen(
$data));
3174 foreach ($header_array as $header_line) {
3175 $arr = explode(
':', $header_line, 2);
3176 if (count($arr) > 1) {
3177 $header_name = strtolower(trim($arr[0]));
3178 $this->incoming_headers[$header_name] = trim($arr[1]);
3179 if ($header_name ==
'set-cookie') {
3183 $this->incoming_cookies[] = $cookie;
3184 $this->
debug(
'found cookie: ' . $cookie[
'name'] .
' = ' . $cookie[
'value']);
3186 $this->
debug(
'did not find cookie in ' . trim($arr[1]));
3189 } elseif (isset($header_name)) {
3191 $this->incoming_headers[$header_name] .= $lb .
' ' . $header_line;
3196 $this->response_status_line = $header_array[0];
3197 $arr = explode(
' ', $this->response_status_line, 3);
3198 $http_version = $arr[0];
3199 $http_status = intval($arr[1]);
3200 $http_reason = count($arr) > 2 ? $arr[2] :
'';
3203 if (isset($this->incoming_headers[
'location']) && ($http_status == 301 || $http_status == 302)) {
3204 $this->
debug(
"Got $http_status $http_reason with Location: " . $this->incoming_headers[
'location']);
3205 $this->
setURL($this->incoming_headers[
'location']);
3206 $this->tryagain =
true;
3211 if (isset($this->incoming_headers[
'www-authenticate']) && $http_status == 401) {
3212 $this->
debug(
"Got 401 $http_reason with WWW-Authenticate: " . $this->incoming_headers[
'www-authenticate']);
3213 if (strstr($this->incoming_headers[
'www-authenticate'],
"Digest ")) {
3214 $this->
debug(
'Server wants digest authentication');
3216 $digestString = str_replace(
'Digest ',
'', $this->incoming_headers[
'www-authenticate']);
3219 $digestElements = explode(
',', $digestString);
3220 foreach ($digestElements as $val) {
3221 $tempElement = explode(
'=', trim($val), 2);
3222 $digestRequest[$tempElement[0]] = str_replace(
"\"",
'', $tempElement[1]);
3228 $this->tryagain =
true;
3232 $this->
debug(
'HTTP authentication failed');
3233 $this->
setError(
'HTTP authentication failed');
3238 ($http_status >= 300 && $http_status <= 307) ||
3239 ($http_status >= 400 && $http_status <= 417) ||
3240 ($http_status >= 501 && $http_status <= 505)
3242 $this->
setError(
"Unsupported HTTP response status $http_status $http_reason (soapclient->response has contents of the response)");
3247 if (isset($this->incoming_headers[
'content-encoding']) && $this->incoming_headers[
'content-encoding'] !=
'') {
3248 if (strtolower($this->incoming_headers[
'content-encoding']) ==
'deflate' || strtolower($this->incoming_headers[
'content-encoding']) ==
'gzip') {
3250 if (function_exists(
'gzinflate')) {
3254 $this->
debug(
'The gzinflate function exists');
3255 $datalen = strlen(
$data);
3256 if ($this->incoming_headers[
'content-encoding'] ==
'deflate') {
3257 if ($degzdata = @gzinflate(
$data)) {
3259 $this->
debug(
'The payload has been inflated to ' . strlen(
$data) .
' bytes');
3260 if (strlen(
$data) < $datalen) {
3262 $this->
debug(
'The inflated payload is smaller than the gzipped one; try again');
3263 if ($degzdata = @gzinflate(
$data)) {
3265 $this->
debug(
'The payload has been inflated again to ' . strlen(
$data) .
' bytes');
3269 $this->
debug(
'Error using gzinflate to inflate the payload');
3270 $this->
setError(
'Error using gzinflate to inflate the payload');
3272 } elseif ($this->incoming_headers[
'content-encoding'] ==
'gzip') {
3273 if ($degzdata = @gzinflate(substr(
$data, 10))) {
3275 $this->
debug(
'The payload has been un-gzipped to ' . strlen(
$data) .
' bytes');
3276 if (strlen(
$data) < $datalen) {
3278 $this->
debug(
'The un-gzipped payload is smaller than the gzipped one; try again');
3279 if ($degzdata = @gzinflate(substr(
$data, 10))) {
3281 $this->
debug(
'The payload has been un-gzipped again to ' . strlen(
$data) .
' bytes');
3285 $this->
debug(
'Error using gzinflate to un-gzip the payload');
3286 $this->
setError(
'Error using gzinflate to un-gzip the payload');
3292 $this->incoming_payload = $header_data . $lb . $lb .
$data;
3294 $this->
debug(
'The server sent compressed data. Your php install must have the Zlib extension compiled in to support this.');
3295 $this->
setError(
'The server sent compressed data. Your php install must have the Zlib extension compiled in to support this.');
3298 $this->
debug(
'Unsupported Content-Encoding ' . $this->incoming_headers[
'content-encoding']);
3299 $this->
setError(
'Unsupported Content-Encoding ' . $this->incoming_headers[
'content-encoding']);
3302 $this->
debug(
'No Content-Encoding header');
3305 if (strlen(
$data) == 0) {
3306 $this->
debug(
'no data after headers!');
3307 $this->
setError(
'no data present after HTTP headers');
3323 $this->
setHeader(
'Content-Type', $type . ($charset ?
'; charset=' . $charset :
''));
3334 if (isset($this->outgoing_headers[
'Accept-Encoding'])) {
3337 $this->protocol_version =
'1.1';
3338 $this->persistentConnection =
true;
3339 $this->
setHeader(
'Connection',
'Keep-Alive');
3355 $cookie_str = str_replace(
'; ',
';', $cookie_str) .
';';
3358 $data = explode(
';', $cookie_str);
3359 $value_str =
$data[0];
3361 $cookie_param =
'domain=';
3362 $start = strpos($cookie_str, $cookie_param);
3364 $domain = substr($cookie_str, $start + strlen($cookie_param));
3365 $domain = substr($domain, 0, strpos($domain,
';'));
3370 $cookie_param =
'expires=';
3371 $start = strpos($cookie_str, $cookie_param);
3373 $expires = substr($cookie_str, $start + strlen($cookie_param));
3374 $expires = substr($expires, 0, strpos($expires,
';'));
3379 $cookie_param =
'path=';
3380 $start = strpos($cookie_str, $cookie_param);
3382 $path = substr($cookie_str, $start + strlen($cookie_param));
3388 $cookie_param =
';secure;';
3389 if (strpos($cookie_str, $cookie_param) !==
false) {
3395 $sep_pos = strpos($value_str,
'=');
3398 $name = substr($value_str, 0, $sep_pos);
3399 $value = substr($value_str, $sep_pos + 1);
3400 $cookie = array(
'name' => $name,
3402 'domain' => $domain,
3404 'expires' => $expires,
3423 if ((! is_null($cookies)) && (is_array($cookies))) {
3424 foreach ($cookies as $cookie) {
3425 if (! is_array($cookie)) {
3428 $this->
debug(
"check cookie for validity: " . $cookie[
'name'] .
'=' . $cookie[
'value']);
3429 if ((isset($cookie[
'expires'])) && (! empty($cookie[
'expires']))) {
3430 if (strtotime($cookie[
'expires']) <= time()) {
3431 $this->
debug(
'cookie has expired');
3435 if ((isset($cookie[
'domain'])) && (! empty($cookie[
'domain']))) {
3436 $domain = preg_quote($cookie[
'domain']);
3437 if (! preg_match(
"'.*$domain$'i", $this->host)) {
3438 $this->
debug(
'cookie has different domain');
3442 if ((isset($cookie[
'path'])) && (! empty($cookie[
'path']))) {
3443 $path = preg_quote($cookie[
'path']);
3444 if (! preg_match(
"'^$path.*'i", $this->path)) {
3445 $this->
debug(
'cookie is for a different path');
3449 if ((! $secure) && (isset($cookie[
'secure'])) && ($cookie[
'secure'])) {
3450 $this->
debug(
'cookie is secure, transport is not');
3453 $cookie_str .= $cookie[
'name'] .
'=' . $cookie[
'value'] .
'; ';
3454 $this->
debug(
'add cookie to Cookie-String: ' . $cookie[
'name'] .
'=' . $cookie[
'value']);
3640 global $HTTP_SERVER_VARS;
3643 $this->
debug(
"_SERVER is defined:");
3645 } elseif (isset($HTTP_SERVER_VARS)) {
3646 $this->
debug(
"HTTP_SERVER_VARS is defined:");
3649 $this->
debug(
"Neither _SERVER nor HTTP_SERVER_VARS is defined.");
3652 if (isset($debug)) {
3653 $this->
debug(
"In nusoap_server, set debug_flag=$debug based on global flag");
3654 $this->debug_flag = $debug;
3655 } elseif (isset(
$_SERVER[
'QUERY_STRING'])) {
3656 $qs = explode(
'&',
$_SERVER[
'QUERY_STRING']);
3657 foreach ($qs as $v) {
3658 if (substr($v, 0, 6) ==
'debug=') {
3659 $this->
debug(
"In nusoap_server, set debug_flag=" . substr($v, 6) .
" based on query string #1");
3660 $this->debug_flag = substr($v, 6);
3663 } elseif (isset($HTTP_SERVER_VARS[
'QUERY_STRING'])) {
3664 $qs = explode(
'&', $HTTP_SERVER_VARS[
'QUERY_STRING']);
3665 foreach ($qs as $v) {
3666 if (substr($v, 0, 6) ==
'debug=') {
3667 $this->
debug(
"In nusoap_server, set debug_flag=" . substr($v, 6) .
" based on query string #2");
3668 $this->debug_flag = substr($v, 6);
3675 $this->
debug(
"In nusoap_server, WSDL is specified");
3676 if (is_object(
$wsdl) && (get_class(
$wsdl) ==
'wsdl')) {
3678 $this->externalWSDLURL = $this->
wsdl->wsdl;
3679 $this->
debug(
'Use existing wsdl instance from ' . $this->externalWSDLURL);
3683 $this->externalWSDLURL =
$wsdl;
3688 die(
'WSDL ERROR: ' . $err);
3701 global $HTTP_SERVER_VARS;
3703 if (isset(
$_SERVER[
'QUERY_STRING'])) {
3705 } elseif (isset($HTTP_SERVER_VARS[
'QUERY_STRING'])) {
3706 $qs = $HTTP_SERVER_VARS[
'QUERY_STRING'];
3710 $this->
debug(
"In service, query string=$qs");
3712 if (preg_match(
'/wsdl/', $qs)) {
3713 $this->
debug(
"In service, this is a request for WSDL");
3714 if ($this->externalWSDLURL) {
3715 if (strpos($this->externalWSDLURL,
"://") !==
false) {
3716 header(
'Location: ' . $this->externalWSDLURL);
3718 header(
"Content-Type: text/xml\r\n");
3719 $fp = fopen($this->externalWSDLURL,
'r');
3722 } elseif ($this->
wsdl) {
3723 header(
"Content-Type: text/xml; charset=ISO-8859-1\r\n");
3725 if ($this->debug_flag) {
3726 $this->
debug(
'wsdl:');
3731 header(
"Content-Type: text/html; charset=ISO-8859-1\r\n");
3732 print
"This service does not provide WSDL";
3735 $this->
debug(
"In service, there is no data, so return Web description");
3738 $this->
debug(
"In service, invoke the request");
3740 if (! $this->
fault) {
3743 if (! $this->
fault) {
3764 global $HTTP_SERVER_VARS;
3766 $this->request =
'';
3767 $this->SOAPAction =
'';
3768 if (function_exists(
'getallheaders')) {
3769 $this->
debug(
"In parse_http_headers, use getallheaders");
3772 $k = strtolower($k);
3773 $this->headers[$k] = $v;
3774 $this->request .=
"$k: $v\r\n";
3775 $this->
debug(
"$k: $v");
3778 if (isset($this->headers[
'soapaction'])) {
3779 $this->SOAPAction = str_replace(
'"',
'', $this->headers[
'soapaction']);
3782 if (isset($this->headers[
'content-type']) && strpos($this->headers[
'content-type'],
'=')) {
3783 $enc = str_replace(
'"',
'', substr(strstr($this->headers[
"content-type"],
'='), 1));
3784 if (preg_match(
'/^(ISO-8859-1|US-ASCII|UTF-8)$/i', $enc)) {
3785 $this->xml_encoding = strtoupper($enc);
3787 $this->xml_encoding =
'US-ASCII';
3791 $this->xml_encoding =
'ISO-8859-1';
3794 $this->
debug(
"In parse_http_headers, use _SERVER");
3796 if (substr($k, 0, 5) ==
'HTTP_') {
3797 $k = str_replace(
' ',
'-', strtolower(str_replace(
'_',
' ', substr($k, 5))));
3799 $k = str_replace(
' ',
'-', strtolower(str_replace(
'_',
' ', $k)));
3801 if ($k ==
'soapaction') {
3804 $v = str_replace(
'"',
'', $v);
3805 $v = str_replace(
'\\',
'', $v);
3806 $this->SOAPAction = $v;
3807 } elseif ($k ==
'content-type') {
3809 if (strpos($v,
'=')) {
3810 $enc = substr(strstr($v,
'='), 1);
3811 $enc = str_replace(
'"',
'', $enc);
3812 $enc = str_replace(
'\\',
'', $enc);
3813 if (preg_match(
'/^(ISO-8859-1|US-ASCII|UTF-8)$/i', $enc)) {
3814 $this->xml_encoding = strtoupper($enc);
3816 $this->xml_encoding =
'US-ASCII';
3820 $this->xml_encoding =
'ISO-8859-1';
3823 $this->headers[$k] = $v;
3824 $this->request .=
"$k: $v\r\n";
3825 $this->
debug(
"$k: $v");
3827 } elseif (is_array($HTTP_SERVER_VARS)) {
3828 $this->
debug(
"In parse_http_headers, use HTTP_SERVER_VARS");
3829 foreach ($HTTP_SERVER_VARS as $k => $v) {
3830 if (substr($k, 0, 5) ==
'HTTP_') {
3831 $k = str_replace(
' ',
'-', strtolower(str_replace(
'_',
' ', substr($k, 5))));
3832 $k = strtolower(substr($k, 5));
3834 $k = str_replace(
' ',
'-', strtolower(str_replace(
'_',
' ', $k)));
3835 $k = strtolower($k);
3837 if ($k ==
'soapaction') {
3840 $v = str_replace(
'"',
'', $v);
3841 $v = str_replace(
'\\',
'', $v);
3842 $this->SOAPAction = $v;
3843 } elseif ($k ==
'content-type') {
3845 if (strpos($v,
'=')) {
3846 $enc = substr(strstr($v,
'='), 1);
3847 $enc = str_replace(
'"',
'', $enc);
3848 $enc = str_replace(
'\\',
'', $enc);
3849 if (preg_match(
'/^(ISO-8859-1|US-ASCII|UTF-8)$/i', $enc)) {
3850 $this->xml_encoding = strtoupper($enc);
3852 $this->xml_encoding =
'US-ASCII';
3856 $this->xml_encoding =
'ISO-8859-1';
3859 $this->headers[$k] = $v;
3860 $this->request .=
"$k: $v\r\n";
3861 $this->
debug(
"$k: $v");
3864 $this->
debug(
"In parse_http_headers, HTTP headers not accessible");
3865 $this->
setError(
"HTTP headers not accessible");
3893 $this->
debug(
'entering parse_request()');
3895 $this->
debug(
'got character encoding: ' . $this->xml_encoding);
3897 if (isset($this->headers[
'content-encoding']) && $this->headers[
'content-encoding'] !=
'') {
3898 $this->
debug(
'got content encoding: ' . $this->headers[
'content-encoding']);
3899 if ($this->headers[
'content-encoding'] ==
'deflate' || $this->headers[
'content-encoding'] ==
'gzip') {
3901 if (function_exists(
'gzuncompress')) {
3902 if ($this->headers[
'content-encoding'] ==
'deflate' && $degzdata = @gzuncompress(
$data)) {
3904 } elseif ($this->headers[
'content-encoding'] ==
'gzip' && $degzdata = gzinflate(substr(
$data, 10))) {
3907 $this->
fault(
'SOAP-ENV:Client',
'Errors occurred when trying to decode the data');
3911 $this->
fault(
'SOAP-ENV:Client',
'This Server does not support compressed data');
3916 $this->request .=
"\r\n" .
$data;
3918 $this->requestSOAP =
$data;
3919 $this->
debug(
'leaving parse_request');
3941 $this->
debug(
'in invoke_method, methodname=' . $this->methodname .
' methodURI=' . $this->methodURI .
' SOAPAction=' . $this->SOAPAction);
3945 $this->
debug(
'in invoke_method, found WSDL operation=' . $this->methodname);
3949 $this->
debug(
'in invoke_method, found WSDL soapAction=' . $this->SOAPAction .
' for operation=' . $this->opData[
'name']);
3951 $this->methodname = $this->opData[
'name'];
3953 $this->
debug(
'in invoke_method, no WSDL for operation=' . $this->methodname);
3954 $this->
fault(
'SOAP-ENV:Client',
"Operation '" . $this->methodname .
"' is not defined in the WSDL for this service");
3958 $this->
debug(
'in invoke_method, no WSDL to validate method');
3966 if (strpos($this->methodname,
'..') > 0) {
3968 } elseif (strpos($this->methodname,
'.') > 0) {
3974 if (strlen($delim) > 0 && substr_count($this->methodname, $delim) == 1 &&
3975 class_exists(substr($this->methodname, 0, strpos($this->methodname, $delim)))) {
3977 $class = substr($this->methodname, 0, strpos($this->methodname, $delim));
3978 $method = substr($this->methodname, strpos($this->methodname, $delim) + strlen($delim));
3979 $this->
debug(
"in invoke_method, class=$class method=$method delim=$delim");
3983 if (
$class ==
'' && $this->
class !=
'') {
3991 if (!function_exists($this->methodname)) {
3992 $this->
debug(
"in invoke_method, function '$this->methodname' not found!");
3993 $this->result =
'fault: method not found';
3994 $this->
fault(
'SOAP-ENV:Client',
"method '$this->methodname' not defined in service");
3998 $method_to_compare = (substr(phpversion(), 0, 2) ==
'4.') ? strtolower($method) : $method;
3999 if (!in_array($method_to_compare, get_class_methods(
$class))) {
4000 $this->
debug(
"in invoke_method, method '$this->methodname' not found in class '$class'!");
4001 $this->result =
'fault: method not found';
4002 $this->
fault(
'SOAP-ENV:Client',
"method '$this->methodname' not defined in service");
4009 if (! $this->
verify_method($this->methodname, $this->methodparams)) {
4011 $this->
debug(
'ERROR: request not verified against method signature');
4012 $this->result =
'fault: request failed validation against method signature';
4014 $this->
fault(
'SOAP-ENV:Client',
"Operation '$this->methodname' not defined in service.");
4019 $this->
debug(
'in invoke_method, params:');
4021 $this->
debug(
"in invoke_method, calling '$this->methodname'");
4022 if (!function_exists(
'call_user_func_array')) {
4024 $this->
debug(
'in invoke_method, calling function using eval()');
4025 $funcCall =
"\$this->methodreturn = $this->methodname(";
4027 if ($delim ==
'..') {
4028 $this->
debug(
'in invoke_method, calling class method using eval()');
4029 $funcCall =
"\$this->methodreturn = " .
$class .
"::" . $method .
"(";
4031 $this->
debug(
'in invoke_method, calling instance method using eval()');
4033 $instname =
"\$inst_" . time();
4034 $funcCall = $instname .
" = new " .
$class .
"(); ";
4035 $funcCall .=
"\$this->methodreturn = " . $instname .
"->" . $method .
"(";
4038 if ($this->methodparams) {
4039 foreach ($this->methodparams as
$param) {
4041 $this->
fault(
'SOAP-ENV:Client',
'NuSOAP does not handle complexType parameters correctly when using eval; call_user_func_array must be available');
4044 $funcCall .=
"\"$param\",";
4046 $funcCall = substr($funcCall, 0, -1);
4049 $this->
debug(
'in invoke_method, function call: ' . $funcCall);
4053 $this->
debug(
'in invoke_method, calling function using call_user_func_array()');
4054 $call_arg =
"$this->methodname";
4055 } elseif ($delim ==
'..') {
4056 $this->
debug(
'in invoke_method, calling class method using call_user_func_array()');
4057 $call_arg = array(
$class, $method);
4059 $this->
debug(
'in invoke_method, calling instance method using call_user_func_array()');
4060 $instance =
new $class();
4061 $call_arg = array(&$instance, $method);
4063 if (is_array($this->methodparams)) {
4064 $this->methodreturn = call_user_func_array($call_arg, array_values($this->methodparams));
4066 $this->methodreturn = call_user_func_array($call_arg, array());
4069 $this->
debug(
'in invoke_method, methodreturn:');
4071 $this->
debug(
"in invoke_method, called method $this->methodname, received data of type " . gettype($this->methodreturn));
4087 $this->
debug(
'Entering serialize_return methodname: ' . $this->methodname .
' methodURI: ' . $this->methodURI);
4089 if (isset($this->methodreturn) && ((get_class((
object) $this->methodreturn) ==
'soap_fault') || (get_class((
object) $this->methodreturn) ==
'nusoap_fault'))) {
4090 $this->
debug(
'got a fault object from method');
4093 } elseif ($this->methodreturnisliteralxml) {
4097 $this->
debug(
'got a(n) ' . gettype($this->methodreturn) .
' from method');
4098 $this->
debug(
'serializing return value');
4100 if (
sizeof($this->opData[
'output'][
'parts']) > 1) {
4101 $this->
debug(
'more than one output part, so use the method return unchanged');
4103 } elseif (
sizeof($this->opData[
'output'][
'parts']) == 1) {
4104 $this->
debug(
'exactly one output part, so wrap the method return in a simple array');
4109 $opParams = array($this->methodreturn);
4115 $this->
debug(
'got wsdl error: ' . $errstr);
4116 $this->
fault(
'SOAP-ENV:Server',
'unable to serialize result');
4120 if (isset($this->methodreturn)) {
4121 $return_val = $this->
serialize_val($this->methodreturn,
'return');
4124 $this->
debug(
'in absence of WSDL, assume void return for backward compatibility');
4128 $this->
debug(
'return value:');
4131 $this->
debug(
'serializing response');
4133 $this->
debug(
'have WSDL for serialization: style is ' . $this->opData[
'style']);
4134 if ($this->opData[
'style'] ==
'rpc') {
4135 $this->
debug(
'style is rpc for serialization: use is ' . $this->opData[
'output'][
'use']);
4136 if ($this->opData[
'output'][
'use'] ==
'literal') {
4138 $payload =
'<ns1:' . $this->methodname .
'Response xmlns:ns1="' . $this->methodURI .
'">' . $return_val .
'</ns1:' . $this->methodname .
"Response>";
4140 $payload =
'<ns1:' . $this->methodname .
'Response xmlns:ns1="' . $this->methodURI .
'">' . $return_val .
'</ns1:' . $this->methodname .
"Response>";
4143 $this->
debug(
'style is not rpc for serialization: assume document');
4147 $this->
debug(
'do not have WSDL for serialization: assume rpc/encoded');
4148 $payload =
'<ns1:' . $this->methodname .
'Response xmlns:ns1="' . $this->methodURI .
'">' . $return_val .
'</ns1:' . $this->methodname .
"Response>";
4150 $this->result =
'successful';
4155 if (isset(
$opData[
'output'][
'encodingStyle'])) {
4156 $encodingStyle =
$opData[
'output'][
'encodingStyle'];
4158 $encodingStyle =
'';
4161 $this->responseSOAP = $this->
serializeEnvelope(
$payload, $this->responseHeaders, $this->
wsdl->usedNamespaces, $this->opData[
'style'], $this->opData[
'output'][
'use'], $encodingStyle);
4165 $this->
debug(
"Leaving serialize_return");
4180 $this->
debug(
'Enter send_response');
4183 $this->outgoing_headers[] =
"HTTP/1.0 500 Internal Server Error";
4184 $this->outgoing_headers[] =
"Status: 500 Internal Server Error";
4194 if (isset($this->debug_flag) && $this->debug_flag) {
4197 $this->outgoing_headers[] =
"Server: $this->title Server v$this->version";
4198 preg_match(
'/\$Revisio' .
'n: ([^ ]+)/', $this->revision, $rev);
4199 $this->outgoing_headers[] =
"X-SOAP-Server: $this->title/$this->version (" . $rev[1] .
")";
4205 $this->outgoing_headers[] =
"Content-Type: $type" . ($charset ?
'; charset=' . $charset :
'');
4209 if (strlen(
$payload) > 1024 && isset($this->headers) && isset($this->headers[
'accept-encoding'])) {
4210 if (strstr($this->headers[
'accept-encoding'],
'gzip')) {
4211 if (function_exists(
'gzencode')) {
4213 $payload .=
"<!-- Content being gzipped -->";
4215 $this->outgoing_headers[] =
"Content-Encoding: gzip";
4218 if (isset($this->debug_flag) && $this->debug_flag) {
4219 $payload .=
"<!-- Content will not be gzipped: no gzencode -->";
4222 } elseif (strstr($this->headers[
'accept-encoding'],
'deflate')) {
4226 if (function_exists(
'gzdeflate')) {
4227 if (isset($this->debug_flag) && $this->debug_flag) {
4228 $payload .=
"<!-- Content being deflated -->";
4230 $this->outgoing_headers[] =
"Content-Encoding: deflate";
4233 if (isset($this->debug_flag) && $this->debug_flag) {
4234 $payload .=
"<!-- Content will not be deflated: no gzcompress -->";
4240 $this->outgoing_headers[] =
"Content-Length: " . strlen(
$payload);
4241 reset($this->outgoing_headers);
4242 foreach ($this->outgoing_headers as $hdr) {
4246 $this->response = join(
"\r\n", $this->outgoing_headers) .
"\r\n\r\n" .
$payload;
4260 if (isset($this->
wsdl) && is_object($this->
wsdl)) {
4264 } elseif (isset($this->operations[$operation])) {
4280 $this->
debug(
'Entering parseRequest() for data of length ' . strlen(
$data) .
' and type ' .
$headers[
'content-type']);
4281 if (!strstr(
$headers[
'content-type'],
'text/xml')) {
4282 $this->
setError(
'Request not of type text/xml');
4285 if (strpos(
$headers[
'content-type'],
'=')) {
4286 $enc = str_replace(
'"',
'', substr(strstr(
$headers[
"content-type"],
'='), 1));
4287 $this->
debug(
'Got response encoding: ' . $enc);
4288 if (preg_match(
'/^(ISO-8859-1|US-ASCII|UTF-8)$/i', $enc)) {
4289 $this->xml_encoding = strtoupper($enc);
4291 $this->xml_encoding =
'US-ASCII';
4295 $this->xml_encoding =
'ISO-8859-1';
4297 $this->
debug(
'Use encoding: ' . $this->xml_encoding .
' when creating nusoap_parser');
4301 $this->
debug(
"parser debug: \n" . $parser->getDebug());
4303 if ($err = $parser->getError()) {
4304 $this->result =
'fault: error in msg parsing: ' . $err;
4305 $this->
fault(
'SOAP-ENV:Client',
"error in msg parsing:\n" . $err);
4309 $this->methodURI = $parser->root_struct_namespace;
4310 $this->methodname = $parser->root_struct_name;
4311 $this->
debug(
'methodname: ' . $this->methodname .
' methodURI: ' . $this->methodURI);
4312 $this->
debug(
'calling parser->get_soapbody()');
4313 $this->methodparams = $parser->get_soapbody();
4315 $this->requestHeaders = $parser->getHeaders();
4317 $this->requestHeader = $parser->get_soapheader();
4319 $this->document = $parser->document;
4390 public function register($name, $in = array(),
$out = array(),
$namespace =
false, $soapaction =
false, $style =
false, $use =
false, $documentation =
'', $encodingStyle =
'')
4392 global $HTTP_SERVER_VARS;
4394 if ($this->externalWSDLURL) {
4395 die(
'You cannot bind to an external WSDL file, and register methods outside of it! Please choose either WSDL or no WSDL.');
4398 die(
'You must specify a name when you register an operation');
4400 if (!is_array($in)) {
4401 die(
'You must provide an array for operation inputs');
4403 if (!is_array(
$out)) {
4404 die(
'You must provide an array for operation outputs');
4408 if (
false == $soapaction) {
4410 $SERVER_NAME =
$_SERVER[
'SERVER_NAME'];
4412 $HTTPS = isset(
$_SERVER[
'HTTPS']) ?
$_SERVER[
'HTTPS'] : (isset($HTTP_SERVER_VARS[
'HTTPS']) ? $HTTP_SERVER_VARS[
'HTTPS'] :
'off');
4413 } elseif (isset($HTTP_SERVER_VARS)) {
4414 $SERVER_NAME = $HTTP_SERVER_VARS[
'SERVER_NAME'];
4415 $SCRIPT_NAME = isset($HTTP_SERVER_VARS[
'PHP_SELF']) ? $HTTP_SERVER_VARS[
'PHP_SELF'] : $HTTP_SERVER_VARS[
'SCRIPT_NAME'];
4416 $HTTPS = isset($HTTP_SERVER_VARS[
'HTTPS']) ? $HTTP_SERVER_VARS[
'HTTPS'] :
'off';
4418 $this->
setError(
"Neither _SERVER nor HTTP_SERVER_VARS is available");
4420 if ($HTTPS ==
'1' || $HTTPS ==
'on') {
4425 $soapaction =
"$SCHEME://$SERVER_NAME$SCRIPT_NAME/$name";
4427 if (
false == $style) {
4430 if (
false == $use) {
4433 if ($use ==
'encoded' && $encodingStyle =
'') {
4434 $encodingStyle =
'http://schemas.xmlsoap.org/soap/encoding/';
4437 $this->operations[$name] = array(
4442 'soapaction' => $soapaction,
4460 public function fault($faultcode, $faultstring, $faultactor =
'', $faultdetail =
'')
4462 if ($faultdetail ==
'' && $this->debug_flag) {
4465 $this->
fault =
new nusoap_fault($faultcode, $faultactor, $faultstring, $faultdetail);
4482 global $HTTP_SERVER_VARS;
4485 $SERVER_NAME =
$_SERVER[
'SERVER_NAME'];
4486 $SERVER_PORT =
$_SERVER[
'SERVER_PORT'];
4488 $HTTPS = isset(
$_SERVER[
'HTTPS']) ?
$_SERVER[
'HTTPS'] : (isset($HTTP_SERVER_VARS[
'HTTPS']) ? $HTTP_SERVER_VARS[
'HTTPS'] :
'off');
4489 } elseif (isset($HTTP_SERVER_VARS)) {
4490 $SERVER_NAME = $HTTP_SERVER_VARS[
'SERVER_NAME'];
4491 $SERVER_PORT = $HTTP_SERVER_VARS[
'SERVER_PORT'];
4492 $SCRIPT_NAME = isset($HTTP_SERVER_VARS[
'PHP_SELF']) ? $HTTP_SERVER_VARS[
'PHP_SELF'] : $HTTP_SERVER_VARS[
'SCRIPT_NAME'];
4493 $HTTPS = isset($HTTP_SERVER_VARS[
'HTTPS']) ? $HTTP_SERVER_VARS[
'HTTPS'] :
'off';
4495 $this->
setError(
"Neither _SERVER nor HTTP_SERVER_VARS is available");
4498 $colon = strpos($SERVER_NAME,
":");
4500 $SERVER_NAME = substr($SERVER_NAME, 0, $colon);
4502 if ($SERVER_PORT == 80) {
4505 $SERVER_PORT =
':' . $SERVER_PORT;
4508 $namespace =
"http://$SERVER_NAME/soap/$serviceName";
4511 if (
false == $endpoint) {
4512 if ($HTTPS ==
'1' || $HTTPS ==
'on') {
4517 $endpoint =
"$SCHEME://$SERVER_NAME$SERVER_PORT$SCRIPT_NAME";
4520 if (
false == $schemaTargetNamespace) {
4526 $this->
wsdl->endpoint = $endpoint;
4528 $this->
wsdl->namespaces[
'soap'] =
'http://schemas.xmlsoap.org/wsdl/soap/';
4529 $this->
wsdl->namespaces[
'wsdl'] =
'http://schemas.xmlsoap.org/wsdl/';
4531 $this->
wsdl->namespaces[
'types'] = $schemaTargetNamespace;
4534 if ($style ==
'document') {
4535 $this->
wsdl->schemas[$schemaTargetNamespace][0]->schemaInfo[
'elementFormDefault'] =
'qualified';
4537 $this->
wsdl->schemas[$schemaTargetNamespace][0]->schemaTargetNamespace = $schemaTargetNamespace;
4538 $this->
wsdl->schemas[$schemaTargetNamespace][0]->imports[
'http://schemas.xmlsoap.org/soap/encoding/'][0] = array(
'location' =>
'',
'loaded' =>
true);
4539 $this->
wsdl->schemas[$schemaTargetNamespace][0]->imports[
'http://schemas.xmlsoap.org/wsdl/'][0] = array(
'location' =>
'',
'loaded' =>
true);
4543 'transport' => $transport,
4547 'location' => $endpoint,
4548 'bindingType' =>
'http://schemas.xmlsoap.org/wsdl/soap/');
4555 'location' => (string) (
new \
ILIAS\Data\URI(
$url))->withQuery(),
4556 'bindingType' =>
'http://schemas.xmlsoap.org/wsdl/soap/'
4645 $this->
debug(
"ctor wsdl=$wsdl timeout=$timeout response_timeout=$response_timeout");
4666 $this->
debug(
"parse and process WSDL path=$wsdl");
4669 if ($this->
wsdl !=
"") {
4674 $imported_urls = array();
4676 while ($imported > 0) {
4679 foreach ($this->schemas as $ns => $list) {
4680 foreach ($list as $xs) {
4681 $wsdlparts = parse_url($this->
wsdl);
4682 foreach ($xs->imports as $ns2 => $list2) {
4683 for ($ii = 0; $ii < count($list2); $ii++) {
4684 if (! $list2[$ii][
'loaded']) {
4685 $this->schemas[$ns]->imports[$ns2][$ii][
'loaded'] =
true;
4686 $url = $list2[$ii][
'location'];
4688 $urlparts = parse_url(
$url);
4689 if (!isset($urlparts[
'host'])) {
4690 $url = $wsdlparts[
'scheme'] .
'://' . $wsdlparts[
'host'] . (isset($wsdlparts[
'port']) ?
':' . $wsdlparts[
'port'] :
'') .
4691 substr($wsdlparts[
'path'], 0, strrpos($wsdlparts[
'path'],
'/') + 1) . $urlparts[
'path'];
4693 if (! in_array(
$url, $imported_urls)) {
4696 $imported_urls[] =
$url;
4699 $this->
debug(
"Unexpected scenario: empty URL for unloaded import");
4707 $wsdlparts = parse_url($this->
wsdl);
4708 foreach ($this->
import as $ns => $list) {
4709 for ($ii = 0; $ii < count($list); $ii++) {
4710 if (! $list[$ii][
'loaded']) {
4711 $this->
import[$ns][$ii][
'loaded'] =
true;
4712 $url = $list[$ii][
'location'];
4714 $urlparts = parse_url(
$url);
4715 if (!isset($urlparts[
'host'])) {
4716 $url = $wsdlparts[
'scheme'] .
'://' . $wsdlparts[
'host'] . (isset($wsdlparts[
'port']) ?
':' . $wsdlparts[
'port'] :
'') .
4717 substr($wsdlparts[
'path'], 0, strrpos($wsdlparts[
'path'],
'/') + 1) . $urlparts[
'path'];
4719 if (! in_array(
$url, $imported_urls)) {
4722 $imported_urls[] =
$url;
4725 $this->
debug(
"Unexpected scenario: empty URL for unloaded import");
4732 foreach ($this->bindings as $binding => $bindingData) {
4733 if (isset($bindingData[
'operations']) && is_array($bindingData[
'operations'])) {
4734 foreach ($bindingData[
'operations'] as $operation =>
$data) {
4735 $this->
debug(
'post-parse data gathering for ' . $operation);
4736 $this->bindings[$binding][
'operations'][$operation][
'input'] =
4737 isset($this->bindings[$binding][
'operations'][$operation][
'input']) ?
4738 array_merge($this->bindings[$binding][
'operations'][$operation][
'input'], $this->portTypes[ $bindingData[
'portType'] ][$operation][
'input']) :
4739 $this->portTypes[ $bindingData[
'portType'] ][$operation][
'input'];
4740 $this->bindings[$binding][
'operations'][$operation][
'output'] =
4741 isset($this->bindings[$binding][
'operations'][$operation][
'output']) ?
4742 array_merge($this->bindings[$binding][
'operations'][$operation][
'output'], $this->portTypes[ $bindingData[
'portType'] ][$operation][
'output']) :
4743 $this->portTypes[ $bindingData[
'portType'] ][$operation][
'output'];
4744 if (isset($this->messages[ $this->bindings[$binding][
'operations'][$operation][
'input'][
'message'] ])) {
4745 $this->bindings[$binding][
'operations'][$operation][
'input'][
'parts'] = $this->messages[ $this->bindings[$binding][
'operations'][$operation][
'input'][
'message'] ];
4747 if (isset($this->messages[ $this->bindings[$binding][
'operations'][$operation][
'output'][
'message'] ])) {
4748 $this->bindings[$binding][
'operations'][$operation][
'output'][
'parts'] = $this->messages[ $this->bindings[$binding][
'operations'][$operation][
'output'][
'message'] ];
4751 if (isset($bindingData[
'style']) && !isset($this->bindings[$binding][
'operations'][$operation][
'style'])) {
4752 $this->bindings[$binding][
'operations'][$operation][
'style'] = $bindingData[
'style'];
4754 $this->bindings[$binding][
'operations'][$operation][
'transport'] = isset($bindingData[
'transport']) ? $bindingData[
'transport'] :
'';
4755 $this->bindings[$binding][
'operations'][$operation][
'documentation'] = isset($this->portTypes[ $bindingData[
'portType'] ][$operation][
'documentation']) ? $this->portTypes[ $bindingData[
'portType'] ][$operation][
'documentation'] :
'';
4756 $this->bindings[$binding][
'operations'][$operation][
'endpoint'] = isset($bindingData[
'endpoint']) ? $bindingData[
'endpoint'] :
'';
4770 $this->
debug(
"parse WSDL at path=$wsdl");
4773 $this->
debug(
'no wsdl passed to parseWSDL()!!');
4774 $this->
setError(
'no wsdl passed to parseWSDL()!!');
4779 $wsdl_props = parse_url(
$wsdl);
4781 if (isset($wsdl_props[
'scheme']) && ($wsdl_props[
'scheme'] ==
'http' || $wsdl_props[
'scheme'] ==
'https')) {
4782 $this->
debug(
'getting WSDL http(s) URL ' .
$wsdl);
4785 $tr->request_method =
'GET';
4786 $tr->useSOAPAction =
false;
4787 if ($this->proxyhost && $this->proxyport) {
4788 $tr->setProxy($this->proxyhost, $this->proxyport, $this->proxyusername, $this->proxypassword);
4790 if ($this->authtype !=
'') {
4791 $tr->setCredentials($this->username, $this->password, $this->authtype, array(), $this->certRequest);
4793 $tr->setEncoding(
'gzip, deflate');
4794 $wsdl_string = $tr->send(
'', $this->timeout, $this->response_timeout);
4799 if ($err = $tr->getError()) {
4800 $errstr =
'HTTP ERROR: ' . $err;
4801 $this->
debug($errstr);
4807 $this->
debug(
"got WSDL URL");
4810 if (isset($wsdl_props[
'scheme']) && ($wsdl_props[
'scheme'] ==
'file') && isset($wsdl_props[
'path'])) {
4811 $path = isset($wsdl_props[
'host']) ? ($wsdl_props[
'host'] .
':' . $wsdl_props[
'path']) : $wsdl_props[
'path'];
4816 if ($fp = @fopen(
$path,
'r')) {
4818 while (
$data = fread($fp, 32768)) {
4819 $wsdl_string .=
$data;
4823 $errstr =
"Bad path to WSDL file $path";
4824 $this->
debug($errstr);
4829 $this->
debug(
'Parse WSDL');
4832 $this->parser = xml_parser_create();
4835 xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, 0);
4839 xml_set_character_data_handler($this->parser, $this->
character_data(...));
4841 if (!xml_parse($this->parser, $wsdl_string,
true)) {
4844 'XML error parsing WSDL from %s on line %d: %s',
4846 xml_get_current_line_number($this->parser),
4847 xml_error_string(xml_get_error_code($this->parser))
4849 $this->
debug($errstr);
4850 $this->
debug(
"XML payload:\n" . $wsdl_string);
4854 $this->
debug(
'Parsing WSDL done');
4872 if ($this->status ==
'schema') {
4873 $this->currentSchema->schemaStartElement(
$parser, $name, $attrs);
4874 $this->
appendDebug($this->currentSchema->getDebug());
4875 $this->currentSchema->clearDebug();
4876 } elseif (preg_match(
'/schema$/', $name)) {
4877 $this->
debug(
'Parsing WSDL schema');
4879 $this->status =
'schema';
4881 $this->currentSchema->schemaStartElement(
$parser, $name, $attrs);
4882 $this->
appendDebug($this->currentSchema->getDebug());
4883 $this->currentSchema->clearDebug();
4886 $pos = $this->position++;
4889 $this->depth_array[
$depth] = $pos;
4890 $this->message[$pos] = array(
'cdata' =>
'');
4892 if (count($attrs) > 0) {
4894 foreach ($attrs as $k => $v) {
4895 if (preg_match(
'/^xmlns/', $k)) {
4896 if ($ns_prefix = substr(strrchr($k,
':'), 1)) {
4897 $this->namespaces[$ns_prefix] = $v;
4899 $this->namespaces[
'ns' . (count($this->namespaces) + 1)] = $v;
4901 if ($v ==
'http://www.w3.org/2001/XMLSchema' || $v ==
'http://www.w3.org/1999/XMLSchema' || $v ==
'http://www.w3.org/2000/10/XMLSchema') {
4902 $this->XMLSchemaVersion = $v;
4903 $this->namespaces[
'xsi'] = $v .
'-instance';
4908 foreach ($attrs as $k => $v) {
4909 $k = strpos($k,
':') ? $this->
expandQname($k) : $k;
4910 if ($k !=
'location' && $k !=
'soapAction' && $k !=
'namespace') {
4911 $v = strpos($v,
':') ? $this->
expandQname($v) : $v;
4920 if (preg_match(
'/:/', $name)) {
4922 $prefix = substr($name, 0, strpos($name,
':'));
4924 $namespace = isset($this->namespaces[$prefix]) ? $this->namespaces[$prefix] :
'';
4926 $name = substr(strstr($name,
':'), 1);
4930 switch ($this->status) {
4932 if ($name ==
'part') {
4933 if (isset($attrs[
'type'])) {
4934 $this->
debug(
"msg " . $this->currentMessage .
": found part (with type) $attrs[name]: " . implode(
',', $attrs));
4937 if (isset($attrs[
'element'])) {
4938 $this->
debug(
"msg " . $this->currentMessage .
": found part (with element) $attrs[name]: " . implode(
',', $attrs));
4946 $this->currentPortOperation = $attrs[
'name'];
4947 $this->
debug(
"portType $this->currentPortType operation: $this->currentPortOperation");
4948 if (isset($attrs[
'parameterOrder'])) {
4952 case 'documentation':
4953 $this->documentation =
true;
4957 $m = isset($attrs[
'message']) ? $this->
getLocalPart($attrs[
'message']) :
'';
4966 if (isset($attrs[
'style'])) {
4969 $this->bindings[
$this->currentBinding] = array_merge($this->bindings[$this->currentBinding], $attrs);
4975 if (isset($attrs[
'soapAction'])) {
4978 if (isset($attrs[
'style'])) {
4981 if (isset($attrs[
'name'])) {
4982 $this->currentOperation = $attrs[
'name'];
4983 $this->
debug(
"current binding operation: $this->currentOperation");
4990 $this->opStatus =
'input';
4993 $this->opStatus =
'output';
4996 if (isset($this->bindings[$this->currentBinding][
'operations'][$this->currentOperation][$this->opStatus])) {
5007 $this->currentPort = $attrs[
'name'];
5008 $this->
debug(
'current port: ' . $this->currentPort);
5016 $this->bindings[ $this->ports[
$this->currentPort][
'binding'] ][
'endpoint'] = $attrs[
'location'];
5024 if (isset($attrs[
'location'])) {
5025 $this->
import[$attrs[
'namespace']][] = array(
'location' => $attrs[
'location'],
'loaded' =>
false);
5026 $this->
debug(
'parsing import ' . $attrs[
'namespace'] .
' - ' . $attrs[
'location'] .
' (' . count($this->
import[$attrs[
'namespace']]) .
')');
5028 $this->
import[$attrs[
'namespace']][] = array(
'location' =>
'',
'loaded' =>
true);
5030 $this->namespaces[
'ns' . (count($this->namespaces) + 1)] = $attrs[
'namespace'];
5032 $this->
debug(
'parsing import ' . $attrs[
'namespace'] .
' - [no location] (' . count($this->
import[$attrs[
'namespace']]) .
')');
5040 $this->status =
'message';
5041 $this->messages[$attrs[
'name']] = array();
5042 $this->currentMessage = $attrs[
'name'];
5045 $this->status =
'portType';
5046 $this->portTypes[$attrs[
'name']] = array();
5047 $this->currentPortType = $attrs[
'name'];
5050 if (isset($attrs[
'name'])) {
5052 if (strpos($attrs[
'name'],
':')) {
5053 $this->currentBinding = $this->
getLocalPart($attrs[
'name']);
5055 $this->currentBinding = $attrs[
'name'];
5057 $this->status =
'binding';
5059 $this->
debug(
"current binding: $this->currentBinding of portType: " . $attrs[
'type']);
5063 $this->serviceName = $attrs[
'name'];
5064 $this->status =
'service';
5065 $this->
debug(
'current service: ' . $this->serviceName);
5068 foreach ($attrs as $name => $value) {
5069 $this->wsdl_info[$name] = $value;
5086 if ( preg_match(
'/schema$/', $name)) {
5088 $this->
appendDebug($this->currentSchema->getDebug());
5089 $this->currentSchema->clearDebug();
5091 $this->
debug(
'Parsing WSDL schema done');
5093 if ($this->status ==
'schema') {
5094 $this->currentSchema->schemaEndElement(
$parser, $name);
5100 if ($this->documentation) {
5103 $this->documentation =
false;
5116 $pos = isset($this->depth_array[$this->depth]) ? $this->depth_array[
$this->depth] : 0;
5117 if (isset($this->message[$pos][
'cdata'])) {
5118 $this->message[$pos][
'cdata'] .=
$data;
5120 if ($this->documentation) {
5121 $this->documentation .=
$data;
5136 $this->
debug(
"setCredentials username=$username authtype=$authtype certRequest=");
5146 if (is_array($this->bindings[$binding])) {
5147 return $this->bindings[$binding];
5161 if ($bindingType ==
'soap') {
5162 $bindingType =
'http://schemas.xmlsoap.org/wsdl/soap/';
5163 } elseif ($bindingType ==
'soap12') {
5164 $bindingType =
'http://schemas.xmlsoap.org/wsdl/soap12/';
5167 foreach ($this->ports as $port => $portData) {
5169 if ($portData[
'bindingType'] == $bindingType) {
5174 if (isset($this->bindings[ $portData[
'binding'] ][
'operations'])) {
5175 $ops = array_merge($ops, $this->bindings[ $portData[
'binding'] ][
'operations']);
5192 if ($bindingType ==
'soap') {
5193 $bindingType =
'http://schemas.xmlsoap.org/wsdl/soap/';
5194 } elseif ($bindingType ==
'soap12') {
5195 $bindingType =
'http://schemas.xmlsoap.org/wsdl/soap12/';
5198 foreach ($this->ports as $port => $portData) {
5200 if ($portData[
'bindingType'] == $bindingType) {
5203 foreach (array_keys($this->bindings[ $portData[
'binding'] ][
'operations']) as $bOperation) {
5205 if ($operation == $bOperation) {
5206 $opData = $this->bindings[ $portData[
'binding'] ][
'operations'][$operation];
5224 if ($bindingType ==
'soap') {
5225 $bindingType =
'http://schemas.xmlsoap.org/wsdl/soap/';
5226 } elseif ($bindingType ==
'soap12') {
5227 $bindingType =
'http://schemas.xmlsoap.org/wsdl/soap12/';
5230 foreach ($this->ports as $port => $portData) {
5232 if ($portData[
'bindingType'] == $bindingType) {
5234 foreach ($this->bindings[ $portData[
'binding'] ][
'operations'] as $bOperation =>
$opData) {
5235 if (
$opData[
'soapAction'] == $soapAction) {
5263 $this->
debug(
"in getTypeDef: type=$type, ns=$ns");
5264 if ((! $ns) && isset($this->namespaces[
'tns'])) {
5265 $ns = $this->namespaces[
'tns'];
5266 $this->
debug(
"in getTypeDef: type namespace forced to $ns");
5268 if (!isset($this->schemas[$ns])) {
5269 foreach ($this->schemas as $ns0 => $schema0) {
5270 if (strcasecmp($ns, $ns0) == 0) {
5271 $this->
debug(
"in getTypeDef: replacing schema namespace $ns with $ns0");
5277 if (isset($this->schemas[$ns])) {
5278 $this->
debug(
"in getTypeDef: have schema for namespace $ns");
5279 for ($i = 0; $i < count($this->schemas[$ns]); $i++) {
5280 $xs = &$this->schemas[$ns][$i];
5281 $t = $xs->getTypeDef($type);
5285 if (!isset($t[
'phpType'])) {
5287 $uqType = substr($t[
'type'], strrpos($t[
'type'],
':') + 1);
5288 $ns = substr($t[
'type'], 0, strrpos($t[
'type'],
':'));
5291 $this->
debug(
"found type for [element] $type:");
5293 if (isset($etype[
'phpType'])) {
5294 $t[
'phpType'] = $etype[
'phpType'];
5296 if (isset($etype[
'elements'])) {
5297 $t[
'elements'] = $etype[
'elements'];
5299 if (isset($etype[
'attrs'])) {
5300 $t[
'attrs'] = $etype[
'attrs'];
5308 $this->
debug(
"in getTypeDef: do not have schema for namespace $ns");
5320 global $HTTP_SERVER_VARS;
5324 } elseif (isset($HTTP_SERVER_VARS)) {
5325 $PHP_SELF = $HTTP_SERVER_VARS[
'PHP_SELF'];
5327 $this->
setError(
"Neither _SERVER nor HTTP_SERVER_VARS is available");
5330 $PHP_SELF = htmlspecialchars($PHP_SELF, ENT_QUOTES | ENT_HTML5,
'UTF-8');
5334 <html><head><title>NuSOAP: ' . $this->serviceName .
'</title>
5335 <style type="text/css">
5336 body { font-family: arial; color: #000000; background-color: #ffffff; margin: 0px 0px 0px 0px; }
5337 p { font-family: arial; color: #000000; margin-top: 0px; margin-bottom: 12px; }
5338 pre { background-color: silver; padding: 5px; font-family: Courier New; font-size: x-small; color: #000000;}
5339 ul { margin-top: 10px; margin-left: 20px; }
5340 li { list-style-type: none; margin-top: 10px; color: #000000; }
5342 margin-left: 0px; padding-bottom: 2em; }
5344 padding-top: 10px; padding-bottom: 10px; padding-left: 15px; font-size: .70em;
5345 margin-top: 10px; margin-left: 0px; color: #000000;
5346 background-color: #ccccff; width: 20%; margin-left: 20px; margin-top: 20px; }
5348 font-family: arial; font-size: 26px; color: #ffffff;
5349 background-color: #999999; width: 105%; margin-left: 0px;
5350 padding-top: 10px; padding-bottom: 10px; padding-left: 15px;}
5352 position: absolute; visibility: hidden; z-index: 200; left: 250px; top: 100px;
5353 font-family: arial; overflow: hidden; width: 600;
5354 padding: 20px; font-size: 10px; background-color: #999999;
5355 layer-background-color:#FFFFFF; }
5356 a,a:active { color: charcoal; font-weight: bold; }
5357 a:visited { color: #666666; font-weight: bold; }
5358 a:hover { color: cc3300; font-weight: bold; }
5360 <script language="JavaScript" type="text/javascript">
5362 // POP-UP CAPTIONS...
5363 function lib_bwcheck(){ //Browsercheck (needed)
5364 this.ver=navigator.appVersion
5365 this.agent=navigator.userAgent
5366 this.dom=document.getElementById?1:0
5367 this.opera5=this.agent.indexOf("Opera 5")>-1
5368 this.ie5=(this.ver.indexOf("MSIE 5")>-1 && this.dom && !this.opera5)?1:0;
5369 this.ie6=(this.ver.indexOf("MSIE 6")>-1 && this.dom && !this.opera5)?1:0;
5370 this.ie4=(document.all && !this.dom && !this.opera5)?1:0;
5371 this.ie=this.ie4||this.ie5||this.ie6
5372 this.mac=this.agent.indexOf("Mac")>-1
5373 this.ns6=(this.dom && parseInt(this.ver) >= 5) ?1:0;
5374 this.ns4=(document.layers && !this.dom)?1:0;
5375 this.bw=(this.ie6 || this.ie5 || this.ie4 || this.ns4 || this.ns6 || this.opera5)
5378 var bw = new lib_bwcheck()
5379 //Makes crossbrowser object.
5380 function makeObj(obj){
5381 this.evnt=bw.dom? document.getElementById(obj):bw.ie4?document.all[obj]:bw.ns4?document.layers[obj]:0;
5382 if(!this.evnt) return false
5383 this.css=bw.dom||bw.ie4?this.evnt.style:bw.ns4?this.evnt:0;
5384 this.wref=bw.dom||bw.ie4?this.evnt:bw.ns4?this.css.document:0;
5385 this.writeIt=b_writeIt;
5388 // A unit of measure that will be added when setting the position of a layer.
5389 //var px = bw.ns4||window.opera?"":"px";
5390 function b_writeIt(text){
5391 if (bw.ns4){this.wref.write(text);this.wref.close()}
5392 else this.wref.innerHTML = text
5394 //Shows the messages
5396 function popup(divid){
5397 if(oDesc = new makeObj(divid)){
5398 oDesc.css.visibility = "visible"
5401 function popout(){ // Hides message
5402 if(oDesc) oDesc.css.visibility = "hidden"
5410 <div class=title>' . $this->serviceName .
'</div>
5412 <p>View the <a href="' . $PHP_SELF .
'?wsdl">WSDL</a> for the service.
5413 Click on an operation name to view it's details.</p>
5417 if (isset(
$data[
'endpoint'])) {
5418 $data[
'endpoint'] = htmlspecialchars(
$data[
'endpoint'], ENT_QUOTES | ENT_HTML5,
'UTF-8');
5421 $b .=
"<li><a href='#' onclick=\"popout();popup('$op')\">$op</a></li>";
5423 $b .=
"<div id='$op' class='hidden'>
5424 <a href='#' onclick='popout()'><font color='#ffffff'>Close</font></a><br><br>";
5425 foreach (
$data as $donnie => $marie) {
5426 if ($donnie ==
'input' || $donnie ==
'output') {
5427 $b .=
"<font color='white'>" . ucfirst($donnie) .
':</font><br>';
5428 foreach ($marie as $captain => $tenille) {
5429 if ($captain ==
'parts') {
5430 $b .=
" $captain:<br>";
5432 foreach ($tenille as $joanie => $chachi) {
5433 $b .=
" $joanie: $chachi<br>";
5437 $b .=
" $captain: $tenille<br>";
5441 $b .=
"<font color='white'>" . ucfirst($donnie) .
":</font> $marie<br>";
5449 </div></body></html>';
5462 $xml =
'<?xml version="1.0" encoding="ISO-8859-1"?>';
5463 $xml .=
"\n<definitions";
5464 foreach ($this->namespaces as $k => $v) {
5465 $xml .=
" xmlns:$k=\"$v\"";
5468 if (isset($this->namespaces[
'wsdl'])) {
5469 $xml .=
" xmlns=\"" . $this->namespaces[
'wsdl'] .
"\"";
5471 if (isset($this->namespaces[
'tns'])) {
5472 $xml .=
" targetNamespace=\"" . $this->namespaces[
'tns'] .
"\"";
5476 if (
sizeof($this->
import) > 0) {
5477 foreach ($this->
import as $ns => $list) {
5478 foreach ($list as $ii) {
5479 if ($ii[
'location'] !=
'') {
5480 $xml .=
'<import location="' . $ii[
'location'] .
'" namespace="' . $ns .
'" />';
5482 $xml .=
'<import namespace="' . $ns .
'" />';
5488 if (count($this->schemas) >= 1) {
5489 $xml .=
"\n<types>\n";
5490 foreach ($this->schemas as $ns => $list) {
5491 foreach ($list as $xs) {
5492 $xml .= $xs->serializeSchema();
5498 if (count($this->messages) >= 1) {
5499 foreach ($this->messages as $msgName => $msgParts) {
5500 $xml .=
"\n<message name=\"" . $msgName .
'">';
5501 if (is_array($msgParts)) {
5502 foreach ($msgParts as $partName => $partType) {
5504 if (strpos($partType,
':')) {
5506 } elseif (isset($this->typemap[$this->namespaces[
'xsd']][$partType])) {
5508 $typePrefix =
'xsd';
5510 foreach ($this->typemap as $ns => $types) {
5511 if (isset($types[$partType])) {
5515 if (!isset($typePrefix)) {
5516 die(
"$partType has no namespace!");
5521 $typeDef = $this->
getTypeDef($localPart, $ns);
5522 if (($typeDef[
'typeClass'] ??
'') ==
'element') {
5523 $elementortype =
'element';
5524 if (substr($localPart, -1) ==
'^') {
5525 $localPart = substr($localPart, 0, -1);
5528 $elementortype =
'type';
5530 $xml .=
"\n" .
' <part name="' . $partName .
'" ' . $elementortype .
'="' . $typePrefix .
':' . $localPart .
'" />';
5533 $xml .=
'</message>';
5537 if (count($this->bindings) >= 1) {
5540 foreach ($this->bindings as $bindingName => $attrs) {
5541 $binding_xml .=
"\n<binding name=\"" . $bindingName .
'" type="tns:' . $attrs[
'portType'] .
'">';
5542 $binding_xml .=
"\n" .
' <soap:binding style="' . $attrs[
'style'] .
'" transport="' . $attrs[
'transport'] .
'"/>';
5543 $portType_xml .=
"\n<portType name=\"" . $attrs[
'portType'] .
'">';
5544 foreach ($attrs[
'operations'] as $opName => $opParts) {
5545 $binding_xml .=
"\n" .
' <operation name="' . $opName .
'">';
5546 $binding_xml .=
"\n" .
' <soap:operation soapAction="' . $opParts[
'soapAction'] .
'" style="' . $opParts[
'style'] .
'"/>';
5547 if (isset($opParts[
'input'][
'encodingStyle']) && $opParts[
'input'][
'encodingStyle'] !=
'') {
5548 $enc_style =
' encodingStyle="' . $opParts[
'input'][
'encodingStyle'] .
'"';
5552 $binding_xml .=
"\n" .
' <input><soap:body use="' . $opParts[
'input'][
'use'] .
'" namespace="' . $opParts[
'input'][
'namespace'] .
'"' . $enc_style .
'/></input>';
5553 if (isset($opParts[
'output'][
'encodingStyle']) && $opParts[
'output'][
'encodingStyle'] !=
'') {
5554 $enc_style =
' encodingStyle="' . $opParts[
'output'][
'encodingStyle'] .
'"';
5558 $binding_xml .=
"\n" .
' <output><soap:body use="' . $opParts[
'output'][
'use'] .
'" namespace="' . $opParts[
'output'][
'namespace'] .
'"' . $enc_style .
'/></output>';
5559 $binding_xml .=
"\n" .
' </operation>';
5560 $portType_xml .=
"\n" .
' <operation name="' . $opParts[
'name'] .
'"';
5561 if (isset($opParts[
'parameterOrder'])) {
5562 $portType_xml .=
' parameterOrder="' . $opParts[
'parameterOrder'] .
'"';
5564 $portType_xml .=
'>';
5565 if (isset($opParts[
'documentation']) && $opParts[
'documentation'] !=
'') {
5566 $portType_xml .=
"\n" .
' <documentation>' . htmlspecialchars($opParts[
'documentation']) .
'</documentation>';
5568 $portType_xml .=
"\n" .
' <input message="tns:' . $opParts[
'input'][
'message'] .
'"/>';
5569 $portType_xml .=
"\n" .
' <output message="tns:' . $opParts[
'output'][
'message'] .
'"/>';
5570 $portType_xml .=
"\n" .
' </operation>';
5572 $portType_xml .=
"\n" .
'</portType>';
5573 $binding_xml .=
"\n" .
'</binding>';
5575 $xml .= $portType_xml . $binding_xml;
5578 $xml .=
"\n<service name=\"" . $this->serviceName .
'">';
5579 $has_client = isset(
$_GET[
'client_id']);
5580 if (count($this->ports) >= 1) {
5581 foreach ($this->ports as $pName => $attrs) {
5582 $xml .=
"\n" .
' <port name="' . $pName .
'" binding="tns:' . $attrs[
'binding'] .
'">';
5583 $locations = $attrs[
'location'];
5584 $locations = is_array($locations) ? $locations : [$locations];
5586 $address =
$location . ($debug || $has_client ?
"?" :
"")
5587 . ($debug ?
'debug=1' :
'') . ($debug && $has_client ?
"&" :
"")
5588 . ($has_client ?
'client_id=' .
$_GET[
'client_id'] :
'');
5589 $xml .=
"\n" .
' <soap:address location="' . $address .
'"/>';
5591 $xml .=
"\n" .
' </port>';
5595 $xml .=
"\n" .
'</service>';
5596 return $xml .
"\n</definitions>";
5610 $this->
debug(
"in parametersMatchWrapped type=$type, parameters=");
5614 if (strpos($type,
':')) {
5615 $uqType = substr($type, strrpos($type,
':') + 1);
5616 $ns = substr($type, 0, strrpos($type,
':'));
5617 $this->
debug(
"in parametersMatchWrapped: got a prefixed type: $uqType, $ns");
5620 $this->
debug(
"in parametersMatchWrapped: expanded prefixed type: $uqType, $ns");
5625 $this->
debug(
"in parametersMatchWrapped: No namespace for type $type");
5631 if (!$typeDef = $this->
getTypeDef($uqType, $ns)) {
5632 $this->
debug(
"in parametersMatchWrapped: $type ($uqType) is not a supported type.");
5635 $this->
debug(
"in parametersMatchWrapped: found typeDef=");
5637 if (substr($uqType, -1) ==
'^') {
5638 $uqType = substr($uqType, 0, -1);
5640 $phpType = $typeDef[
'phpType'];
5641 $arrayType = (isset($typeDef[
'arrayType']) ? $typeDef[
'arrayType'] :
'');
5642 $this->
debug(
"in parametersMatchWrapped: uqType: $uqType, ns: $ns, phptype: $phpType, arrayType: $arrayType");
5645 if ($phpType !=
'struct') {
5646 $this->
debug(
"in parametersMatchWrapped: not a struct");
5651 if (isset($typeDef[
'elements']) && is_array($typeDef[
'elements'])) {
5655 if ($this->
isArraySimpleOrStruct($parameters) ==
'arraySimple' && count($parameters) == count($typeDef[
'elements'])) {
5656 $this->
debug(
"in parametersMatchWrapped: (wrapped return value kludge) correct number of elements in simple array, so change array and wrap");
5659 foreach ($typeDef[
'elements'] as $name => $attrs) {
5661 $this->
debug(
"in parametersMatchWrapped: change parameter $element to name $name");
5662 $parameters[$name] = $parameters[$elements];
5663 unset($parameters[$elements]);
5665 } elseif (isset($parameters[$name])) {
5666 $this->
debug(
"in parametersMatchWrapped: have parameter named $name");
5669 $this->
debug(
"in parametersMatchWrapped: do not have parameter named $name");
5674 $this->
debug(
"in parametersMatchWrapped: $matches parameter names match $elements wrapped parameter names");
5675 if ($matches == 0) {
5683 $this->
debug(
"in parametersMatchWrapped: no elements type $ns:$uqType");
5684 return count($parameters) == 0;
5704 $this->
debug(
"in serializeRPCParameters: operation=$operation, direction=$direction, XMLSchemaVersion=$this->XMLSchemaVersion, bindingType=$bindingType");
5707 if ($direction !=
'input' && $direction !=
'output') {
5708 $this->
debug(
'The value of the \$direction argument needs to be either "input" or "output"');
5709 $this->
setError(
'The value of the \$direction argument needs to be either "input" or "output"');
5713 $this->
debug(
'Unable to retrieve WSDL data for operation: ' . $operation .
' bindingType: ' . $bindingType);
5714 $this->
setError(
'Unable to retrieve WSDL data for operation: ' . $operation .
' bindingType: ' . $bindingType);
5717 $this->
debug(
'in serializeRPCParameters: opData:');
5721 $encodingStyle =
'http://schemas.xmlsoap.org/soap/encoding/';
5722 if (($direction ==
'input') && isset(
$opData[
'output'][
'encodingStyle']) && (
$opData[
'output'][
'encodingStyle'] != $encodingStyle)) {
5723 $encodingStyle =
$opData[
'output'][
'encodingStyle'];
5724 $enc_style = $encodingStyle;
5729 if (isset(
$opData[$direction][
'parts']) &&
sizeof(
$opData[$direction][
'parts']) > 0) {
5731 $part_count =
sizeof(
$parts);
5733 $use =
$opData[$direction][
'use'];
5734 $this->
debug(
"have $part_count part(s) to serialize using $style/$use");
5735 if (is_array($parameters)) {
5737 $parameter_count = count($parameters);
5738 $this->
debug(
"have $parameter_count parameter(s) provided as $parametersArrayType to serialize");
5740 if ($style ==
'document' && $use ==
'literal' && $part_count == 1 && isset(
$parts[
'parameters'])) {
5741 $this->
debug(
'check whether the caller has wrapped the parameters');
5742 if ((($parametersArrayType ==
'arrayStruct' || $parameter_count == 0) && !isset($parameters[
'parameters'])) || ($direction ==
'output' && $parametersArrayType ==
'arraySimple' && $parameter_count == 1)) {
5743 $this->
debug(
'check whether caller\'s parameters match the wrapped ones');
5745 $this->
debug(
'wrap the parameters for the caller');
5746 $parameters = array(
'parameters' => $parameters);
5747 $parameter_count = 1;
5751 foreach (
$parts as $name => $type) {
5752 $this->
debug(
"serializing part $name of type $type");
5754 if (isset(
$opData[$direction][
'encodingStyle']) && $encodingStyle !=
$opData[$direction][
'encodingStyle']) {
5755 $encodingStyle =
$opData[$direction][
'encodingStyle'];
5756 $enc_style = $encodingStyle;
5762 if ($parametersArrayType ==
'arraySimple') {
5763 $p = array_shift($parameters);
5764 $this->
debug(
'calling serializeType w/indexed param');
5765 $xml .= $this->
serializeType($name, $type, $p, $use, $enc_style);
5766 } elseif (isset($parameters[$name])) {
5767 $this->
debug(
'calling serializeType w/named param');
5768 $xml .= $this->
serializeType($name, $type, $parameters[$name], $use, $enc_style);
5771 $this->
debug(
'calling serializeType w/null param');
5772 $xml .= $this->
serializeType($name, $type,
null, $use, $enc_style);
5776 $this->
debug(
'no parameters passed.');
5779 $this->
debug(
"serializeRPCParameters returning: $xml");
5799 $this->
debug(
"in serializeParameters: operation=$operation, direction=$direction, XMLSchemaVersion=$this->XMLSchemaVersion");
5802 if ($direction !=
'input' && $direction !=
'output') {
5803 $this->
debug(
'The value of the \$direction argument needs to be either "input" or "output"');
5804 $this->
setError(
'The value of the \$direction argument needs to be either "input" or "output"');
5808 $this->
debug(
'Unable to retrieve WSDL data for operation: ' . $operation);
5809 $this->
setError(
'Unable to retrieve WSDL data for operation: ' . $operation);
5812 $this->
debug(
'opData:');
5816 $encodingStyle =
'http://schemas.xmlsoap.org/soap/encoding/';
5817 if (($direction ==
'input') && isset(
$opData[
'output'][
'encodingStyle']) && (
$opData[
'output'][
'encodingStyle'] != $encodingStyle)) {
5818 $encodingStyle =
$opData[
'output'][
'encodingStyle'];
5819 $enc_style = $encodingStyle;
5824 if (isset(
$opData[$direction][
'parts']) &&
sizeof(
$opData[$direction][
'parts']) > 0) {
5825 $use =
$opData[$direction][
'use'];
5826 $this->
debug(
"use=$use");
5827 $this->
debug(
'got ' . count(
$opData[$direction][
'parts']) .
' part(s)');
5828 if (is_array($parameters)) {
5830 $this->
debug(
'have ' . $parametersArrayType .
' parameters');
5831 foreach (
$opData[$direction][
'parts'] as $name => $type) {
5832 $this->
debug(
'serializing part "' . $name .
'" of type "' . $type .
'"');
5834 if (isset(
$opData[$direction][
'encodingStyle']) && $encodingStyle !=
$opData[$direction][
'encodingStyle']) {
5835 $encodingStyle =
$opData[$direction][
'encodingStyle'];
5836 $enc_style = $encodingStyle;
5842 if ($parametersArrayType ==
'arraySimple') {
5843 $p = array_shift($parameters);
5844 $this->
debug(
'calling serializeType w/indexed param');
5845 $xml .= $this->
serializeType($name, $type, $p, $use, $enc_style);
5846 } elseif (isset($parameters[$name])) {
5847 $this->
debug(
'calling serializeType w/named param');
5848 $xml .= $this->
serializeType($name, $type, $parameters[$name], $use, $enc_style);
5851 $this->
debug(
'calling serializeType w/null param');
5852 $xml .= $this->
serializeType($name, $type,
null, $use, $enc_style);
5856 $this->
debug(
'no parameters passed.');
5859 $this->
debug(
"serializeParameters returning: $xml");
5875 public function serializeType($name, $type, $value, $use =
'encoded', $encodingStyle =
false, $unqualified =
false)
5877 $this->
debug(
"in serializeType: name=$name, type=$type, use=$use, encodingStyle=$encodingStyle, unqualified=" . ($unqualified ?
"unqualified" :
"qualified"));
5879 if ($use ==
'encoded' && $encodingStyle) {
5880 $encodingStyle =
' SOAP-ENV:encodingStyle="' . $encodingStyle .
'"';
5884 if (is_object($value) && get_class($value) ==
'soapval') {
5885 if ($value->type_ns) {
5886 $type = $value->type_ns .
':' . $value->type;
5888 $this->
debug(
"in serializeType: soapval overrides type to $type");
5889 } elseif ($value->type) {
5890 $type = $value->type;
5892 $this->
debug(
"in serializeType: soapval overrides type to $type");
5895 $this->
debug(
"in serializeType: soapval does not override type");
5897 $attrs = $value->attributes;
5898 $value = $value->value;
5899 $this->
debug(
"in serializeType: soapval overrides value to $value");
5901 if (!is_array($value)) {
5902 $value[
'!'] = $value;
5904 foreach ($attrs as $n => $v) {
5905 $value[
'!' . $n] = $v;
5907 $this->
debug(
"in serializeType: soapval provides attributes");
5914 if (strpos($type,
':')) {
5915 $uqType = substr($type, strrpos($type,
':') + 1);
5916 $ns = substr($type, 0, strrpos($type,
':'));
5917 $this->
debug(
"in serializeType: got a prefixed type: $uqType, $ns");
5920 $this->
debug(
"in serializeType: expanded prefixed type: $uqType, $ns");
5923 if ($ns == $this->XMLSchemaVersion || $ns ==
'http://schemas.xmlsoap.org/soap/encoding/') {
5924 $this->
debug(
'in serializeType: type namespace indicates XML Schema or SOAP Encoding type');
5925 if ($unqualified && $use ==
'literal') {
5926 $elementNS =
" xmlns=\"\"";
5930 if (is_null($value)) {
5931 if ($use ==
'literal') {
5933 $xml =
"<$name$elementNS/>";
5936 $xml =
"<$name$elementNS xsi:nil=\"true\" xsi:type=\"" . $this->
getPrefixFromNamespace($ns) .
":$uqType\"/>";
5938 $this->
debug(
"in serializeType: returning: $xml");
5941 if ($uqType ==
'Array') {
5943 return $this->
serialize_val($value, $name,
false,
false,
false,
false, $use);
5945 if ($uqType ==
'boolean') {
5946 if ((is_string($value) && $value ==
'false') || (! $value)) {
5952 if ($uqType ==
'string' && gettype($value) ==
'string') {
5955 if (($uqType ==
'long' || $uqType ==
'unsignedLong') && gettype($value) ==
'double') {
5956 $value = sprintf(
"%.0lf", $value);
5962 if ($use ==
'literal') {
5964 $xml =
"<$name$elementNS xsi:type=\"" . $this->
getPrefixFromNamespace($ns) .
":$uqType\">$value</$name>";
5966 $xml =
"<$name$elementNS>$value</$name>";
5969 $xml =
"<$name$elementNS xsi:type=\"" . $this->
getPrefixFromNamespace($ns) .
":$uqType\"$encodingStyle>$value</$name>";
5971 $this->
debug(
"in serializeType: returning: $xml");
5974 $this->
debug(
'custom type extends XML Schema or SOAP Encoding namespace (yuck)');
5975 } elseif ($ns ==
'http://xml.apache.org/xml-soap') {
5976 $this->
debug(
'in serializeType: appears to be Apache SOAP type');
5977 if ($uqType ==
'Map') {
5980 $this->
debug(
'in serializeType: Add namespace for Apache SOAP type');
5981 $tt_prefix =
'ns' . rand(1000, 9999);
5982 $this->namespaces[$tt_prefix] =
'http://xml.apache.org/xml-soap';
5987 foreach ($value as $k => $v) {
5988 $this->
debug(
"serializing map element: key $k, value $v");
5989 $contents .=
'<item>';
5990 $contents .= $this->
serialize_val($k,
'key',
false,
false,
false,
false, $use);
5991 $contents .= $this->
serialize_val($v,
'value',
false,
false,
false,
false, $use);
5992 $contents .=
'</item>';
5994 if ($use ==
'literal') {
5996 $xml =
"<$name xsi:type=\"" . $tt_prefix .
":$uqType\">$contents</$name>";
5998 $xml =
"<$name>$contents</$name>";
6001 $xml =
"<$name xsi:type=\"" . $tt_prefix .
":$uqType\"$encodingStyle>$contents</$name>";
6003 $this->
debug(
"in serializeType: returning: $xml");
6006 $this->
debug(
'in serializeType: Apache SOAP type, but only support Map');
6011 $this->
debug(
"in serializeType: No namespace for type $type");
6015 if (!$typeDef = $this->
getTypeDef($uqType, $ns)) {
6016 $this->
setError(
"$type ($uqType) is not a supported type.");
6017 $this->
debug(
"in serializeType: $type ($uqType) is not a supported type.");
6020 $this->
debug(
"in serializeType: found typeDef");
6022 if (substr($uqType, -1) ==
'^') {
6023 $uqType = substr($uqType, 0, -1);
6026 $phpType = $typeDef[
'phpType'];
6027 $this->
debug(
"in serializeType: uqType: $uqType, ns: $ns, phptype: $phpType, arrayType: " . (isset($typeDef[
'arrayType']) ? $typeDef[
'arrayType'] :
''));
6029 if ($phpType ==
'struct') {
6030 if (isset($typeDef[
'typeClass']) && $typeDef[
'typeClass'] ==
'element') {
6031 $elementName = $uqType;
6032 if (isset($typeDef[
'form']) && ($typeDef[
'form'] ==
'qualified')) {
6033 $elementNS =
" xmlns=\"$ns\"";
6035 $elementNS =
" xmlns=\"\"";
6038 $elementName = $name;
6040 $elementNS =
" xmlns=\"\"";
6045 if (is_null($value)) {
6046 if ($use ==
'literal') {
6048 $xml =
"<$elementName$elementNS/>";
6050 $xml =
"<$elementName$elementNS xsi:nil=\"true\" xsi:type=\"" . $this->
getPrefixFromNamespace($ns) .
":$uqType\"/>";
6052 $this->
debug(
"in serializeType: returning: $xml");
6055 if (is_object($value)) {
6056 $value = get_object_vars($value);
6058 if (is_array($value)) {
6060 if ($use ==
'literal') {
6062 $xml =
"<$elementName$elementNS$elementAttrs xsi:type=\"" . $this->
getPrefixFromNamespace($ns) .
":$uqType\">";
6064 $xml =
"<$elementName$elementNS$elementAttrs>";
6067 $xml =
"<$elementName$elementNS$elementAttrs xsi:type=\"" . $this->
getPrefixFromNamespace($ns) .
":$uqType\"$encodingStyle>";
6071 $xml .=
"</$elementName>";
6073 $this->
debug(
"in serializeType: phpType is struct, but value is not an array");
6074 $this->
setError(
"phpType is struct, but value is not an array: see debug output for details");
6077 } elseif ($phpType ==
'array') {
6078 if (isset($typeDef[
'form']) && ($typeDef[
'form'] ==
'qualified')) {
6079 $elementNS =
" xmlns=\"$ns\"";
6082 $elementNS =
" xmlns=\"\"";
6087 if (is_null($value)) {
6088 if ($use ==
'literal') {
6090 $xml =
"<$name$elementNS/>";
6092 $xml =
"<$name$elementNS xsi:nil=\"true\" xsi:type=\"" .
6099 $this->
getLocalPart($typeDef[
'arrayType']) .
"[0]\"/>";
6101 $this->
debug(
"in serializeType: returning: $xml");
6104 if (isset($typeDef[
'multidimensional'])) {
6106 foreach ($value as $v) {
6107 $cols =
',' .
sizeof($v);
6108 $nv = array_merge($nv, $v);
6114 if (is_array($value) &&
sizeof($value) >= 1) {
6115 $rows =
sizeof($value);
6117 foreach ($value as $k => $v) {
6118 $this->
debug(
"serializing array element: $k, $v of type: $typeDef[arrayType]");
6120 if (!in_array($typeDef[
'arrayType'], $this->typemap[
'http://www.w3.org/2001/XMLSchema'])) {
6121 $contents .= $this->
serializeType(
'item', $typeDef[
'arrayType'], $v, $use);
6123 $contents .= $this->
serialize_val($v,
'item', $typeDef[
'arrayType'],
null, $this->XMLSchemaVersion,
false, $use);
6132 if ($use ==
'literal') {
6133 $xml =
"<$name$elementNS>"
6137 $xml =
"<$name$elementNS xsi:type=\"" . $this->
getPrefixFromNamespace(
'http://schemas.xmlsoap.org/soap/encoding/') .
':Array" ' .
6141 .
":" . $this->
getLocalPart($typeDef[
'arrayType']) .
"[$rows$cols]\">"
6145 } elseif ($phpType ==
'scalar') {
6146 if (isset($typeDef[
'form']) && ($typeDef[
'form'] ==
'qualified')) {
6147 $elementNS =
" xmlns=\"$ns\"";
6150 $elementNS =
" xmlns=\"\"";
6155 if ($use ==
'literal') {
6157 $xml =
"<$name$elementNS xsi:type=\"" . $this->
getPrefixFromNamespace($ns) .
":$uqType\">$value</$name>";
6159 $xml =
"<$name$elementNS>$value</$name>";
6162 $xml =
"<$name$elementNS xsi:type=\"" . $this->
getPrefixFromNamespace($ns) .
":$uqType\"$encodingStyle>$value</$name>";
6165 $this->
debug(
"in serializeType: returning: $xml");
6182 if (isset($typeDef[
'attrs']) && is_array($typeDef[
'attrs'])) {
6183 $this->
debug(
"serialize attributes for XML Schema type $ns:$uqType");
6184 if (is_array($value)) {
6186 } elseif (is_object($value)) {
6187 $xvalue = get_object_vars($value);
6189 $this->
debug(
"value is neither an array nor an object for XML Schema type $ns:$uqType");
6192 foreach ($typeDef[
'attrs'] as $aName => $attrs) {
6193 if (isset($xvalue[
'!' . $aName])) {
6194 $xname =
'!' . $aName;
6195 $this->
debug(
"value provided for attribute $aName with key $xname");
6196 } elseif (isset($xvalue[$aName])) {
6198 $this->
debug(
"value provided for attribute $aName with key $xname");
6199 } elseif (isset($attrs[
'default'])) {
6200 $xname =
'!' . $aName;
6201 $xvalue[$xname] = $attrs[
'default'];
6202 $this->
debug(
'use default value of ' . $xvalue[$aName] .
' for attribute ' . $aName);
6205 $this->
debug(
"no value provided for attribute $aName");
6208 $xml .=
" $aName=\"" . $this->
expandEntities($xvalue[$xname]) .
"\"";
6212 $this->
debug(
"no attributes to serialize for XML Schema type $ns:$uqType");
6214 if (isset($typeDef[
'extensionBase'])) {
6215 $ns = $this->
getPrefix($typeDef[
'extensionBase']);
6216 $uqType = $this->
getLocalPart($typeDef[
'extensionBase']);
6220 if ($typeDef = $this->
getTypeDef($uqType, $ns)) {
6221 $this->
debug(
"serialize attributes for extension base $ns:$uqType");
6224 $this->
debug(
"extension base $ns:$uqType is not a supported type");
6245 if (isset($typeDef[
'elements']) && is_array($typeDef[
'elements'])) {
6246 $this->
debug(
"in serializeComplexTypeElements, serialize elements for XML Schema type $ns:$uqType");
6247 if (is_array($value)) {
6249 } elseif (is_object($value)) {
6250 $xvalue = get_object_vars($value);
6252 $this->
debug(
"value is neither an array nor an object for XML Schema type $ns:$uqType");
6256 if (count($typeDef[
'elements']) != count($xvalue)) {
6259 foreach ($typeDef[
'elements'] as $eName => $attrs) {
6260 if (!isset($xvalue[$eName])) {
6261 if (isset($attrs[
'default'])) {
6262 $xvalue[$eName] = $attrs[
'default'];
6263 $this->
debug(
'use default value of ' . $xvalue[$eName] .
' for element ' . $eName);
6267 if (isset($optionals)
6268 && (!isset($xvalue[$eName]))
6269 && ((!isset($attrs[
'nillable'])) || $attrs[
'nillable'] !=
'true')
6271 if (isset($attrs[
'minOccurs']) && $attrs[
'minOccurs'] <>
'0') {
6272 $this->
debug(
"apparent error: no value provided for element $eName with minOccurs=" . $attrs[
'minOccurs']);
6275 $this->
debug(
"no value provided for complexType element $eName and element is not nillable, so serialize nothing");
6278 if (isset($xvalue[$eName])) {
6279 $v = $xvalue[$eName];
6283 if (isset($attrs[
'form'])) {
6284 $unqualified = ($attrs[
'form'] ==
'unqualified');
6286 $unqualified =
false;
6288 if (isset($attrs[
'maxOccurs']) && ($attrs[
'maxOccurs'] ==
'unbounded' || $attrs[
'maxOccurs'] > 1) && isset($v) && is_array($v) && $this->
isArraySimpleOrStruct($v) ==
'arraySimple') {
6290 foreach ($vv as $k => $v) {
6291 if (isset($attrs[
'type']) || isset($attrs[
'ref'])) {
6293 $xml .= $this->
serializeType($eName, isset($attrs[
'type']) ? $attrs[
'type'] : $attrs[
'ref'], $v, $use, $encodingStyle, $unqualified);
6296 $this->
debug(
"calling serialize_val() for $v, $eName, false, false, false, false, $use");
6297 $xml .= $this->
serialize_val($v, $eName,
false,
false,
false,
false, $use);
6301 if (isset($attrs[
'type']) || isset($attrs[
'ref'])) {
6303 $xml .= $this->
serializeType($eName, isset($attrs[
'type']) ? $attrs[
'type'] : $attrs[
'ref'], $v, $use, $encodingStyle, $unqualified);
6306 $this->
debug(
"calling serialize_val() for $v, $eName, false, false, false, false, $use");
6307 $xml .= $this->
serialize_val($v, $eName,
false,
false,
false,
false, $use);
6313 $this->
debug(
"no elements to serialize for XML Schema type $ns:$uqType");
6315 if (isset($typeDef[
'extensionBase'])) {
6316 $ns = $this->
getPrefix($typeDef[
'extensionBase']);
6317 $uqType = $this->
getLocalPart($typeDef[
'extensionBase']);
6321 if ($typeDef = $this->
getTypeDef($uqType, $ns)) {
6322 $this->
debug(
"serialize elements for extension base $ns:$uqType");
6325 $this->
debug(
"extension base $ns:$uqType is not a supported type");
6345 public function addComplexType($name, $typeClass =
'complexType', $phpType =
'array', $compositor =
'', $restrictionBase =
'', $elements = array(), $attrs = array(), $arrayType =
'')
6347 if (count($elements) > 0) {
6348 $eElements = array();
6349 foreach ($elements as $n =>
$e) {
6352 foreach (
$e as $k => $v) {
6353 $k = strpos($k,
':') ? $this->
expandQname($k) : $k;
6354 $v = strpos($v,
':') ? $this->
expandQname($v) : $v;
6357 $eElements[$n] = $ee;
6359 $elements = $eElements;
6362 if (count($attrs) > 0) {
6363 foreach ($attrs as $n =>
$a) {
6365 foreach (
$a as $k => $v) {
6366 $k = strpos($k,
':') ? $this->
expandQname($k) : $k;
6367 $v = strpos($v,
':') ? $this->
expandQname($v) : $v;
6375 $restrictionBase = strpos($restrictionBase,
':') ? $this->
expandQname($restrictionBase) : $restrictionBase;
6376 $arrayType = strpos($arrayType,
':') ? $this->
expandQname($arrayType) : $arrayType;
6378 $typens = isset($this->namespaces[
'types']) ? $this->namespaces[
'types'] : $this->namespaces[
'tns'];
6379 $this->schemas[$typens][0]->addComplexType($name, $typeClass, $phpType, $compositor, $restrictionBase, $elements, $attrs, $arrayType);
6393 public function addSimpleType($name, $restrictionBase =
'', $typeClass =
'simpleType', $phpType =
'scalar', $enumeration = array())
6395 $restrictionBase = strpos($restrictionBase,
':') ? $this->
expandQname($restrictionBase) : $restrictionBase;
6397 $typens = isset($this->namespaces[
'types']) ? $this->namespaces[
'types'] : $this->namespaces[
'tns'];
6398 $this->schemas[$typens][0]->addSimpleType($name, $restrictionBase, $typeClass, $phpType, $enumeration);
6410 $typens = isset($this->namespaces[
'types']) ? $this->namespaces[
'types'] : $this->namespaces[
'tns'];
6411 $this->schemas[$typens][0]->addElement($attrs);
6430 if ($use ==
'encoded' && $encodingStyle ==
'') {
6431 $encodingStyle =
'http://schemas.xmlsoap.org/soap/encoding/';
6434 if ($style ==
'document') {
6435 $elements = array();
6436 foreach ($in as $n => $t) {
6437 $elements[$n] = array(
'name' => $n,
'type' => $t);
6439 $this->
addComplexType($name .
'RequestType',
'complexType',
'struct',
'all',
'', $elements);
6440 $this->
addElement(array(
'name' => $name,
'type' => $name .
'RequestType'));
6441 $in = array(
'parameters' =>
'tns:' . $name .
'^');
6443 $elements = array();
6444 foreach (
$out as $n => $t) {
6445 $elements[$n] = array(
'name' => $n,
'type' => $t);
6447 $this->
addComplexType($name .
'ResponseType',
'complexType',
'struct',
'all',
'', $elements);
6448 $this->
addElement(array(
'name' => $name .
'Response',
'type' => $name .
'ResponseType',
'form' =>
'qualified'));
6449 $out = array(
'parameters' =>
'tns:' . $name .
'Response' .
'^');
6453 $this->bindings[ $this->serviceName .
'Binding' ][
'operations'][$name] =
6456 'binding' => $this->serviceName .
'Binding',
6457 'endpoint' => $this->endpoint,
6458 'soapAction' => $soapaction,
6463 'encodingStyle' => $encodingStyle,
6464 'message' => $name .
'Request',
6469 'encodingStyle' => $encodingStyle,
6470 'message' => $name .
'Response',
6473 'transport' =>
'http://schemas.xmlsoap.org/soap/http',
6478 foreach ($in as $pName => $pType) {
6479 if (strpos($pType,
':')) {
6482 $this->messages[$name .
'Request'][$pName] = $pType;
6485 $this->messages[$name .
'Request'] =
'0';
6488 foreach (
$out as $pName => $pType) {
6489 if (strpos($pType,
':')) {
6492 $this->messages[$name .
'Response'][$pName] = $pType;
6495 $this->messages[$name .
'Response'] =
'0';
6564 $this->xml_encoding = $encoding;
6571 $pos_xml = strpos(
$xml,
'<?xml');
6572 if ($pos_xml !==
false) {
6573 $xml_decl = substr(
$xml, $pos_xml, strpos(
$xml,
'?>', $pos_xml + 2) - $pos_xml + 1);
6574 if (preg_match(
"/encoding=[\"']([^\"']*)[\"']/", $xml_decl,
$res)) {
6577 $err =
"Charset from HTTP Content-Type '" . $encoding .
"' does not match encoding from XML declaration '" .
$xml_encoding .
"'";
6579 if ($encoding !=
'ISO-8859-1' || strtoupper(
$xml_encoding) !=
'UTF-8') {
6585 $this->
debug(
'Charset from HTTP Content-Type matches encoding from XML declaration');
6588 $this->
debug(
'No encoding specified in XML declaration');
6591 $this->
debug(
'No XML declaration');
6593 $this->
debug(
'Entering nusoap_parser(), length=' . strlen(
$xml) .
', encoding=' . $encoding);
6595 $this->parser = xml_parser_create($this->xml_encoding);
6598 xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, 0);
6599 xml_parser_set_option($this->parser, XML_OPTION_TARGET_ENCODING, $this->xml_encoding);
6603 xml_set_character_data_handler($this->parser, $this->
character_data(...));
6606 if (!xml_parse($this->parser,
$xml,
true)) {
6609 'XML error parsing SOAP payload on line %d: %s',
6610 xml_get_current_line_number($this->parser),
6611 xml_error_string(xml_get_error_code($this->parser))
6617 $this->
debug(
'parsed successfully, found root struct: ' . $this->root_struct .
' of name ' . $this->root_struct_name);
6621 if ($this->root_header !=
'' && isset($this->message[$this->root_header][
'result'])) {
6625 if (
sizeof($this->multirefs) > 0) {
6626 foreach ($this->multirefs as
$id => $hrefs) {
6627 $this->
debug(
'resolving multirefs for id: ' .
$id);
6629 if (is_array($idVal) && isset($idVal[
'!id'])) {
6630 unset($idVal[
'!id']);
6632 foreach ($hrefs as $refPos => $ref) {
6633 $this->
debug(
'resolving href at pos ' . $refPos);
6634 $this->multirefs[
$id][$refPos] = $idVal;
6640 $this->
debug(
'xml was empty, didn\'t parse!');
6641 $this->
setError(
'xml was empty, didn\'t parse!');
6657 $pos = $this->position++;
6659 $this->message[$pos] = array(
'pos' => $pos,
'children' =>
'',
'cdata' =>
'');
6662 $this->message[$pos][
'depth'] = $this->depth++;
6671 $this->parent = $pos;
6675 if (strpos($name,
':')) {
6677 $prefix = substr($name, 0, strpos($name,
':'));
6679 $name = substr(strstr($name,
':'), 1);
6682 if ($name ==
'Envelope') {
6683 $this->status =
'envelope';
6684 } elseif ($name ==
'Header' && $this->status =
'envelope') {
6685 $this->root_header = $pos;
6686 $this->status =
'header';
6687 } elseif ($name ==
'Body' && $this->status =
'envelope') {
6688 $this->status =
'body';
6689 $this->body_position = $pos;
6691 } elseif ($this->status ==
'body' && $pos == ($this->body_position + 1)) {
6692 $this->status =
'method';
6693 $this->root_struct_name = $name;
6694 $this->root_struct = $pos;
6695 $this->message[$pos][
'type'] =
'struct';
6696 $this->
debug(
"found root struct $this->root_struct_name, pos $this->root_struct");
6701 $this->message[$pos][
'name'] = htmlspecialchars($name);
6703 $this->message[$pos][
'attrs'] = $attrs;
6707 foreach ($attrs as $key => $value) {
6711 if ($key_prefix ==
'xmlns') {
6712 if (preg_match(
'/^http:\/\/www.w3.org\/[0-9]{4}\/XMLSchema$/', $value)) {
6713 $this->XMLSchemaVersion = $value;
6715 $this->namespaces[
'xsi'] = $this->XMLSchemaVersion .
'-instance';
6717 $this->namespaces[$key_localpart] = $value;
6719 if ($name == $this->root_struct_name) {
6720 $this->methodNamespace = $value;
6723 } elseif ($key_localpart ==
'type') {
6724 if (isset($this->message[$pos][
'type']) && $this->message[$pos][
'type'] ==
'array') {
6727 $value_prefix = $this->
getPrefix($value);
6729 $this->message[$pos][
'type'] = $value_localpart;
6730 $this->message[$pos][
'typePrefix'] = $value_prefix;
6731 if (isset($this->namespaces[$value_prefix])) {
6732 $this->message[$pos][
'type_namespace'] = $this->namespaces[$value_prefix];
6733 } elseif (isset($attrs[
'xmlns:' . $value_prefix])) {
6734 $this->message[$pos][
'type_namespace'] = $attrs[
'xmlns:' . $value_prefix];
6738 } elseif ($key_localpart ==
'arrayType') {
6739 $this->message[$pos][
'type'] =
'array';
6748 $expr =
'/([A-Za-z0-9_]+):([A-Za-z]+[A-Za-z0-9_]+)\[([0-9]+),?([0-9]*)\]/';
6749 if (preg_match($expr, $value, $regs)) {
6750 $this->message[$pos][
'typePrefix'] = $regs[1];
6751 $this->message[$pos][
'arrayTypePrefix'] = $regs[1];
6752 if (isset($this->namespaces[$regs[1]])) {
6753 $this->message[$pos][
'arrayTypeNamespace'] = $this->namespaces[$regs[1]];
6754 } elseif (isset($attrs[
'xmlns:' . $regs[1]])) {
6755 $this->message[$pos][
'arrayTypeNamespace'] = $attrs[
'xmlns:' . $regs[1]];
6757 $this->message[$pos][
'arrayType'] = $regs[2];
6758 $this->message[$pos][
'arraySize'] = $regs[3];
6759 $this->message[$pos][
'arrayCols'] = $regs[4];
6762 } elseif ($key_localpart ==
'nil') {
6763 $this->message[$pos][
'nil'] = ($value ==
'true' || $value ==
'1');
6765 } elseif ($key !=
'href' && $key !=
'xmlns' && $key_localpart !=
'encodingStyle' && $key_localpart !=
'root') {
6766 $this->message[$pos][
'xattrs'][
'!' . $key] = $value;
6769 if ($key ==
'xmlns') {
6770 $this->default_namespace = $value;
6774 $this->ids[$value] = $pos;
6777 if ($key_localpart ==
'root' && $value == 1) {
6778 $this->status =
'method';
6779 $this->root_struct_name = $name;
6780 $this->root_struct = $pos;
6781 $this->
debug(
"found root struct $this->root_struct_name, pos $pos");
6784 $attstr .=
" $key=\"$value\"";
6787 if (isset($prefix)) {
6788 $this->message[$pos][
'namespace'] = $this->namespaces[$prefix];
6789 $this->default_namespace = $this->namespaces[$prefix];
6793 if ($this->status ==
'header') {
6794 if ($this->root_header != $pos) {
6795 $this->responseHeaders .=
"<" . (isset($prefix) ? $prefix .
':' :
'') .
"$name$attstr>";
6797 } elseif ($this->root_struct_name !=
'') {
6798 $this->document .=
"<" . (isset($prefix) ? $prefix .
':' :
'') .
"$name$attstr>";
6812 $pos = $this->depth_array[$this->depth--];
6815 if (strpos($name,
':')) {
6817 $prefix = substr($name, 0, strpos($name,
':'));
6819 $name = substr(strstr($name,
':'), 1);
6823 if (isset($this->body_position) && $pos > $this->body_position) {
6825 if (isset($this->message[$pos][
'attrs'][
'href'])) {
6827 $id = substr($this->message[$pos][
'attrs'][
'href'], 1);
6829 $this->multirefs[
$id][$pos] =
'placeholder';
6831 $this->message[$pos][
'result'] = & $this->multirefs[
$id][$pos];
6833 } elseif ($this->message[$pos][
'children'] !=
'') {
6835 if (!isset($this->message[$pos][
'result'])) {
6836 $this->message[$pos][
'result'] = $this->
buildVal($pos);
6839 } elseif (isset($this->message[$pos][
'xattrs'])) {
6840 if (isset($this->message[$pos][
'nil']) && $this->message[$pos][
'nil']) {
6841 $this->message[$pos][
'xattrs'][
'!'] =
null;
6842 } elseif (isset($this->message[$pos][
'cdata']) && trim($this->message[$pos][
'cdata']) !=
'') {
6843 if (isset($this->message[$pos][
'type'])) {
6844 $this->message[$pos][
'xattrs'][
'!'] = $this->
decodeSimple($this->message[$pos][
'cdata'], $this->message[$pos][
'type'], isset($this->message[$pos][
'type_namespace']) ? $this->message[$pos][
'type_namespace'] :
'');
6846 $parent = $this->message[$pos][
'parent'];
6847 if (isset($this->message[
$parent][
'type']) && ($this->message[
$parent][
'type'] ==
'array') && isset($this->message[
$parent][
'arrayType'])) {
6848 $this->message[$pos][
'xattrs'][
'!'] = $this->
decodeSimple($this->message[$pos][
'cdata'], $this->message[
$parent][
'arrayType'], isset($this->message[
$parent][
'arrayTypeNamespace']) ? $this->message[
$parent][
'arrayTypeNamespace'] :
'');
6850 $this->message[$pos][
'xattrs'][
'!'] = $this->message[$pos][
'cdata'];
6854 $this->message[$pos][
'result'] = $this->message[$pos][
'xattrs'];
6858 if (isset($this->message[$pos][
'nil']) && $this->message[$pos][
'nil']) {
6859 $this->message[$pos][
'xattrs'][
'!'] =
null;
6860 } elseif (isset($this->message[$pos][
'type'])) {
6861 $this->message[$pos][
'result'] = $this->
decodeSimple($this->message[$pos][
'cdata'], $this->message[$pos][
'type'], isset($this->message[$pos][
'type_namespace']) ? $this->message[$pos][
'type_namespace'] :
'');
6863 $parent = $this->message[$pos][
'parent'];
6864 if (isset($this->message[
$parent][
'type']) && ($this->message[
$parent][
'type'] ==
'array') && isset($this->message[
$parent][
'arrayType'])) {
6865 $this->message[$pos][
'result'] = $this->
decodeSimple($this->message[$pos][
'cdata'], $this->message[
$parent][
'arrayType'], isset($this->message[
$parent][
'arrayTypeNamespace']) ? $this->message[
$parent][
'arrayTypeNamespace'] :
'');
6867 $this->message[$pos][
'result'] = $this->message[$pos][
'cdata'];
6885 if ($this->status ==
'header') {
6886 if ($this->root_header != $pos) {
6887 $this->responseHeaders .=
"</" . (isset($prefix) ? $prefix .
':' :
'') .
"$name>";
6889 } elseif ($pos >= $this->root_struct) {
6890 $this->document .=
"</" . (isset($prefix) ? $prefix .
':' :
'') .
"$name>";
6893 if ($pos == $this->root_struct) {
6894 $this->status =
'body';
6895 $this->root_struct_namespace = $this->message[$pos][
'namespace'];
6896 } elseif ($name ==
'Body') {
6897 $this->status =
'envelope';
6898 } elseif ($name ==
'Header') {
6899 $this->status =
'envelope';
6900 } elseif ($name ==
'Envelope') {
6904 $this->parent = $this->message[$pos][
'parent'];
6917 if ($this->xml_encoding ==
'UTF-8') {
6921 if ($this->decode_utf8) {
6925 $this->message[$pos][
'cdata'] .=
$data;
6927 if ($this->status ==
'header') {
6928 $this->responseHeaders .=
$data;
6930 $this->document .=
$data;
6991 if ((!isset($type)) || $type ==
'string' || $type ==
'long' || $type ==
'unsignedLong') {
6992 return (
string) $value;
6994 if ($type ==
'int' || $type ==
'integer' || $type ==
'short' || $type ==
'byte') {
6995 return (
int) $value;
6997 if ($type ==
'float' || $type ==
'double' || $type ==
'decimal') {
6998 return (
float) $value;
7000 if ($type ==
'boolean') {
7001 if (strtolower($value) ==
'false' || strtolower($value) ==
'f') {
7004 return (
bool) $value;
7006 if ($type ==
'base64' || $type ==
'base64Binary') {
7007 $this->
debug(
'Decode base64 value');
7008 return base64_decode($value);
7011 if ($type ==
'nonPositiveInteger' || $type ==
'negativeInteger'
7012 || $type ==
'nonNegativeInteger' || $type ==
'positiveInteger'
7013 || $type ==
'unsignedInt'
7014 || $type ==
'unsignedShort' || $type ==
'unsignedByte') {
7015 return (
int) $value;
7018 if ($type ==
'array') {
7022 return (
string) $value;
7035 if (!isset($this->message[$pos][
'type'])) {
7036 $this->message[$pos][
'type'] =
'';
7038 $this->
debug(
'in buildVal() for ' . $this->message[$pos][
'name'] .
"(pos $pos) of type " . $this->message[$pos][
'type']);
7040 if ($this->message[$pos][
'children'] !=
'') {
7041 $this->
debug(
'in buildVal, there are children');
7042 $children = explode(
'|', $this->message[$pos][
'children']);
7043 array_shift($children);
7045 if (isset($this->message[$pos][
'arrayCols']) && $this->message[$pos][
'arrayCols'] !=
'') {
7048 foreach ($children as $child_pos) {
7049 $this->
debug(
"in buildVal, got an MD array element: $r, $c");
7050 $params[$r][] = $this->message[$child_pos][
'result'];
7052 if (
$c == $this->message[$pos][
'arrayCols']) {
7058 } elseif ($this->message[$pos][
'type'] ==
'array' || $this->message[$pos][
'type'] ==
'Array') {
7059 $this->
debug(
'in buildVal, adding array ' . $this->message[$pos][
'name']);
7060 foreach ($children as $child_pos) {
7061 $params[] = &$this->message[$child_pos][
'result'];
7064 } elseif ($this->message[$pos][
'type'] ==
'Map' && $this->message[$pos][
'type_namespace'] ==
'http://xml.apache.org/xml-soap') {
7065 $this->
debug(
'in buildVal, Java Map ' . $this->message[$pos][
'name']);
7066 foreach ($children as $child_pos) {
7067 $kv = explode(
"|", $this->message[$child_pos][
'children']);
7068 $params[$this->message[$kv[1]][
'result']] = &$this->message[$kv[2]][
'result'];
7074 $this->
debug(
'in buildVal, adding Java Vector or generic compound type ' . $this->message[$pos][
'name']);
7075 if ($this->message[$pos][
'type'] ==
'Vector' && $this->message[$pos][
'type_namespace'] ==
'http://xml.apache.org/xml-soap') {
7081 foreach ($children as $child_pos) {
7083 $params[] = &$this->message[$child_pos][
'result'];
7085 if (isset(
$params[$this->message[$child_pos][
'name']])) {
7087 if ((!is_array(
$params[$this->message[$child_pos][
'name']])) || (!isset(
$params[$this->message[$child_pos][
'name']][0]))) {
7088 $params[$this->message[$child_pos][
'name']] = array(
$params[$this->message[$child_pos][
'name']]);
7090 $params[$this->message[$child_pos][
'name']][] = &$this->message[$child_pos][
'result'];
7092 $params[$this->message[$child_pos][
'name']] = &$this->message[$child_pos][
'result'];
7097 if (isset($this->message[$pos][
'xattrs'])) {
7098 $this->
debug(
'in buildVal, handling attributes');
7099 foreach ($this->message[$pos][
'xattrs'] as $n => $v) {
7104 if (isset($this->message[$pos][
'cdata']) && trim($this->message[$pos][
'cdata']) !=
'') {
7105 $this->
debug(
'in buildVal, handling simpleContent');
7106 if (isset($this->message[$pos][
'type'])) {
7107 $params[
'!'] = $this->
decodeSimple($this->message[$pos][
'cdata'], $this->message[$pos][
'type'], isset($this->message[$pos][
'type_namespace']) ? $this->message[$pos][
'type_namespace'] :
'');
7109 $parent = $this->message[$pos][
'parent'];
7110 if (isset($this->message[
$parent][
'type']) && ($this->message[
$parent][
'type'] ==
'array') && isset($this->message[
$parent][
'arrayType'])) {
7111 $params[
'!'] = $this->
decodeSimple($this->message[$pos][
'cdata'], $this->message[
$parent][
'arrayType'], isset($this->message[
$parent][
'arrayTypeNamespace']) ? $this->message[
$parent][
'arrayTypeNamespace'] :
'');
7113 $params[
'!'] = $this->message[$pos][
'cdata'];
7118 $this->
debug(
'in buildVal, return:');
7122 $this->
debug(
'in buildVal, no children, building scalar');
7123 $cdata = isset($this->message[$pos][
'cdata']) ? $this->message[$pos][
'cdata'] :
'';
7124 if (isset($this->message[$pos][
'type'])) {
7125 $ret = $this->
decodeSimple($cdata, $this->message[$pos][
'type'], isset($this->message[$pos][
'type_namespace']) ? $this->message[$pos][
'type_namespace'] :
'');
7126 $this->
debug(
"in buildVal, return: $ret");
7129 $parent = $this->message[$pos][
'parent'];
7130 if (isset($this->message[
$parent][
'type']) && ($this->message[
$parent][
'type'] ==
'array') && isset($this->message[
$parent][
'arrayType'])) {
7131 $ret = $this->
decodeSimple($cdata, $this->message[
$parent][
'arrayType'], isset($this->message[
$parent][
'arrayTypeNamespace']) ? $this->message[
$parent][
'arrayTypeNamespace'] :
'');
7132 $this->
debug(
"in buildVal, return: $ret");
7135 $ret = $this->message[$pos][
'cdata'];
7136 $this->
debug(
"in buildVal, return: $ret");
7260 $this->
debug(
"ctor wsdl=$wsdl timeout=$timeout response_timeout=$response_timeout");
7267 $this->endpoint = $this->
wsdl->wsdl;
7269 $this->
debug(
'existing wsdl instance created from ' . $this->endpoint);
7274 $this->
debug(
'will use lazy evaluation of wsdl from ' . $this->endpoint);
7276 $this->endpointType =
'wsdl';
7278 $this->
debug(
"instantiate SOAP with endpoint at $endpoint");
7279 $this->endpointType =
'soap';
7308 public function call(
$operation,
$params = array(),
$namespace =
'http://tempuri.org', $soapAction =
'', $headers =
false, $rpcParams =
null, $style =
'rpc', $use =
'encoded')
7311 $this->fault =
false;
7313 $this->request =
'';
7314 $this->response =
'';
7315 $this->responseData =
'';
7316 $this->faultstring =
'';
7317 $this->faultcode =
'';
7318 $this->opData = array();
7320 $this->
debug(
"call: operation=$operation, namespace=$namespace, soapAction=$soapAction, rpcParams=$rpcParams, style=$style, use=$use, endpointType=$this->endpointType");
7324 $this->requestHeaders = $headers;
7326 if ($this->endpointType ==
'wsdl' && is_null($this->
wsdl)) {
7336 $this->
debug(
"found operation");
7338 if (isset(
$opData[
'soapAction'])) {
7339 $soapAction =
$opData[
'soapAction'];
7341 if (! $this->forceEndpoint) {
7342 $this->endpoint =
$opData[
'endpoint'];
7348 $use =
$opData[
'input'][
'use'];
7351 $nsPrefix =
'ns' . rand(1000, 9999);
7357 $this->
debug(
"serializing param string for WSDL operation $operation");
7359 } elseif (is_array(
$params)) {
7360 $this->
debug(
"serializing param array for WSDL operation $operation");
7363 $this->
debug(
'params must be array or string');
7364 $this->
setError(
'params must be array or string');
7368 if (isset(
$opData[
'input'][
'encodingStyle'])) {
7369 $encodingStyle =
$opData[
'input'][
'encodingStyle'];
7371 $encodingStyle =
'';
7376 $this->
debug(
'got wsdl error: ' . $errstr);
7377 $this->
setError(
'wsdl error: ' . $errstr);
7380 } elseif ($this->endpointType ==
'wsdl') {
7385 $this->
debug(
"operation '$operation' not present.");
7390 $nsPrefix =
'ns' . rand(1000, 9999);
7394 $this->
debug(
"serializing param string for operation $operation");
7396 } elseif (is_array(
$params)) {
7397 $this->
debug(
"serializing param array for operation $operation");
7398 foreach (
$params as $k => $v) {
7402 $this->
debug(
'params must be array or string');
7403 $this->
setError(
'params must be array or string');
7407 if ($use ==
'encoded') {
7408 $encodingStyle =
'http://schemas.xmlsoap.org/soap/encoding/';
7410 $encodingStyle =
'';
7414 if ($style ==
'rpc') {
7415 if ($use ==
'literal') {
7416 $this->
debug(
"wrapping RPC request with literal method element");
7419 $payload =
"<$nsPrefix:$operation xmlns:$nsPrefix=\"$namespace\">" .
7421 "</$nsPrefix:$operation>";
7426 $this->
debug(
"wrapping RPC request with encoded method element");
7428 $payload =
"<$nsPrefix:$operation xmlns:$nsPrefix=\"$namespace\">" .
7430 "</$nsPrefix:$operation>";
7440 $this->
debug(
"endpoint=$this->endpoint, soapAction=$soapAction, namespace=$namespace, style=$style, use=$use, encodingStyle=$encodingStyle");
7441 $this->
debug(
'SOAP message length=' . strlen($soapmsg) .
' contents (max 1000 bytes)=' . substr($soapmsg, 0, 1000));
7443 $return = $this->
send($this->
getHTTPBody($soapmsg), $soapAction, $this->timeout, $this->response_timeout);
7445 $this->
debug(
'Error: ' . $errstr);
7449 $this->
debug(
'sent message successfully and got a(n) ' . gettype(
$return));
7454 $this->
debug(
'got fault');
7456 $this->fault =
true;
7457 foreach (
$return as $k => $v) {
7459 $this->
debug(
"$k = $v<br>");
7462 } elseif ($style ==
'document') {
7476 $this->
debug(
'return shifted value: ');
7496 $this->
debug(
'checkWSDL');
7499 $this->
debug(
'got wsdl error: ' . $errstr);
7500 $this->
setError(
'wsdl error: ' . $errstr);
7502 $this->bindingType =
'soap';
7503 $this->
debug(
'got ' . count($this->operations) .
' operations from wsdl ' . $this->wsdlFile .
' for binding type ' . $this->bindingType);
7505 $this->bindingType =
'soap12';
7506 $this->
debug(
'got ' . count($this->operations) .
' operations from wsdl ' . $this->wsdlFile .
' for binding type ' . $this->bindingType);
7507 $this->
debug(
'**************** WARNING: SOAP 1.2 BINDING *****************');
7509 $this->
debug(
'getOperations returned false');
7510 $this->
setError(
'no operations defined in the WSDL document!');
7521 $this->
debug(
'instantiating wsdl class with doc: ' . $this->wsdlFile);
7522 $this->
wsdl =
new wsdl(
'', $this->proxyhost, $this->proxyport, $this->proxyusername, $this->proxypassword, $this->timeout, $this->response_timeout, $this->curl_options, $this->use_curl);
7523 $this->
wsdl->
setCredentials($this->username, $this->password, $this->authtype, $this->certRequest);
7537 if ($this->endpointType ==
'wsdl' && is_null($this->
wsdl)) {
7546 $this->
debug(
"No data for operation: $operation");
7569 case preg_match(
'/^http/', $this->endpoint):
7570 $this->
debug(
'transporting via HTTP');
7571 if ($this->persistentConnection ==
true && is_object($this->persistentConnection)) {
7575 if ($this->persistentConnection) {
7576 $http->usePersistentConnection();
7580 $http->setSOAPAction($soapaction);
7581 if ($this->proxyhost && $this->proxyport) {
7582 $http->setProxy($this->proxyhost, $this->proxyport, $this->proxyusername, $this->proxypassword);
7584 if ($this->authtype !=
'') {
7585 $http->setCredentials($this->username, $this->password, $this->authtype, array(), $this->certRequest);
7587 if ($this->http_encoding !=
'') {
7588 $http->setEncoding($this->http_encoding);
7590 $this->
debug(
'sending message, length=' . strlen($msg));
7591 if (preg_match(
'/^http:/', $this->endpoint)) {
7594 } elseif (preg_match(
'/^https/', $this->endpoint)) {
7603 $this->
setError(
'no http/s in endpoint url');
7605 $this->request =
$http->outgoing_payload;
7606 $this->response =
$http->incoming_payload;
7611 if ($this->persistentConnection) {
7612 $http->clearDebug();
7613 if (!is_object($this->persistentConnection)) {
7614 $this->persistentConnection =
$http;
7618 if ($err =
$http->getError()) {
7619 $this->
setError(
'HTTP Error: ' . $err);
7624 $this->
debug(
'got response, length=' . strlen($this->responseData) .
' type=' .
$http->incoming_headers[
'content-type']);
7629 $this->
setError(
'no transport found, or selected transport is not yet supported!');
7645 $this->
debug(
'Entering parseResponse() for data of length ' . strlen(
$data) .
' headers:');
7647 if (!strstr($headers[
'content-type'],
'text/xml')) {
7648 $this->
setError(
'Response not of type text/xml: ' . $headers[
'content-type']);
7651 if (strpos($headers[
'content-type'],
'=')) {
7652 $enc = str_replace(
'"',
'', substr(strstr($headers[
"content-type"],
'='), 1));
7653 $this->
debug(
'Got response encoding: ' . $enc);
7654 if (preg_match(
'/^(ISO-8859-1|US-ASCII|UTF-8)$/i', $enc)) {
7655 $this->xml_encoding = strtoupper($enc);
7657 $this->xml_encoding =
'US-ASCII';
7661 $this->xml_encoding =
'ISO-8859-1';
7663 $this->
debug(
'Use encoding: ' . $this->xml_encoding .
' when creating nusoap_parser');
7664 $parser =
new nusoap_parser(
$data, $this->xml_encoding, $this->operation, $this->decode_utf8);
7668 if ($errstr = $parser->getError()) {
7675 $this->responseHeaders = $parser->getHeaders();
7677 $this->responseHeader = $parser->get_soapheader();
7679 $return = $parser->get_soapbody();
7681 $this->document = $parser->document;
7698 $this->
debug(
"setCurlOption option=$option, value=");
7700 $this->curl_options[$option] = $value;
7711 $this->
debug(
"setEndpoint(\"$endpoint\")");
7723 $this->
debug(
"setHeaders headers=");
7725 $this->requestHeaders = $headers;
7778 $this->
debug(
"setCredentials username=$username authtype=$authtype certRequest=");
7794 $this->
debug(
"setHTTPEncoding(\"$enc\")");
7795 $this->http_encoding = $enc;
7806 $this->
debug(
"setUseCURL($use)");
7807 $this->use_curl = $use;
7817 $this->
debug(
"useHTTPPersistentConnection");
7818 $this->persistentConnection =
true;
7850 $this->defaultRpcParams = $rpcParams;
7866 $this->
debug(
"Error from _getProxyClassCode, so return NULL");
7872 eval(
"\$proxy = new nusoap_proxy_$r('');");
7874 $proxy->endpointType =
'wsdl';
7911 $this->
debug(
"in getProxy endpointType=$this->endpointType");
7913 if ($this->endpointType !=
'wsdl') {
7914 $evalStr =
'A proxy can only be created for a WSDL client';
7916 $evalStr =
"echo \"$evalStr\";";
7919 if ($this->endpointType ==
'wsdl' && is_null($this->
wsdl)) {
7922 return "echo \"" . $this->
getError() .
"\";";
7929 if (
sizeof(
$opData[
'input'][
'parts']) > 0) {
7931 $paramArrayStr =
'';
7932 $paramCommentStr =
'';
7933 foreach (
$opData[
'input'][
'parts'] as $name => $type) {
7934 $paramStr .=
"\$$name, ";
7935 $paramArrayStr .=
"'$name' => \$$name, ";
7936 $paramCommentStr .=
"$type \$$name, ";
7938 $paramStr = substr($paramStr, 0, strlen($paramStr) - 2);
7939 $paramArrayStr = substr($paramArrayStr, 0, strlen($paramArrayStr) - 2);
7940 $paramCommentStr = substr($paramCommentStr, 0, strlen($paramCommentStr) - 2);
7943 $paramArrayStr =
'';
7944 $paramCommentStr =
'void';
7947 $evalStr .=
"// $paramCommentStr
7948 function " . str_replace(
'.',
'__',
$operation) .
"($paramStr) {
7949 \$params = array($paramArrayStr);
7950 return \$this->call('$operation', \$params, '" .
$opData[
'namespace'] .
"', '" . (isset(
$opData[
'soapAction']) ?
$opData[
'soapAction'] :
'') .
"');
7954 unset($paramCommentStr);
7957 $evalStr =
'class nusoap_proxy_' . $r .
' extends nusoap_client {
8022 $this->decode_utf8 = $bool;
8036 if (strlen($name) == 0) {
8039 $this->cookies[] = array(
'name' => $name,
'value' => $value);
8062 if (
sizeof($this->cookies) == 0) {
8065 $this->
debug(
'checkCookie: check ' .
sizeof($this->cookies) .
' cookies');
8067 $this->cookies = array();
8068 foreach ($curr_cookies as $cookie) {
8069 if (! is_array($cookie)) {
8070 $this->
debug(
'Remove cookie that is not an array');
8073 if ((isset($cookie[
'expires'])) && (! empty($cookie[
'expires']))) {
8074 if (strtotime($cookie[
'expires']) > time()) {
8075 $this->cookies[] = $cookie;
8077 $this->
debug(
'Remove expired cookie ' . $cookie[
'name']);
8080 $this->cookies[] = $cookie;
8083 $this->
debug(
'checkCookie: ' .
sizeof($this->cookies) .
' cookies left in array');
8096 if (
sizeof($this->cookies) == 0) {
8099 $this->
debug(
'Setting new cookie(s)');
8110 if (!is_array($newCookie)) {
8113 if ((!isset($newCookie[
'name'])) || (!isset($newCookie[
'value']))) {
8116 $newName = $newCookie[
'name'];
8119 for ($i = 0; $i < count($this->cookies); $i++) {
8120 $cookie = $this->cookies[$i];
8121 if (!is_array($cookie)) {
8124 if (!isset($cookie[
'name'])) {
8127 if ($newName != $cookie[
'name']) {
8130 $newDomain = isset($newCookie[
'domain']) ? $newCookie[
'domain'] :
'NODOMAIN';
8131 $domain = isset($cookie[
'domain']) ? $cookie[
'domain'] :
'NODOMAIN';
8132 if ($newDomain != $domain) {
8135 $newPath = isset($newCookie[
'path']) ? $newCookie[
'path'] :
'NOPATH';
8136 $path = isset($cookie[
'path']) ? $cookie[
'path'] :
'NOPATH';
8137 if ($newPath !=
$path) {
8140 $this->cookies[$i] = $newCookie;
8142 $this->
debug(
'Update cookie ' . $newName .
'=' . $newCookie[
'value']);
8146 $this->
debug(
'Add cookie ' . $newName .
'=' . $newCookie[
'value']);
8147 $this->cookies[] = $newCookie;
8154if (!extension_loaded(
'soap')) {
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
foreach($mandatory_scripts as $file) $timestamp
getPrefix($str)
returns the prefix part of a prefixed string returns false, if not prefixed
& getDebug()
gets the current debug data for this instance
& getDebugAsXMLComment()
gets the current debug data for this instance as an XML comment this may change the contents of the d...
getmicrotime()
returns the time in ODBC canonical form with microseconds
setError($str)
sets error string
getNamespaceFromPrefix($prefix)
pass it a prefix, it returns a namespace
contractQname($qname)
contracts (changes namespace to prefix) a qualified name
debug($string)
adds debug data to the instance debug string with formatting
getDebugLevel()
gets the debug level for this instance
getPrefixFromNamespace($ns)
returns the prefix for a given namespace (or prefix) or false if no prefixes registered for the given...
serialize_val($val, $name=false, $type=false, $name_ns=false, $type_ns=false, $attributes=false, $use='encoded', $soapval=false)
serializes PHP values in accordance w/ section 5.
setGlobalDebugLevel($level)
sets the global debug level, which applies to future instances
serializeEnvelope($body, $headers=false, $namespaces=array(), $style='rpc', $use='encoded', $encodingStyle='http://schemas.xmlsoap.org/soap/encoding/')
serializes a message
clearDebug()
clears the current debug data for this instance
expandEntities($val)
expands entities, e.g.
formatDump($str)
formats a string to be inserted into an HTML stream
expandQname($qname)
expands (changes prefix to namespace) a qualified name
varDump($data)
Returns a string with the output of var_dump.
setDebugLevel($level)
sets the debug level for this instance
getError()
returns error string if present
__toString()
represents the object as a string
appendDebug($string)
adds debug data to the instance debug string without formatting
getLocalPart($str)
returns the local part of a prefixed string returns the original string, if not prefixed
isArraySimpleOrStruct($val)
detect if array is a simple array or a struct (associative array)
getGlobalDebugLevel()
gets the global debug level, which applies to future instances
[nu]soapclient higher level class for easy usage.
setCurlOption($option, $value)
sets user-specified cURL options
setCredentials($username, $password, $authtype='basic', $certRequest=array())
if authenticating, set user credentials here
setHTTPProxy($proxyhost, $proxyport, $proxyusername='', $proxypassword='')
set proxy info here
getProxy()
dynamically creates an instance of a proxy class, allowing user to directly call methods from wsdl
send($msg, $soapaction='', $timeout=0, $response_timeout=30)
send the SOAP message
setUseCURL($use)
Set whether to try to use cURL connections if possible.
call($operation, $params=array(), $namespace='http://tempuri.org', $soapAction='', $headers=false, $rpcParams=null, $style='rpc', $use='encoded')
calls method, returns PHP native type
getProxyClassCode()
dynamically creates proxy class code
checkCookies()
checks all Cookies and delete those which are expired
getHTTPContentType()
gets the HTTP content type for the current request.
setHTTPEncoding($enc='gzip, deflate')
use HTTP encoding
getHeader()
get the SOAP response Header (parsed)
useHTTPPersistentConnection()
use HTTP persistent connections if possible
setCookie($name, $value)
adds a new Cookie into $this->cookies array
getHTTPContentTypeCharset()
gets the HTTP content type charset for the current request.
getOperationData($operation)
get available data pertaining to an operation
getDefaultRpcParams()
gets the default RPC parameter setting.
checkWSDL()
check WSDL passed as an instance or pulled from an endpoint
setHeaders($headers)
set the SOAP headers
loadWSDL()
instantiate wsdl object and parse wsdl file
getHTTPBody($soapmsg)
gets the HTTP body for the current request.
setDefaultRpcParams($rpcParams)
sets the default RPC parameter setting.
__construct($endpoint, $wsdl=false, $proxyhost=false, $proxyport=false, $proxyusername=false, $proxypassword=false, $timeout=0, $response_timeout=30)
constructor
setEndpoint($endpoint)
sets the SOAP endpoint, which can override WSDL
UpdateCookies($cookies)
updates the current cookies with a new set
getHeaders()
get the SOAP response headers (namespace resolution incomplete)
_getProxyClassCode($r)
dynamically creates proxy class code
getCookies()
gets all Cookies
parseResponse($headers, $data)
processes SOAP message returned from server
Contains information for a SOAP fault.
serialize()
serialize a fault
__construct($faultcode, $faultactor='', $faultstring='', $faultdetail='')
constructor
nusoap_parser class parses SOAP XML messages into native PHP values
character_data($parser, $data)
element content handler
get_soapbody()
get the parsed SOAP Body (NULL if there was none)
end_element($parser, $name)
end-element handler
getHeaders()
get the unparsed SOAP Header
get_response()
get the parsed message (SOAP Body)
decodeSimple($value, $type, $typens)
decodes simple types into PHP variables
get_soapheader()
get the parsed SOAP Header (NULL if there was none)
start_element($parser, $name, $attrs)
start-element handler
buildVal($pos)
builds response structures for compound values (arrays/structs) and scalars
__construct($xml, $encoding='UTF-8', $method='', $decode_utf8=true)
constructor that actually does the parsing
nusoap_server allows the user to create a SOAP server that is capable of receiving messages and retur...
verify_method($operation, $request)
takes the value that was created by parsing the request and compares to the method's signature,...
$methodreturnisliteralxml
getHTTPBody($soapmsg)
gets the HTTP body for the current response.
invoke_method()
invokes a PHP function for the requested SOAP method
add_to_map($methodname, $in, $out)
add a method to the dispatch map (this has been replaced by the register method)
getHTTPContentType()
gets the HTTP content type for the current response.
__construct($wsdl=false)
constructor the optional parameter is a path to a WSDL file that you'd like to bind the server instan...
addInternalPort(string $serviceName, string $url)
parse_request($data='')
parses a request
getHTTPContentTypeCharset()
gets the HTTP content type charset for the current response.
serialize_return()
serializes the return value from a PHP function into a full SOAP Envelope
send_response()
sends an HTTP response
fault($faultcode, $faultstring, $faultactor='', $faultdetail='')
Specify a fault to be returned to the client.
parse_http_headers()
parses HTTP request headers.
service($data)
processes request and returns response
parseRequest($headers, $data)
processes SOAP message received from client
configureWSDL($serviceName, $namespace=false, $endpoint=false, $style='rpc', $transport='http://schemas.xmlsoap.org/soap/http', $schemaTargetNamespace=false)
Sets up wsdl object.
parses an XML Schema, allows access to it's data, other utility methods.
schemaCharacterData($parser, $data)
element content handler
getTypeDef($type)
returns an associative array of information about a given type returns false if no type exists by the...
addComplexType($name, $typeClass='complexType', $phpType='array', $compositor='', $restrictionBase='', $elements=array(), $attrs=array(), $arrayType='')
adds a complex type to the schema
typeToForm($name, $type)
returns HTML form elements that allow a user to enter values for creating an instance of the given ty...
addElement($attrs)
adds an element to the schema
getPHPType($type, $ns)
get the PHP type of a user defined type in the schema PHP type is kind of a misnomer since it actuall...
xdebug($string)
adds debug data to the clas level debug string
addSimpleType($name, $restrictionBase='', $typeClass='simpleType', $phpType='scalar', $enumeration=array())
adds a simple type to the schema
serializeSchema()
serialize the schema
__construct($schema='', $xml='', $namespaces=array())
constructor
parseString($xml, $type)
parse an XML string
schemaEndElement($parser, $name)
end-element handler
schemaStartElement($parser, $name, $attrs)
start-element handler
serializeTypeDef($type)
returns a sample serialization of a given type, or false if no type by the given name
parseFile($xml, $type)
parse an XML file
CreateTypeName($ename)
gets a type name for an unnamed type
transport class for sending/receiving data via HTTP and HTTPS NOTE: PHP must be compiled with the CUR...
sendRequest($data, $cookies=null)
sends the SOAP request via HTTP[S]
setCurlOption($option, $value)
sets a cURL option
getCookiesForRequest($cookies, $secure=false)
sort out cookies for the current request
send($data, $timeout=0, $response_timeout=30, $cookies=null)
sends the SOAP request and gets the SOAP response via HTTP[S]
parseCookie($cookie_str)
parse an incoming Cookie into it's parts
setURL($url)
sets the URL to which to connect
getResponse()
gets the SOAP response via HTTP[S]
setContentType($type, $charset=false)
sets the content-type for the SOAP message to be sent
unsetHeader($name)
unsets an HTTP header
isSkippableCurlHeader(&$data)
Test if the given string starts with a header that is to be skipped.
setSOAPAction($soapaction)
set the soapaction value
setEncoding($enc='gzip, deflate')
use http encoding
usePersistentConnection()
specifies that an HTTP persistent connection should be used
setCredentials($username, $password, $authtype='basic', $digestRequest=array(), $certRequest=array())
if authenticating, set user credentials here
buildPayload($data, $cookie_str='')
Writes the payload, including HTTP headers, to $this->outgoing_payload.
connect($connection_timeout=0, $response_timeout=30)
establish an HTTP connection
setHeader($name, $value)
sets an HTTP header
io_method()
gets the I/O method to use
decodeChunked($buffer, $lb)
decode a string that is encoded w/ "chunked' transfer encoding as defined in RFC2068 19....
setProxy($proxyhost, $proxyport, $proxyusername='', $proxypassword='', $proxyauthtype='basic')
set proxy info here
sendHTTPS($data, $timeout=0, $response_timeout=30, $cookies=null)
sends the SOAP request and gets the SOAP response via HTTPS using CURL
__construct($url, $curl_options=null, $use_curl=false)
constructor
For creating serializable abstractions of native PHP types.
serialize($use='encoded')
return serialized value
__construct($name='soapval', $type=false, $value=-1, $element_ns=false, $type_ns=false, $attributes=false)
constructor
decode()
decodes a soapval object into a PHP native type
parses a WSDL file, allows access to it's data, other utility methods.
character_data($parser, $data)
element content handler
serializeComplexTypeAttributes($typeDef, $value, $ns, $uqType)
serializes the attributes for a complexType
serializeRPCParameters($operation, $direction, $parameters, $bindingType='soap')
serialize PHP values according to a WSDL message definition contrary to the method name,...
addElement($attrs)
adds an element to the WSDL types
getTypeDef($type, $ns)
returns an array of information about a given type returns false if no type exists by the given name
getOperations($bindingType='soap')
returns an assoc array of operation names => operation data
setCredentials($username, $password, $authtype='basic', $certRequest=array())
if authenticating, set user credentials here
getOperationData($operation, $bindingType='soap')
returns an associative array of data necessary for calling an operation
serializeParameters($operation, $direction, $parameters)
serialize a PHP value according to a WSDL message definition
fetchWSDL($wsdl)
fetches the WSDL document and parses it
addSimpleType($name, $restrictionBase='', $typeClass='simpleType', $phpType='scalar', $enumeration=array())
adds an XML Schema simple type to the WSDL types
serialize($debug=0)
serialize the parsed wsdl
getOperationDataForSoapAction($soapAction, $bindingType='soap')
returns an associative array of data necessary for calling an operation
webDescription()
prints html description of services
serializeType($name, $type, $value, $use='encoded', $encodingStyle=false, $unqualified=false)
serializes a PHP value according a given type definition
parseWSDL($wsdl='')
parses the wsdl document
parametersMatchWrapped($type, &$parameters)
determine whether a set of parameters are unwrapped when they are expect to be wrapped,...
start_element($parser, $name, $attrs)
start-element handler
end_element($parser, $name)
end-element handler
serializeComplexTypeElements($typeDef, $value, $ns, $uqType, $use='encoded', $encodingStyle=false)
serializes the elements for a complexType
__construct($wsdl='', $proxyhost=false, $proxyport=false, $proxyusername=false, $proxypassword=false, $timeout=0, $response_timeout=30, $curl_options=null, $use_curl=false)
constructor
addComplexType($name, $typeClass='complexType', $phpType='array', $compositor='', $restrictionBase='', $elements=array(), $attrs=array(), $arrayType='')
adds an XML Schema complex type to the WSDL types
addOperation($name, $in=false, $out=false, $namespace=false, $soapaction=false, $style='rpc', $use='encoded', $documentation='', $encodingStyle='')
register an operation with the server
if($err=$client->getError()) $namespace
if(! $DIC->user() ->getId()||!ilLTIConsumerAccess::hasCustomProviderCreationAccess()) $params
if(empty($path)) $serviceName
if($clientAssertionType !='urn:ietf:params:oauth:client-assertion-type:jwt-bearer'|| $grantType !='client_credentials') $parts
if(count($parts) !=3) $payload
__construct(Container $dic, ilPlugin $plugin)
@inheritDoc
Interface Observer \BackgroundTasks Contains several chained tasks and infos about them.
$a
thx to https://mlocati.github.io/php-cs-fixer-configurator for the examples
catch(\Exception $e) $req
usleepWindows($usec)
sleeps some number of microseconds
iso8601_to_timestamp($datestr)
convert ISO 8601 compliant date string to unix timestamp
timestamp_to_iso8601($timestamp, $utc=true)
convert unix timestamp to ISO 8601 compliant date string