For backwards compatiblity, define soapclient unless the PHP SOAP extension is loaded.
971{
972 $start = gettimeofday();
973
974 do {
975 $stop = gettimeofday();
976 $timePassed = 1000000 * ($stop['sec'] - $start['sec'])
977 + $stop['usec'] - $start['usec'];
978 } while ($timePassed < $usec);
979}
980
981?><?php
982
983
984
994{
1019
1029 {
1035 }
1036
1044 {
1045 $ns_string = '';
1046 foreach ($this->namespaces as $k => $v) {
1047 $ns_string .= "\n xmlns:$k=\"$v\"";
1048 }
1049 $return_msg =
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" .
1052 '<SOAP-ENV:Body>' .
1053 '<SOAP-ENV:Fault>' .
1058 '</SOAP-ENV:Fault>' .
1059 '</SOAP-ENV:Body>' .
1060 '</SOAP-ENV:Envelope>';
1061 return $return_msg;
1062 }
1063}
1064
1069{
1070}
1071
1072?><?php
1073
1074
1075
1086{
1087
1090
1092
1095
1106
1108
1115
1125 {
1127 $this->
debug(
'nusoap_xmlschema class instantiated, inside constructor');
1128
1131
1132
1134 $this->namespaces = array_merge($this->namespaces,
$namespaces);
1135
1136
1138 $this->
debug(
'initial schema file: ' . $schema);
1140 }
1141
1142
1144 $this->
debug(
'initial xml file: ' .
$xml);
1146 }
1147 }
1148
1158 {
1159
1161 $xmlStr = @join(
"", @file(
$xml));
1162 if ($xmlStr == "") {
1163 $msg =
'Error reading XML from ' .
$xml;
1166 return false;
1167 } else {
1168 $this->
debug(
"parsing $xml");
1170 $this->
debug(
"done parsing $xml");
1171 return true;
1172 }
1173 }
1174 return false;
1175 }
1176
1185 {
1186
1188
1189 $this->parser = xml_parser_create();
1190
1191 xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, 0);
1192
1193
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(...));
1200 }
1201
1202
1203 if (!xml_parse($this->parser,
$xml,
true)) {
1204
1205 $errstr = sprintf(
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))
1209 );
1210 $this->
debug($errstr);
1213 }
1214
1215 xml_parser_free($this->parser);
1216 } else {
1217 $this->
debug(
'no xml passed to parseString()!!');
1218 $this->
setError(
'no xml passed to parseString()!!');
1219 }
1220 }
1221
1230 {
1232 for ($i = 0; $i < count($this->complexTypeStack); $i++) {
1233 $scope .= $this->complexTypeStack[$i] .
'_';
1234 }
1235 return $scope . $ename .
'_ContainedType';
1236 }
1237
1247 {
1248
1249
1250 $pos = $this->position++;
1252
1253 $this->depth_array[
$depth] = $pos;
1254 $this->message[$pos] = array('cdata' => '');
1256 $this->defaultNamespace[$pos] = $this->defaultNamespace[$this->depth_array[
$depth - 1]];
1257 } else {
1258 $this->defaultNamespace[$pos] = false;
1259 }
1260
1261
1262 if ($prefix = $this->
getPrefix($name)) {
1263
1265 } else {
1266 $prefix = '';
1267 }
1268
1269
1270 if (count($attrs) > 0) {
1271 foreach ($attrs as $k => $v) {
1272
1273 if (preg_match('/^xmlns/', $k)) {
1274
1275
1276 if ($ns_prefix = substr(strrchr($k, ':'), 1)) {
1277
1278 $this->namespaces[$ns_prefix] = $v;
1279 } else {
1280 $this->defaultNamespace[$pos] = $v;
1282 $this->namespaces['ns' . (count($this->namespaces) + 1)] = $v;
1283 }
1284 }
1285 if ($v == 'http://www.w3.org/2001/XMLSchema' || $v == 'http://www.w3.org/1999/XMLSchema' || $v == 'http://www.w3.org/2000/10/XMLSchema') {
1286 $this->XMLSchemaVersion = $v;
1287 $this->namespaces['xsi'] = $v . '-instance';
1288 }
1289 }
1290 }
1291 foreach ($attrs as $k => $v) {
1292
1293 $k = strpos($k,
':') ? $this->
expandQname($k) : $k;
1294 $v = strpos($v,
':') ? $this->
expandQname($v) : $v;
1295 $eAttrs[$k] = $v;
1296 }
1297 $attrs = $eAttrs;
1298 } else {
1299 $attrs = array();
1300 }
1301
1302 switch ($name) {
1303 case 'all':
1304 case 'choice':
1305 case 'group':
1306 case 'sequence':
1307
1309
1310
1311
1312 break;
1313 case 'attribute':
1314
1315 $this->
xdebug(
"parsing attribute:");
1317 if (!isset($attrs['form'])) {
1318 $attrs['form'] = $this->schemaInfo['attributeFormDefault'];
1319 }
1320 if (isset($attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'])) {
1321 $v = $attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'];
1322 if (!strpos($v, ':')) {
1323
1324 if ($this->defaultNamespace[$pos]) {
1325
1326 $attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'] = $this->defaultNamespace[$pos] . ':' . $attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'];
1327 }
1328 }
1329 }
1330 if (isset($attrs['name'])) {
1331 $this->attributes[$attrs['name']] = $attrs;
1332 $aname = $attrs['name'];
1333 } elseif (isset($attrs['ref']) && $attrs['ref'] == 'http://schemas.xmlsoap.org/soap/encoding/:arrayType') {
1334 if (isset($attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'])) {
1335 $aname = $attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'];
1336 } else {
1337 $aname = '';
1338 }
1339 } elseif (isset($attrs['ref'])) {
1340 $aname = $attrs['ref'];
1341 $this->attributes[$attrs['ref']] = $attrs;
1342 }
1343
1344 if ($this->currentComplexType) {
1346 }
1347
1348 if (isset($attrs[
'http://schemas.xmlsoap.org/wsdl/:arrayType']) || $this->
getLocalPart($aname) ==
'arrayType') {
1351 if (isset($attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'])) {
1352 $v = $attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'];
1353 } else {
1354 $v = '';
1355 }
1356 if (strpos($v, '[,]')) {
1358 }
1359 $v = substr($v, 0, strpos($v, '['));
1360 if (!strpos($v, ':') && isset($this->typemap[$this->XMLSchemaVersion][$v])) {
1361 $v = $this->XMLSchemaVersion . ':' . $v;
1362 }
1364 }
1365 break;
1366 case 'complexContent':
1367 break;
1368 case 'complexType':
1369 array_push($this->complexTypeStack, $this->currentComplexType);
1370 if (isset($attrs['name'])) {
1371
1372
1373 $this->
xdebug(
'processing named complexType ' . $attrs[
'name']);
1374
1375 $this->currentComplexType = $attrs['name'];
1378
1379
1380
1381
1382
1383
1384
1385 if (isset($attrs['base']) && preg_match('/:Array$/', $attrs['base'])) {
1386 $this->
xdebug(
'complexType is unusual array');
1388 } else {
1390 }
1391 } else {
1393 $this->
xdebug(
'processing unnamed complexType for element ' . $this->currentElement .
' named ' . $name);
1394 $this->currentComplexType = $name;
1395
1398
1399
1400
1401
1402
1403
1404
1405 if (isset($attrs['base']) && preg_match('/:Array$/', $attrs['base'])) {
1406 $this->
xdebug(
'complexType is unusual array');
1408 } else {
1410 }
1411 }
1412 break;
1413 case 'element':
1414 array_push($this->elementStack, $this->currentElement);
1415 if (!isset($attrs['form'])) {
1416 $attrs['form'] = $this->schemaInfo['elementFormDefault'];
1417 }
1418 if (isset($attrs['type'])) {
1419 $this->
xdebug(
"processing typed element " . $attrs[
'name'] .
" of type " . $attrs[
'type']);
1420 if (! $this->
getPrefix($attrs[
'type'])) {
1421 if ($this->defaultNamespace[$pos]) {
1422 $attrs['type'] = $this->defaultNamespace[$pos] . ':' . $attrs['type'];
1423 $this->
xdebug(
'used default namespace to make type ' . $attrs[
'type']);
1424 }
1425 }
1426
1427
1428
1429
1430
1431
1432
1433 if ($this->currentComplexType && $this->complexTypes[$this->currentComplexType]['phpType'] == 'array') {
1434 $this->
xdebug(
'arrayType for unusual array is ' . $attrs[
'type']);
1436 }
1437 $this->currentElement = $attrs['name'];
1438 $ename = $attrs['name'];
1439 } elseif (isset($attrs['ref'])) {
1440 $this->
xdebug(
"processing element as ref to " . $attrs[
'ref']);
1441 $this->currentElement = "ref to " . $attrs['ref'];
1443 } else {
1444 $type = $this->
CreateTypeName($this->currentComplexType .
'_' . $attrs[
'name']);
1445 $this->
xdebug(
"processing untyped element " . $attrs[
'name'] .
' type ' . $type);
1446 $this->currentElement = $attrs['name'];
1447 $attrs['type'] = $this->schemaTargetNamespace . ':' . $type;
1448 $ename = $attrs['name'];
1449 }
1450 if (isset($ename) && $this->currentComplexType) {
1451 $this->
xdebug(
"add element $ename to complexType $this->currentComplexType");
1453 } elseif (!isset($attrs['ref'])) {
1454 $this->
xdebug(
"add element $ename to elements array");
1455 $this->elements[ $attrs['name'] ] = $attrs;
1456 $this->elements[ $attrs['name'] ]['typeClass'] = 'element';
1457 }
1458 break;
1459 case 'enumeration':
1460 $this->
xdebug(
'enumeration ' . $attrs[
'value']);
1461 if ($this->currentSimpleType) {
1463 } elseif ($this->currentComplexType) {
1465 }
1466 break;
1467 case 'extension':
1468 $this->
xdebug(
'extension ' . $attrs[
'base']);
1469 if ($this->currentComplexType) {
1471 }
1472 break;
1473 case 'import':
1474 if (isset($attrs['schemaLocation'])) {
1475
1476 $this->imports[$attrs['namespace']][] = array('location' => $attrs['schemaLocation'], 'loaded' => false);
1477 } else {
1478
1479 $this->imports[$attrs['namespace']][] = array('location' => '', 'loaded' => true);
1481 $this->namespaces['ns' . (count($this->namespaces) + 1)] = $attrs['namespace'];
1482 }
1483 }
1484 break;
1485 case 'list':
1486 break;
1487 case 'restriction':
1488 $this->
xdebug(
'restriction ' . $attrs[
'base']);
1489 if ($this->currentSimpleType) {
1491 } elseif ($this->currentComplexType) {
1493 if (strstr($attrs['base'], ':') == ':Array') {
1495 }
1496 }
1497 break;
1498 case 'schema':
1499 $this->schemaInfo = $attrs;
1501 if (isset($attrs['targetNamespace'])) {
1502 $this->schemaTargetNamespace = $attrs['targetNamespace'];
1503 }
1504 if (!isset($attrs['elementFormDefault'])) {
1505 $this->schemaInfo['elementFormDefault'] = 'unqualified';
1506 }
1507 if (!isset($attrs['attributeFormDefault'])) {
1508 $this->schemaInfo['attributeFormDefault'] = 'unqualified';
1509 }
1510 break;
1511 case 'simpleContent':
1512 break;
1513 case 'simpleType':
1514 array_push($this->simpleTypeStack, $this->currentSimpleType);
1515 if (isset($attrs['name'])) {
1516 $this->
xdebug(
"processing simpleType for name " . $attrs[
'name']);
1517 $this->currentSimpleType = $attrs['name'];
1518 $this->simpleTypes[ $attrs['name'] ] = $attrs;
1519 $this->simpleTypes[ $attrs['name'] ]['typeClass'] = 'simpleType';
1520 $this->simpleTypes[ $attrs['name'] ]['phpType'] = 'scalar';
1521 } else {
1522 $name = $this->
CreateTypeName($this->currentComplexType .
'_' . $this->currentElement);
1523 $this->
xdebug(
'processing unnamed simpleType for element ' . $this->currentElement .
' named ' . $name);
1524 $this->currentSimpleType = $name;
1525
1528 }
1529 break;
1530 case 'union':
1531 break;
1532 default:
1533
1534 }
1535 }
1536
1545 {
1546
1547 $this->depth--;
1548
1549 if (isset($this->depth_array[$this->depth])) {
1551 }
1552
1553 if ($prefix = $this->
getPrefix($name)) {
1554
1556 } else {
1557 $prefix = '';
1558 }
1559
1560 if ($name == 'complexType') {
1561 $this->
xdebug(
'done processing complexType ' . ($this->currentComplexType ? $this->currentComplexType :
'(unknown)'));
1562 $this->currentComplexType = array_pop($this->complexTypeStack);
1563
1564 }
1565 if ($name == 'element') {
1566 $this->
xdebug(
'done processing element ' . ($this->currentElement ? $this->currentElement :
'(unknown)'));
1567 $this->currentElement = array_pop($this->elementStack);
1568 }
1569 if ($name == 'simpleType') {
1570 $this->
xdebug(
'done processing simpleType ' . ($this->currentSimpleType ? $this->currentSimpleType :
'(unknown)'));
1571 $this->currentSimpleType = array_pop($this->simpleTypeStack);
1572 }
1573 }
1574
1583 {
1584 $pos = $this->depth_array[$this->depth - 1];
1585 $this->message[$pos][
'cdata'] .=
$data;
1586 }
1587
1594 {
1597
1598 if (sizeof($this->imports) > 0) {
1599 foreach ($this->imports as $ns => $list) {
1600 foreach ($list as $ii) {
1601 if ($ii['location'] != '') {
1602 $xml .=
" <$schemaPrefix:import location=\"" . $ii[
'location'] .
'" namespace="' . $ns .
"\" />\n";
1603 } else {
1604 $xml .=
" <$schemaPrefix:import namespace=\"" . $ns .
"\" />\n";
1605 }
1606 }
1607 }
1608 }
1609
1610 foreach ($this->complexTypes as $typeName => $attrs) {
1611 $contentStr = '';
1612
1613 if (isset($attrs['elements']) && (count($attrs['elements']) > 0)) {
1614 foreach ($attrs['elements'] as $element => $eParts) {
1615 if (isset($eParts['ref'])) {
1616 $contentStr .= " <$schemaPrefix:element ref=\"$element\"/>\n";
1617 } else {
1618 $contentStr .= " <$schemaPrefix:element name=\"$element\" type=\"" . $this->contractQName($eParts['type']) . "\"";
1619 foreach ($eParts as $aName => $aValue) {
1620
1621 if ($aName != 'name' && $aName != 'type') {
1622 $contentStr .= " $aName=\"$aValue\"";
1623 }
1624 }
1625 $contentStr .= "/>\n";
1626 }
1627 }
1628
1629 if (isset($attrs['compositor']) && ($attrs['compositor'] != '')) {
1630 $contentStr = " <$schemaPrefix:$attrs[compositor]>\n" . $contentStr . " </$schemaPrefix:$attrs[compositor]>\n";
1631 }
1632 }
1633
1634 if (isset($attrs['attrs']) && (count($attrs['attrs']) >= 1)) {
1635 foreach ($attrs['attrs'] as $attr => $aParts) {
1636 $contentStr .= " <$schemaPrefix:attribute";
1637 foreach ($aParts as
$a => $v) {
1638 if (
$a ==
'ref' ||
$a ==
'type') {
1639 $contentStr .= " $a=\"" . $this->contractQName($v) . '"';
1640 } elseif (
$a ==
'http://schemas.xmlsoap.org/wsdl/:arrayType') {
1641 $this->usedNamespaces['wsdl'] = $this->namespaces['wsdl'];
1642 $contentStr .= ' wsdl:arrayType="' . $this->contractQName($v) . '"';
1643 } else {
1644 $contentStr .= " $a=\"$v\"";
1645 }
1646 }
1647 $contentStr .= "/>\n";
1648 }
1649 }
1650
1651 if (isset($attrs['restrictionBase']) && $attrs['restrictionBase'] != '') {
1652 $contentStr = " <$schemaPrefix:restriction base=\"" . $this->contractQName($attrs['restrictionBase']) . "\">\n" . $contentStr . " </$schemaPrefix:restriction>\n";
1653
1654 if ((isset($attrs['elements']) && count($attrs['elements']) > 0) || (isset($attrs['attrs']) && count($attrs['attrs']) > 0)) {
1655 $contentStr = " <$schemaPrefix:complexContent>\n" . $contentStr . " </$schemaPrefix:complexContent>\n";
1656 }
1657 }
1658
1659 if ($contentStr != '') {
1660 $contentStr = " <$schemaPrefix:complexType name=\"$typeName\">\n" . $contentStr . " </$schemaPrefix:complexType>\n";
1661 } else {
1662 $contentStr = " <$schemaPrefix:complexType name=\"$typeName\"/>\n";
1663 }
1664 $xml .= $contentStr;
1665 }
1666
1667 if (isset($this->simpleTypes) && count($this->simpleTypes) > 0) {
1668 foreach ($this->simpleTypes as $typeName => $eParts) {
1669 $xml .=
" <$schemaPrefix:simpleType name=\"$typeName\">\n <$schemaPrefix:restriction base=\"" . $this->contractQName($eParts[
'type']) .
"\">\n";
1670 if (isset($eParts['enumeration'])) {
1671 foreach ($eParts[
'enumeration'] as
$e) {
1672 $xml .=
" <$schemaPrefix:enumeration value=\"$e\"/>\n";
1673 }
1674 }
1675 $xml .=
" </$schemaPrefix:restriction>\n </$schemaPrefix:simpleType>";
1676 }
1677 }
1678
1679 if (isset($this->elements) && count($this->elements) > 0) {
1680 foreach ($this->elements as $element => $eParts) {
1681 $xml .=
" <$schemaPrefix:element name=\"$element\" type=\"" . $this->contractQName($eParts[
'type']) .
"\"/>\n";
1682 }
1683 }
1684
1685 if (isset($this->attributes) && count($this->attributes) > 0) {
1686 foreach ($this->attributes as $attr => $aParts) {
1687 $xml .=
" <$schemaPrefix:attribute name=\"$attr\" type=\"" . $this->contractQName($aParts[
'type']) .
"\"\n/>";
1688 }
1689 }
1690
1691 $attr = '';
1692 foreach ($this->schemaInfo as $k => $v) {
1693 if ($k == 'elementFormDefault' || $k == 'attributeFormDefault') {
1694 $attr .= " $k=\"$v\"";
1695 }
1696 }
1697 $el = "<$schemaPrefix:schema$attr targetNamespace=\"$this->schemaTargetNamespace\"\n";
1698 foreach (array_diff($this->usedNamespaces, $this->enclosingNamespaces) as $nsp => $ns) {
1699 $el .= " xmlns:$nsp=\"$ns\"";
1700 }
1701 $xml = $el .
">\n" .
$xml .
"</$schemaPrefix:schema>\n";
1703 }
1704
1711 public function xdebug($string)
1712 {
1713 $this->
debug(
'<' . $this->schemaTargetNamespace .
'> ' . $string);
1714 }
1715
1729 {
1730 if (isset($this->typemap[$ns][$type])) {
1731
1732 return $this->typemap[$ns][$type];
1733 } elseif (isset($this->complexTypes[$type])) {
1734
1735 return $this->complexTypes[$type]['phpType'];
1736 }
1737 return false;
1738 }
1739
1763 {
1764
1765 if (substr($type, -1) == '^') {
1766 $is_element = 1;
1767 $type = substr($type, 0, -1);
1768 } else {
1769 $is_element = 0;
1770 }
1771
1772 if ((! $is_element) && isset($this->complexTypes[$type])) {
1773 $this->
xdebug(
"in getTypeDef, found complexType $type");
1774 return $this->complexTypes[$type];
1775 } elseif ((! $is_element) && isset($this->simpleTypes[$type])) {
1776 $this->
xdebug(
"in getTypeDef, found simpleType $type");
1777 if (!isset($this->simpleTypes[$type]['phpType'])) {
1778
1779
1780 $uqType = substr($this->simpleTypes[$type]['type'], strrpos($this->simpleTypes[$type]['type'], ':') + 1);
1781 $ns = substr($this->simpleTypes[$type]['type'], 0, strrpos($this->simpleTypes[$type]['type'], ':'));
1783 if ($etype) {
1784 $this->
xdebug(
"in getTypeDef, found type for simpleType $type:");
1786 if (isset($etype['phpType'])) {
1787 $this->simpleTypes[$type]['phpType'] = $etype['phpType'];
1788 }
1789 if (isset($etype['elements'])) {
1790 $this->simpleTypes[$type]['elements'] = $etype['elements'];
1791 }
1792 }
1793 }
1794 return $this->simpleTypes[$type];
1795 } elseif (isset($this->elements[$type])) {
1796 $this->
xdebug(
"in getTypeDef, found element $type");
1797 if (!isset($this->elements[$type]['phpType'])) {
1798
1799 $uqType = substr($this->elements[$type]['type'], strrpos($this->elements[$type]['type'], ':') + 1);
1800 $ns = substr($this->elements[$type]['type'], 0, strrpos($this->elements[$type]['type'], ':'));
1802 if ($etype) {
1803 $this->
xdebug(
"in getTypeDef, found type for element $type:");
1805 if (isset($etype['phpType'])) {
1806 $this->elements[$type]['phpType'] = $etype['phpType'];
1807 }
1808 if (isset($etype['elements'])) {
1809 $this->elements[$type]['elements'] = $etype['elements'];
1810 }
1811 } elseif ($ns == 'http://www.w3.org/2001/XMLSchema') {
1812 $this->
xdebug(
"in getTypeDef, element $type is an XSD type");
1813 $this->elements[$type]['phpType'] = 'scalar';
1814 }
1815 }
1816 return $this->elements[$type];
1817 } elseif (isset($this->attributes[$type])) {
1818 $this->
xdebug(
"in getTypeDef, found attribute $type");
1819 return $this->attributes[$type];
1820 } elseif (preg_match('/_ContainedType$/', $type)) {
1821 $this->
xdebug(
"in getTypeDef, have an untyped element $type");
1822 $typeDef['typeClass'] = 'simpleType';
1823 $typeDef['phpType'] = 'scalar';
1824 $typeDef['type'] = 'http://www.w3.org/2001/XMLSchema:string';
1825 return $typeDef;
1826 }
1827 $this->
xdebug(
"in getTypeDef, did not find $type");
1828 return false;
1829 }
1830
1840 {
1841
1843 $str .= '<' . $type;
1844 if (is_array($typeDef['attrs'])) {
1845 foreach ($typeDef[
'attrs'] as $attName =>
$data) {
1846 $str .=
" $attName=\"{type = " .
$data[
'type'] .
"}\"";
1847 }
1848 }
1849 $str .= " xmlns=\"" . $this->schema['targetNamespace'] . "\"";
1850 if (count($typeDef['elements']) > 0) {
1851 $str .= ">";
1852 foreach ($typeDef['elements'] as $element => $eData) {
1854 }
1855 $str .= "</$type>";
1856 } elseif ($typeDef['typeClass'] == 'element') {
1857 $str .= "></$type>";
1858 } else {
1859 $str .= "/>";
1860 }
1861 return $str;
1862 }
1863 return false;
1864 }
1865
1877 {
1878
1880
1881 if ($typeDef['phpType'] == 'struct') {
1882 $buffer .= '<table>';
1883 foreach ($typeDef['elements'] as $child => $childDef) {
1884 $buffer .= "
1885 <tr><td align='right'>$childDef[name] (type: " . $this->
getLocalPart($childDef[
'type']) .
"):</td>
1886 <td><input type='text' name='parameters[" . $name . "][$childDef[name]]'></td></tr>";
1887 }
1888 $buffer .= '</table>';
1889
1890 } elseif ($typeDef['phpType'] == 'array') {
1891 $buffer .= '<table>';
1892 for ($i = 0;$i < 3; $i++) {
1893 $buffer .= "
1894 <tr><td align='right'>array item (type: $typeDef[arrayType]):</td>
1895 <td><input type='text' name='parameters[" . $name . "][]'></td></tr>";
1896 }
1897 $buffer .= '</table>';
1898
1899 } else {
1900 $buffer .= "<input type='text' name='parameters[$name]'>";
1901 }
1902 } else {
1903 $buffer .= "<input type='text' name='parameters[$name]'>";
1904 }
1905 return $buffer;
1906 }
1907
1949 public function addComplexType($name, $typeClass =
'complexType', $phpType =
'array', $compositor =
'', $restrictionBase =
'',
$elements = array(), $attrs = array(), $arrayType =
'')
1950 {
1951 $this->complexTypes[$name] = array(
1952 'name' => $name,
1953 'typeClass' => $typeClass,
1954 'phpType' => $phpType,
1955 'compositor' => $compositor,
1956 'restrictionBase' => $restrictionBase,
1958 'attrs' => $attrs,
1959 'arrayType' => $arrayType
1960 );
1961
1962 $this->
xdebug(
"addComplexType $name:");
1964 }
1965
1978 public function addSimpleType($name, $restrictionBase =
'', $typeClass =
'simpleType', $phpType =
'scalar', $enumeration = array())
1979 {
1980 $this->simpleTypes[$name] = array(
1981 'name' => $name,
1982 'typeClass' => $typeClass,
1983 'phpType' => $phpType,
1984 'type' => $restrictionBase,
1985 'enumeration' => $enumeration
1986 );
1987
1988 $this->
xdebug(
"addSimpleType $name:");
1990 }
1991
2000 {
2001 if (! $this->
getPrefix($attrs[
'type'])) {
2002 $attrs['type'] = $this->schemaTargetNamespace . ':' . $attrs['type'];
2003 }
2004 $this->elements[ $attrs['name'] ] = $attrs;
2005 $this->elements[ $attrs['name'] ]['typeClass'] = 'element';
2006
2007 $this->
xdebug(
"addElement " . $attrs[
'name']);
2009 }
2010}
2011
2016{
2017}
2018
2019?><?php
2020
2021
2022
2035{
2078
2091 {
2093 $this->name =
$name;
2094 $this->type =
$type;
2099 }
2100
2108 public function serialize($use =
'encoded')
2109 {
2110 return $this->
serialize_val($this->value, $this->name, $this->type, $this->element_ns, $this->type_ns, $this->attributes, $use,
true);
2111 }
2112
2120 {
2122 }
2123}
2124
2125
2126
2127?><?php
2128
2129
2130
2141{
2171
2172
2173
2174
2175
2176
2177
2178
2188 {
2190 $this->
debug(
"ctor url=$url use_curl=$use_curl curl_options:");
2193 if (is_array($curl_options)) {
2194 $this->ch_options = $curl_options;
2195 }
2197 preg_match('/\$Revisio' . 'n: ([^ ]+)/', $this->revision, $rev);
2198
2199 $this->
setHeader(
'User-Agent', $this->title .
'/' . $this->version .
' (' . ($rev[1] ??
'1.1') .
')');
2200 }
2201
2210 {
2211 $this->
debug(
"setCurlOption option=$option, value=");
2213 curl_setopt($this->ch, $option, $value);
2214 }
2215
2223 public function setHeader($name, $value)
2224 {
2225 $this->outgoing_headers[$name] = $value;
2226 $this->
debug(
"set header $name: $value");
2227 }
2228
2236 {
2237 if (isset($this->outgoing_headers[$name])) {
2238 $this->
debug(
"unset header $name");
2239 unset($this->outgoing_headers[$name]);
2240 }
2241 }
2242
2250 {
2252
2253 $u = parse_url(
$url);
2254 foreach ($u as $k => $v) {
2255 $this->
debug(
"parsed URL $k = $v");
2256 $this->$k = $v;
2257 }
2258
2259
2260 if (isset($u['query']) && $u['query'] != '') {
2261 $this->path .= '?' . $u['query'];
2262 }
2263
2264
2265 if (!isset($u['port'])) {
2266 if ($u['scheme'] == 'https') {
2267 $this->port = 443;
2268 } else {
2269 $this->port = 80;
2270 }
2271 }
2272
2275
2276
2277 if (!isset($u['port'])) {
2279 } else {
2280 $this->
setHeader(
'Host', $this->host .
':' . $this->port);
2281 }
2282
2283 if (isset($u['user']) && $u['user'] != '') {
2284 $this->
setCredentials(urldecode($u[
'user']), isset($u[
'pass']) ? urldecode($u[
'pass']) :
'');
2285 }
2286 }
2287
2295 {
2296 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 return 'curl';
2298 }
2299 if (($this->scheme == 'http' || $this->scheme == 'ssl') && $this->authtype != 'ntlm' && (!is_array($this->proxy) || $this->proxy['authtype'] != 'ntlm')) {
2300 return 'socket';
2301 }
2302 return 'unknown';
2303 }
2304
2313 public function connect($connection_timeout = 0, $response_timeout = 30)
2314 {
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327 $this->
debug(
"connect connection_timeout $connection_timeout, response_timeout $response_timeout, scheme $this->scheme, host $this->host, port $this->port");
2329 if (!is_array($this->proxy)) {
2332 } else {
2333 $host = $this->proxy[
'host'];
2334 $port = $this->proxy[
'port'];
2335 }
2336
2337
2338 if ($this->persistentConnection && isset($this->fp) && is_resource($this->fp)) {
2339 if (!feof($this->fp)) {
2340 $this->
debug(
'Re-use persistent connection');
2341 return true;
2342 }
2343 fclose($this->fp);
2344 $this->
debug(
'Closed persistent connection at EOF');
2345 }
2346
2347
2348 if ($this->scheme == 'ssl') {
2350 }
2351 $this->
debug(
'calling fsockopen with host ' .
$host .
' connection_timeout ' . $connection_timeout);
2352
2353
2354 if ($connection_timeout > 0) {
2355 $this->fp = @fsockopen(
$host, $this->port, $this->errno, $this->error_str, $connection_timeout);
2356 } else {
2357 $this->fp = @fsockopen(
$host, $this->port, $this->errno, $this->error_str);
2358 }
2359
2360
2361 if (!$this->fp) {
2362 $msg =
'Couldn\'t open socket connection to server ' .
$this->url;
2363 if ($this->errno) {
2365 } else {
2366 $msg .= ' prior to connect(). This is often a problem looking up the host name.';
2367 }
2370 return false;
2371 }
2372
2373
2374 $this->
debug(
'set response timeout to ' . $response_timeout);
2375 socket_set_timeout($this->fp, $response_timeout);
2376
2377 $this->
debug(
'socket connected');
2378 return true;
2379 } elseif ($this->
io_method() ==
'curl') {
2380 if (!extension_loaded('curl')) {
2381
2382 $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.');
2383 return false;
2384 }
2385
2386 if (defined('CURLOPT_CONNECTIONTIMEOUT')) {
2387 $CURLOPT_CONNECTIONTIMEOUT = CURLOPT_CONNECTIONTIMEOUT;
2388 } else {
2389 $CURLOPT_CONNECTIONTIMEOUT = 78;
2390 }
2391 if (defined('CURLOPT_HTTPAUTH')) {
2392 $CURLOPT_HTTPAUTH = CURLOPT_HTTPAUTH;
2393 } else {
2394 $CURLOPT_HTTPAUTH = 107;
2395 }
2396 if (defined('CURLOPT_PROXYAUTH')) {
2397 $CURLOPT_PROXYAUTH = CURLOPT_PROXYAUTH;
2398 } else {
2399 $CURLOPT_PROXYAUTH = 111;
2400 }
2401 if (defined('CURLAUTH_BASIC')) {
2402 $CURLAUTH_BASIC = CURLAUTH_BASIC;
2403 } else {
2404 $CURLAUTH_BASIC = 1;
2405 }
2406 if (defined('CURLAUTH_DIGEST')) {
2407 $CURLAUTH_DIGEST = CURLAUTH_DIGEST;
2408 } else {
2409 $CURLAUTH_DIGEST = 2;
2410 }
2411 if (defined('CURLAUTH_NTLM')) {
2412 $CURLAUTH_NTLM = CURLAUTH_NTLM;
2413 } else {
2414 $CURLAUTH_NTLM = 8;
2415 }
2416
2417 $this->
debug(
'connect using cURL');
2418
2419 $this->ch = curl_init();
2420
2421 $hostURL = ($this->port != '') ? "$this->scheme://$this->host:$this->port" : "$this->scheme://$this->host";
2422
2425
2426 if (ini_get('safe_mode') || ini_get('open_basedir')) {
2427 $this->
debug(
'safe_mode or open_basedir set, so do not set CURLOPT_FOLLOWLOCATION');
2428 $this->
debug(
'safe_mode = ');
2430 $this->
debug(
'open_basedir = ');
2432 } else {
2434 }
2435
2437
2439
2440
2441
2442
2443
2444
2445 if ($this->persistentConnection) {
2446
2447
2448
2449
2450
2451 $this->persistentConnection = false;
2452 $this->
setHeader(
'Connection',
'close');
2453 }
2454
2455 if ($connection_timeout != 0) {
2456 $this->
setCurlOption($CURLOPT_CONNECTIONTIMEOUT, $connection_timeout);
2457 }
2458 if ($response_timeout != 0) {
2460 }
2461
2462 if ($this->scheme == 'https') {
2463 $this->
debug(
'set cURL SSL verify options');
2464
2465
2466
2467
2470
2471
2472 if ($this->authtype == 'certificate') {
2473 $this->
debug(
'set cURL certificate options');
2474 if (isset($this->certRequest['cainfofile'])) {
2475 $this->
setCurlOption(CURLOPT_CAINFO, $this->certRequest[
'cainfofile']);
2476 }
2477 if (isset($this->certRequest['verifypeer'])) {
2478 $this->
setCurlOption(CURLOPT_SSL_VERIFYPEER, $this->certRequest[
'verifypeer']);
2479 } else {
2481 }
2482 if (isset($this->certRequest['verifyhost'])) {
2483 $this->
setCurlOption(CURLOPT_SSL_VERIFYHOST, $this->certRequest[
'verifyhost']);
2484 } else {
2486 }
2487 if (isset($this->certRequest['sslcertfile'])) {
2488 $this->
setCurlOption(CURLOPT_SSLCERT, $this->certRequest[
'sslcertfile']);
2489 }
2490 if (isset($this->certRequest['sslkeyfile'])) {
2491 $this->
setCurlOption(CURLOPT_SSLKEY, $this->certRequest[
'sslkeyfile']);
2492 }
2493 if (isset($this->certRequest['passphrase'])) {
2494 $this->
setCurlOption(CURLOPT_SSLKEYPASSWD, $this->certRequest[
'passphrase']);
2495 }
2496 if (isset($this->certRequest['certpassword'])) {
2497 $this->
setCurlOption(CURLOPT_SSLCERTPASSWD, $this->certRequest[
'certpassword']);
2498 }
2499 }
2500 }
2501 if ($this->authtype && ($this->authtype != 'certificate')) {
2502 if ($this->username) {
2503 $this->
debug(
'set cURL username/password');
2504 $this->
setCurlOption(CURLOPT_USERPWD,
"$this->username:$this->password");
2505 }
2506 if ($this->authtype == 'basic') {
2507 $this->
debug(
'set cURL for Basic authentication');
2509 }
2510 if ($this->authtype == 'digest') {
2511 $this->
debug(
'set cURL for digest authentication');
2513 }
2514 if ($this->authtype == 'ntlm') {
2515 $this->
debug(
'set cURL for NTLM authentication');
2517 }
2518 }
2519 if (is_array($this->proxy)) {
2520 $this->
debug(
'set cURL proxy options');
2521 if ($this->proxy['port'] != '') {
2522 $this->
setCurlOption(CURLOPT_PROXY, $this->proxy[
'host'] .
':' . $this->proxy[
'port']);
2523 } else {
2525 }
2526 if ($this->proxy['username'] || $this->proxy['password']) {
2527 $this->
debug(
'set cURL proxy authentication options');
2528 $this->
setCurlOption(CURLOPT_PROXYUSERPWD, $this->proxy[
'username'] .
':' . $this->proxy[
'password']);
2529 if ($this->proxy['authtype'] == 'basic') {
2531 }
2532 if ($this->proxy['authtype'] == 'ntlm') {
2534 }
2535 }
2536 }
2537 $this->
debug(
'cURL connection set up');
2538 return true;
2539 } else {
2540 $this->
setError(
'Unknown scheme ' . $this->scheme);
2541 $this->
debug(
'Unknown scheme ' . $this->scheme);
2542 return false;
2543 }
2544 }
2545
2556 public function send(
$data, $timeout = 0, $response_timeout = 30, $cookies =
null)
2557 {
2558 $this->
debug(
'entered send() with data of length: ' . strlen(
$data));
2559
2560 $this->tryagain = true;
2561 $tries = 0;
2562 while ($this->tryagain) {
2563 $this->tryagain = false;
2564 if ($tries++ < 2) {
2565
2566 if (!$this->
connect($timeout, $response_timeout)) {
2567 return false;
2568 }
2569
2570
2572 return false;
2573 }
2574
2575
2577 } else {
2578 $this->
setError(
"Too many tries to get an OK response ($this->response_status_line)");
2579 }
2580 }
2581 $this->
debug(
'end of send()');
2582 return $respdata;
2583 }
2584
2585
2597 public function sendHTTPS(
$data, $timeout = 0, $response_timeout = 30, $cookies =
null)
2598 {
2599 return $this->
send(
$data, $timeout, $response_timeout, $cookies);
2600 }
2601
2613 {
2614 $this->
debug(
"setCredentials username=$username authtype=$authtype digestRequest=");
2616 $this->
debug(
"certRequest=");
2618
2624
2625
2626
2627
2629
2630
2631 $HA1 = md5($A1);
2632
2633
2635
2636
2637 $HA2 = md5($A2);
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650 $unhashedDigest = '';
2652 $cnonce = $nonce;
2654 $unhashedDigest = $HA1 .
':' . $nonce .
':' . sprintf(
"%08d",
$digestRequest[
'nc']) .
':' . $cnonce .
':' .
$digestRequest[
'qop'] .
':' . $HA2;
2655 } else {
2656 $unhashedDigest = $HA1 . ':' . $nonce . ':' . $HA2;
2657 }
2658
2659 $hashedDigest = md5($unhashedDigest);
2660
2661 $opaque = '';
2664 }
2665
2666 $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 .
'"');
2667 }
2670 $this->
debug(
'Authorization header not set for certificate');
2672
2673 $this->
debug(
'Authorization header not set for ntlm');
2674 }
2679 }
2680
2688 {
2689 $this->
setHeader(
'SOAPAction',
'"' . $soapaction .
'"');
2690 }
2691
2698 public function setEncoding($enc =
'gzip, deflate')
2699 {
2700 if (function_exists('gzdeflate')) {
2701 $this->protocol_version = '1.1';
2702 $this->
setHeader(
'Accept-Encoding', $enc);
2703 if (!isset($this->outgoing_headers['Connection'])) {
2704 $this->
setHeader(
'Connection',
'close');
2705 $this->persistentConnection = false;
2706 }
2707 #set_magic_quotes_runtime(0);
2708
2709 $this->encoding = $enc;
2710 }
2711 }
2712
2723 public function setProxy($proxyhost, $proxyport, $proxyusername =
'', $proxypassword =
'', $proxyauthtype =
'basic')
2724 {
2725 if ($proxyhost) {
2726 $this->proxy = array(
2727 'host' => $proxyhost,
2728 'port' => $proxyport,
2729 'username' => $proxyusername,
2730 'password' => $proxypassword,
2731 'authtype' => $proxyauthtype
2732 );
2733 if ($proxyusername != '' && $proxypassword != '' && $proxyauthtype = 'basic') {
2734 $this->
setHeader(
'Proxy-Authorization',
' Basic ' . base64_encode($proxyusername .
':' . $proxypassword));
2735 }
2736 } else {
2737 $this->
debug(
'remove proxy');
2740 }
2741 }
2742
2743
2753 {
2754 $skipHeaders = array( 'HTTP/1.1 100',
2755 'HTTP/1.0 301',
2756 'HTTP/1.1 301',
2757 'HTTP/1.0 302',
2758 'HTTP/1.1 302',
2759 'HTTP/1.0 401',
2760 'HTTP/1.1 401',
2761 'HTTP/1.0 200 Connection established');
2762 foreach ($skipHeaders as $hd) {
2763 $prefix = substr(
$data, 0, strlen($hd));
2764 if ($prefix == $hd) {
2765 return true;
2766 }
2767 }
2768
2769 return false;
2770 }
2771
2783 {
2784
2785 $length = 0;
2786 $new = '';
2787
2788
2789
2790 $chunkend = strpos($buffer, $lb);
2791 if ($chunkend == false) {
2792 $this->
debug(
'no linebreak found in decodeChunked');
2793 return $new;
2794 }
2795 $temp = substr($buffer, 0, $chunkend);
2796 $chunk_size = hexdec(trim($temp));
2797 $chunkstart = $chunkend + strlen($lb);
2798
2799 while ($chunk_size > 0) {
2800 $this->
debug(
"chunkstart: $chunkstart chunk_size: $chunk_size");
2801 $chunkend = strpos($buffer, $lb, $chunkstart + $chunk_size);
2802
2803
2804 if ($chunkend == false) {
2805 $chunk = substr($buffer, $chunkstart);
2806
2807 $new .= $chunk;
2808 $length += strlen($chunk);
2809 break;
2810 }
2811
2812
2813 $chunk = substr($buffer, $chunkstart, $chunkend - $chunkstart);
2814
2815 $new .= $chunk;
2816
2817 $length += strlen($chunk);
2818
2819 $chunkstart = $chunkend + strlen($lb);
2820
2821 $chunkend = strpos($buffer, $lb, $chunkstart) + strlen($lb);
2822 if ($chunkend == false) {
2823 break;
2824 }
2825 $temp = substr($buffer, $chunkstart, $chunkend - $chunkstart);
2826 $chunk_size = hexdec(trim($temp));
2827 $chunkstart = $chunkend;
2828 }
2829 return $new;
2830 }
2831
2841 {
2842
2843
2844
2845
2846
2848
2849
2850 if ($this->proxy) {
2852 } else {
2854 }
2855 $req =
"$this->request_method $uri HTTP/$this->protocol_version";
2856 $this->
debug(
"HTTP request: $req");
2857 $this->outgoing_payload = "$req\r\n";
2858
2859
2860 foreach ($this->outgoing_headers as $k => $v) {
2861 $hdr = $k . ': ' . $v;
2862 $this->
debug(
"HTTP header: $hdr");
2863 $this->outgoing_payload .= "$hdr\r\n";
2864 }
2865
2866
2867 if ($cookie_str != '') {
2868 $hdr = 'Cookie: ' . $cookie_str;
2869 $this->
debug(
"HTTP header: $hdr");
2870 $this->outgoing_payload .= "$hdr\r\n";
2871 }
2872
2873
2874 $this->outgoing_payload .= "\r\n";
2875
2876
2877 $this->outgoing_payload .=
$data;
2878 }
2879
2889 {
2890
2891 $cookie_str = $this->
getCookiesForRequest($cookies, (($this->scheme ==
'ssl') || ($this->scheme ==
'https')));
2892
2893
2895
2897
2898 if (!fputs($this->fp, $this->outgoing_payload, strlen($this->outgoing_payload))) {
2899 $this->
setError(
'couldn\'t write message data to socket');
2900 $this->
debug(
'couldn\'t write message data to socket');
2901 return false;
2902 }
2903 $this->
debug(
'wrote data to socket, length = ' . strlen($this->outgoing_payload));
2904 return true;
2905 } elseif ($this->
io_method() ==
'curl') {
2906
2907
2908
2909
2910
2911 $curl_headers = array();
2912 foreach ($this->outgoing_headers as $k => $v) {
2913 if ($k == 'Connection' || $k == 'Content-Length' || $k == 'Host' || $k == 'Authorization' || $k == 'Proxy-Authorization') {
2914 $this->
debug(
"Skip cURL header $k: $v");
2915 } else {
2916 $curl_headers[] = "$k: $v";
2917 }
2918 }
2919 if ($cookie_str != '') {
2920 $curl_headers[] = 'Cookie: ' . $cookie_str;
2921 }
2923 $this->
debug(
'set cURL HTTP headers');
2924 if ($this->request_method == "POST") {
2927 $this->
debug(
'set cURL POST data');
2928 } else {
2929 }
2930
2931 foreach ($this->ch_options as $key => $val) {
2933 }
2934
2935 $this->
debug(
'set cURL payload');
2936 return true;
2937 }
2938 }
2939
2947 {
2948 $this->incoming_payload = '';
2949
2951
2953 while (!isset($lb)) {
2954
2955 if (feof($this->fp)) {
2956 $this->incoming_payload =
$data;
2957 $this->
debug(
'found no headers before EOF after length ' . strlen(
$data));
2958 $this->
debug(
"received before EOF:\n" .
$data);
2959 $this->
setError(
'server failed to send headers');
2960 return false;
2961 }
2962
2963 $tmp = fgets($this->fp, 256);
2964 $tmplen = strlen($tmp);
2965 $this->
debug(
"read line of $tmplen bytes: " . trim($tmp));
2966
2967 if ($tmplen == 0) {
2968 $this->incoming_payload =
$data;
2969 $this->
debug(
'socket read of headers timed out after length ' . strlen(
$data));
2970 $this->
debug(
"read before timeout: " .
$data);
2971 $this->
setError(
'socket read of headers timed out');
2972 return false;
2973 }
2974
2976 $pos = strpos(
$data,
"\r\n\r\n");
2977 if ($pos > 1) {
2978 $lb = "\r\n";
2979 } else {
2980 $pos = strpos(
$data,
"\n\n");
2981 if ($pos > 1) {
2982 $lb = "\n";
2983 }
2984 }
2985
2986 if (isset($lb) && preg_match(
'/^HTTP\/1.1 100/',
$data)) {
2987 unset($lb);
2989 }
2990 }
2991
2992 $this->incoming_payload .=
$data;
2993 $this->
debug(
'found end of headers after length ' . strlen(
$data));
2994
2995 $header_data = trim(substr(
$data, 0, $pos));
2996 $header_array = explode($lb, $header_data);
2997 $this->incoming_headers = array();
2998 $this->incoming_cookies = array();
2999 foreach ($header_array as $header_line) {
3000 $arr = explode(':', $header_line, 2);
3001 if (count($arr) > 1) {
3002 $header_name = strtolower(trim($arr[0]));
3003 $this->incoming_headers[$header_name] = trim($arr[1]);
3004 if ($header_name == 'set-cookie') {
3005
3007 if ($cookie) {
3008 $this->incoming_cookies[] = $cookie;
3009 $this->
debug(
'found cookie: ' . $cookie[
'name'] .
' = ' . $cookie[
'value']);
3010 } else {
3011 $this->
debug(
'did not find cookie in ' . trim($arr[1]));
3012 }
3013 }
3014 } elseif (isset($header_name)) {
3015
3016 $this->incoming_headers[$header_name] .= $lb . ' ' . $header_line;
3017 }
3018 }
3019
3020
3021 if (isset($this->incoming_headers['transfer-encoding']) && strtolower($this->incoming_headers['transfer-encoding']) == 'chunked') {
3022 $content_length = 2147483647;
3023 $chunked = true;
3024 $this->
debug(
"want to read chunked content");
3025 } elseif (isset($this->incoming_headers['content-length'])) {
3026 $content_length = $this->incoming_headers['content-length'];
3027 $chunked = false;
3028 $this->
debug(
"want to read content of length $content_length");
3029 } else {
3030 $content_length = 2147483647;
3031 $chunked = false;
3032 $this->
debug(
"want to read content to EOF");
3033 }
3035 do {
3036 if ($chunked) {
3037 $tmp = fgets($this->fp, 256);
3038 $tmplen = strlen($tmp);
3039 $this->
debug(
"read chunk line of $tmplen bytes");
3040 if ($tmplen == 0) {
3041 $this->incoming_payload =
$data;
3042 $this->
debug(
'socket read of chunk length timed out after length ' . strlen(
$data));
3043 $this->
debug(
"read before timeout:\n" .
$data);
3044 $this->
setError(
'socket read of chunk length timed out');
3045 return false;
3046 }
3047 $content_length = hexdec(trim($tmp));
3048 $this->
debug(
"chunk length $content_length");
3049 }
3050 $strlen = 0;
3051 while (($strlen < $content_length) && (!feof($this->fp))) {
3052 $readlen = min(8192, $content_length - $strlen);
3053 $tmp = fread($this->fp, $readlen);
3054 $tmplen = strlen($tmp);
3055 $this->
debug(
"read buffer of $tmplen bytes");
3056 if (($tmplen == 0) && (!feof($this->fp))) {
3057 $this->incoming_payload =
$data;
3058 $this->
debug(
'socket read of body timed out after length ' . strlen(
$data));
3059 $this->
debug(
"read before timeout:\n" .
$data);
3060 $this->
setError(
'socket read of body timed out');
3061 return false;
3062 }
3063 $strlen += $tmplen;
3065 }
3066 if ($chunked && ($content_length > 0)) {
3067 $tmp = fgets($this->fp, 256);
3068 $tmplen = strlen($tmp);
3069 $this->
debug(
"read chunk terminator of $tmplen bytes");
3070 if ($tmplen == 0) {
3071 $this->incoming_payload =
$data;
3072 $this->
debug(
'socket read of chunk terminator timed out after length ' . strlen(
$data));
3073 $this->
debug(
"read before timeout:\n" .
$data);
3074 $this->
setError(
'socket read of chunk terminator timed out');
3075 return false;
3076 }
3077 }
3078 } while ($chunked && ($content_length > 0) && (!feof($this->fp)));
3079 if (feof($this->fp)) {
3080 $this->
debug(
'read to EOF');
3081 }
3082 $this->
debug(
'read body of length ' . strlen(
$data));
3083 $this->incoming_payload .=
$data;
3084 $this->
debug(
'received a total of ' . strlen($this->incoming_payload) .
' bytes of data from server');
3085
3086
3087 if (
3088 (isset($this->incoming_headers['connection']) && strtolower($this->incoming_headers['connection']) == 'close') ||
3089 (! $this->persistentConnection) || feof($this->fp)) {
3090 fclose($this->fp);
3091 $this->fp = false;
3092 $this->
debug(
'closed socket');
3093 }
3094
3095
3096 if ($this->incoming_payload == '') {
3097 $this->
setError(
'no response from server');
3098 return false;
3099 }
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111 } elseif ($this->
io_method() ==
'curl') {
3112
3113 $this->
debug(
'send and receive with cURL');
3114 $this->incoming_payload = curl_exec($this->ch);
3116
3117 $cErr = curl_error($this->ch);
3118 if ($cErr != '') {
3119 $err = 'cURL ERROR: ' . curl_errno($this->ch) . ': ' . $cErr . '<br>';
3120
3121 foreach (curl_getinfo($this->ch) as $k => $v) {
3122 $err .= "$k: $v<br>";
3123 }
3126 curl_close($this->ch);
3127 return false;
3128 } else {
3129
3130
3131
3132 }
3133
3134 $this->
debug(
'No cURL error, closing cURL');
3135 curl_close($this->ch);
3136
3137
3140 $this->
debug(
"Found HTTP header to skip");
3141 if ($pos = strpos(
$data,
"\r\n\r\n")) {
3143 } elseif ($pos = strpos(
$data,
"\n\n")) {
3145 }
3146 }
3147
3149
3151 while (preg_match(
'/^HTTP\/1.1 100/',
$data)) {
3152 if ($pos = strpos(
$data,
"\r\n\r\n")) {
3154 } elseif ($pos = strpos(
$data,
"\n\n")) {
3156 }
3157 }
3158 }
3159
3160
3161 if ($pos = strpos(
$data,
"\r\n\r\n")) {
3162 $lb = "\r\n";
3163 } elseif ($pos = strpos(
$data,
"\n\n")) {
3164 $lb = "\n";
3165 } else {
3166 $this->
debug(
'no proper separation of headers and document');
3167 $this->
setError(
'no proper separation of headers and document');
3168 return false;
3169 }
3170 $header_data = trim(substr(
$data, 0, $pos));
3171 $header_array = explode($lb, $header_data);
3173 $this->
debug(
'found proper separation of headers and document');
3174 $this->
debug(
'cleaned data, stringlen: ' . strlen(
$data));
3175
3176 foreach ($header_array as $header_line) {
3177 $arr = explode(':', $header_line, 2);
3178 if (count($arr) > 1) {
3179 $header_name = strtolower(trim($arr[0]));
3180 $this->incoming_headers[$header_name] = trim($arr[1]);
3181 if ($header_name == 'set-cookie') {
3182
3184 if ($cookie) {
3185 $this->incoming_cookies[] = $cookie;
3186 $this->
debug(
'found cookie: ' . $cookie[
'name'] .
' = ' . $cookie[
'value']);
3187 } else {
3188 $this->
debug(
'did not find cookie in ' . trim($arr[1]));
3189 }
3190 }
3191 } elseif (isset($header_name)) {
3192
3193 $this->incoming_headers[$header_name] .= $lb . ' ' . $header_line;
3194 }
3195 }
3196 }
3197
3198 $this->response_status_line = $header_array[0];
3199 $arr = explode(' ', $this->response_status_line, 3);
3200 $http_version = $arr[0];
3201 $http_status = intval($arr[1]);
3202 $http_reason = count($arr) > 2 ? $arr[2] : '';
3203
3204
3205 if (isset($this->incoming_headers['location']) && ($http_status == 301 || $http_status == 302)) {
3206 $this->
debug(
"Got $http_status $http_reason with Location: " . $this->incoming_headers[
'location']);
3207 $this->
setURL($this->incoming_headers[
'location']);
3208 $this->tryagain = true;
3209 return false;
3210 }
3211
3212
3213 if (isset($this->incoming_headers['www-authenticate']) && $http_status == 401) {
3214 $this->
debug(
"Got 401 $http_reason with WWW-Authenticate: " . $this->incoming_headers[
'www-authenticate']);
3215 if (strstr($this->incoming_headers['www-authenticate'], "Digest ")) {
3216 $this->
debug(
'Server wants digest authentication');
3217
3218 $digestString = str_replace('Digest ', '', $this->incoming_headers['www-authenticate']);
3219
3220
3221 $digestElements = explode(',', $digestString);
3222 foreach ($digestElements as $val) {
3223 $tempElement = explode('=', trim($val), 2);
3224 $digestRequest[$tempElement[0]] = str_replace(
"\"",
'', $tempElement[1]);
3225 }
3226
3227
3230 $this->tryagain = true;
3231 return false;
3232 }
3233 }
3234 $this->
debug(
'HTTP authentication failed');
3235 $this->
setError(
'HTTP authentication failed');
3236 return false;
3237 }
3238
3239 if (
3240 ($http_status >= 300 && $http_status <= 307) ||
3241 ($http_status >= 400 && $http_status <= 417) ||
3242 ($http_status >= 501 && $http_status <= 505)
3243 ) {
3244 $this->
setError(
"Unsupported HTTP response status $http_status $http_reason (soapclient->response has contents of the response)");
3245 return false;
3246 }
3247
3248
3249 if (isset($this->incoming_headers['content-encoding']) && $this->incoming_headers['content-encoding'] != '') {
3250 if (strtolower($this->incoming_headers['content-encoding']) == 'deflate' || strtolower($this->incoming_headers['content-encoding']) == 'gzip') {
3251
3252 if (function_exists('gzinflate')) {
3253
3254
3255
3256 $this->
debug(
'The gzinflate function exists');
3257 $datalen = strlen(
$data);
3258 if ($this->incoming_headers['content-encoding'] == 'deflate') {
3259 if ($degzdata = @gzinflate(
$data)) {
3261 $this->
debug(
'The payload has been inflated to ' . strlen(
$data) .
' bytes');
3262 if (strlen(
$data) < $datalen) {
3263
3264 $this->
debug(
'The inflated payload is smaller than the gzipped one; try again');
3265 if ($degzdata = @gzinflate(
$data)) {
3267 $this->
debug(
'The payload has been inflated again to ' . strlen(
$data) .
' bytes');
3268 }
3269 }
3270 } else {
3271 $this->
debug(
'Error using gzinflate to inflate the payload');
3272 $this->
setError(
'Error using gzinflate to inflate the payload');
3273 }
3274 } elseif ($this->incoming_headers['content-encoding'] == 'gzip') {
3275 if ($degzdata = @gzinflate(substr(
$data, 10))) {
3277 $this->
debug(
'The payload has been un-gzipped to ' . strlen(
$data) .
' bytes');
3278 if (strlen(
$data) < $datalen) {
3279
3280 $this->
debug(
'The un-gzipped payload is smaller than the gzipped one; try again');
3281 if ($degzdata = @gzinflate(substr(
$data, 10))) {
3283 $this->
debug(
'The payload has been un-gzipped again to ' . strlen(
$data) .
' bytes');
3284 }
3285 }
3286 } else {
3287 $this->
debug(
'Error using gzinflate to un-gzip the payload');
3288 $this->
setError(
'Error using gzinflate to un-gzip the payload');
3289 }
3290 }
3291
3292
3293
3294 $this->incoming_payload = $header_data . $lb . $lb .
$data;
3295 } else {
3296 $this->
debug(
'The server sent compressed data. Your php install must have the Zlib extension compiled in to support this.');
3297 $this->
setError(
'The server sent compressed data. Your php install must have the Zlib extension compiled in to support this.');
3298 }
3299 } else {
3300 $this->
debug(
'Unsupported Content-Encoding ' . $this->incoming_headers[
'content-encoding']);
3301 $this->
setError(
'Unsupported Content-Encoding ' . $this->incoming_headers[
'content-encoding']);
3302 }
3303 } else {
3304 $this->
debug(
'No Content-Encoding header');
3305 }
3306
3307 if (strlen(
$data) == 0) {
3308 $this->
debug(
'no data after headers!');
3309 $this->
setError(
'no data present after HTTP headers');
3310 return false;
3311 }
3312
3314 }
3315
3324 {
3325 $this->
setHeader(
'Content-Type', $type . ($charset ?
'; charset=' . $charset :
''));
3326 }
3327
3335 {
3336 if (isset($this->outgoing_headers['Accept-Encoding'])) {
3337 return false;
3338 }
3339 $this->protocol_version = '1.1';
3340 $this->persistentConnection = true;
3341 $this->
setHeader(
'Connection',
'Keep-Alive');
3342 return true;
3343 }
3344
3352
3353
3354
3356 {
3357 $cookie_str = str_replace('; ', ';', $cookie_str) . ';';
3358
3359
3360 $data = explode(
';', $cookie_str);
3361 $value_str =
$data[0];
3362
3363 $cookie_param = 'domain=';
3364 $start = strpos($cookie_str, $cookie_param);
3365 if ($start > 0) {
3366 $domain = substr($cookie_str, $start + strlen($cookie_param));
3367 $domain = substr($domain, 0, strpos($domain, ';'));
3368 } else {
3369 $domain = '';
3370 }
3371
3372 $cookie_param = 'expires=';
3373 $start = strpos($cookie_str, $cookie_param);
3374 if ($start > 0) {
3375 $expires = substr($cookie_str, $start + strlen($cookie_param));
3376 $expires = substr($expires, 0, strpos($expires, ';'));
3377 } else {
3378 $expires = '';
3379 }
3380
3381 $cookie_param = 'path=';
3382 $start = strpos($cookie_str, $cookie_param);
3383 if ($start > 0) {
3384 $path = substr($cookie_str, $start + strlen($cookie_param));
3386 } else {
3388 }
3389
3390 $cookie_param = ';secure;';
3391 if (strpos($cookie_str, $cookie_param) !== false) {
3392 $secure = true;
3393 } else {
3394 $secure = false;
3395 }
3396
3397 $sep_pos = strpos($value_str, '=');
3398
3399 if ($sep_pos) {
3400 $name = substr($value_str, 0, $sep_pos);
3401 $value = substr($value_str, $sep_pos + 1);
3402 $cookie = array( 'name' => $name,
3403 'value' => $value,
3404 'domain' => $domain,
3406 'expires' => $expires,
3407 'secure' => $secure
3408 );
3409 return $cookie;
3410 }
3411 return false;
3412 }
3413
3423 {
3424 $cookie_str = '';
3425 if ((! is_null($cookies)) && (is_array($cookies))) {
3426 foreach ($cookies as $cookie) {
3427 if (! is_array($cookie)) {
3428 continue;
3429 }
3430 $this->
debug(
"check cookie for validity: " . $cookie[
'name'] .
'=' . $cookie[
'value']);
3431 if ((isset($cookie['expires'])) && (! empty($cookie['expires']))) {
3432 if (strtotime($cookie['expires']) <= time()) {
3433 $this->
debug(
'cookie has expired');
3434 continue;
3435 }
3436 }
3437 if ((isset($cookie['domain'])) && (! empty($cookie['domain']))) {
3438 $domain = preg_quote($cookie['domain']);
3439 if (! preg_match("'.*$domain$'i", $this->host)) {
3440 $this->
debug(
'cookie has different domain');
3441 continue;
3442 }
3443 }
3444 if ((isset($cookie['path'])) && (! empty($cookie['path']))) {
3445 $path = preg_quote($cookie[
'path']);
3446 if (! preg_match("'^$path.*'i", $this->path)) {
3447 $this->
debug(
'cookie is for a different path');
3448 continue;
3449 }
3450 }
3451 if ((! $secure) && (isset($cookie['secure'])) && ($cookie['secure'])) {
3452 $this->
debug(
'cookie is secure, transport is not');
3453 continue;
3454 }
3455 $cookie_str .= $cookie['name'] . '=' . $cookie['value'] . '; ';
3456 $this->
debug(
'add cookie to Cookie-String: ' . $cookie[
'name'] .
'=' . $cookie[
'value']);
3457 }
3458 }
3459 return $cookie_str;
3460 }
3461}
3462
3463?><?php
3464
3465
3466
3478{
3553
3601 public $result =
'successful';
3602
3615 public $wsdl =
false;
3628
3629
3638 {
3640
3641 global $debug;
3642 global $HTTP_SERVER_VARS;
3643
3645 $this->
debug(
"_SERVER is defined:");
3647 } elseif (isset($HTTP_SERVER_VARS)) {
3648 $this->
debug(
"HTTP_SERVER_VARS is defined:");
3650 } else {
3651 $this->
debug(
"Neither _SERVER nor HTTP_SERVER_VARS is defined.");
3652 }
3653
3654 if (isset($debug)) {
3655 $this->
debug(
"In nusoap_server, set debug_flag=$debug based on global flag");
3656 $this->debug_flag = $debug;
3657 } elseif (isset(
$_SERVER[
'QUERY_STRING'])) {
3658 $qs = explode(
'&',
$_SERVER[
'QUERY_STRING']);
3659 foreach ($qs as $v) {
3660 if (substr($v, 0, 6) == 'debug=') {
3661 $this->
debug(
"In nusoap_server, set debug_flag=" . substr($v, 6) .
" based on query string #1");
3662 $this->debug_flag = substr($v, 6);
3663 }
3664 }
3665 } elseif (isset($HTTP_SERVER_VARS['QUERY_STRING'])) {
3666 $qs = explode('&', $HTTP_SERVER_VARS['QUERY_STRING']);
3667 foreach ($qs as $v) {
3668 if (substr($v, 0, 6) == 'debug=') {
3669 $this->
debug(
"In nusoap_server, set debug_flag=" . substr($v, 6) .
" based on query string #2");
3670 $this->debug_flag = substr($v, 6);
3671 }
3672 }
3673 }
3674
3675
3677 $this->
debug(
"In nusoap_server, WSDL is specified");
3678 if (is_object(
$wsdl) && (get_class(
$wsdl) ==
'wsdl')) {
3680 $this->externalWSDLURL = $this->
wsdl->wsdl;
3681 $this->
debug(
'Use existing wsdl instance from ' . $this->externalWSDLURL);
3682 } else {
3685 $this->externalWSDLURL =
$wsdl;
3686 }
3690 die('WSDL ERROR: ' . $err);
3691 }
3692 }
3693 }
3694
3702 {
3703 global $HTTP_SERVER_VARS;
3704
3705 if (isset(
$_SERVER[
'QUERY_STRING'])) {
3707 } elseif (isset($HTTP_SERVER_VARS['QUERY_STRING'])) {
3708 $qs = $HTTP_SERVER_VARS['QUERY_STRING'];
3709 } else {
3710 $qs = '';
3711 }
3712 $this->
debug(
"In service, query string=$qs");
3713
3714 if (preg_match('/wsdl/', $qs)) {
3715 $this->
debug(
"In service, this is a request for WSDL");
3716 if ($this->externalWSDLURL) {
3717 if (strpos($this->externalWSDLURL, "://") !== false) {
3718 header(
'Location: ' . $this->externalWSDLURL);
3719 } else {
3720 header(
"Content-Type: text/xml\r\n");
3721 $fp = fopen($this->externalWSDLURL, 'r');
3722 fpassthru($fp);
3723 }
3724 } elseif ($this->
wsdl) {
3725 header(
"Content-Type: text/xml; charset=ISO-8859-1\r\n");
3727 if ($this->debug_flag) {
3728 $this->
debug(
'wsdl:');
3731 }
3732 } else {
3733 header(
"Content-Type: text/html; charset=ISO-8859-1\r\n");
3734 print "This service does not provide WSDL";
3735 }
3737 $this->
debug(
"In service, there is no data, so return Web description");
3739 } else {
3740 $this->
debug(
"In service, invoke the request");
3742 if (! $this->
fault) {
3744 }
3745 if (! $this->
fault) {
3747 }
3749 }
3750 }
3751
3765 {
3766 global $HTTP_SERVER_VARS;
3767
3768 $this->request = '';
3769 $this->SOAPAction = '';
3770 if (function_exists('getallheaders')) {
3771 $this->
debug(
"In parse_http_headers, use getallheaders");
3774 $k = strtolower($k);
3775 $this->headers[$k] = $v;
3776 $this->request .= "$k: $v\r\n";
3777 $this->
debug(
"$k: $v");
3778 }
3779
3780 if (isset($this->headers['soapaction'])) {
3781 $this->SOAPAction = str_replace('"', '', $this->headers['soapaction']);
3782 }
3783
3784 if (isset($this->headers['content-type']) && strpos($this->headers['content-type'], '=')) {
3785 $enc = str_replace('"', '', substr(strstr($this->headers["content-type"], '='), 1));
3786 if (preg_match('/^(ISO-8859-1|US-ASCII|UTF-8)$/i', $enc)) {
3787 $this->xml_encoding = strtoupper($enc);
3788 } else {
3789 $this->xml_encoding = 'US-ASCII';
3790 }
3791 } else {
3792
3793 $this->xml_encoding = 'ISO-8859-1';
3794 }
3796 $this->
debug(
"In parse_http_headers, use _SERVER");
3798 if (substr($k, 0, 5) == 'HTTP_') {
3799 $k = str_replace(' ', '-', strtolower(str_replace('_', ' ', substr($k, 5))));
3800 } else {
3801 $k = str_replace(' ', '-', strtolower(str_replace('_', ' ', $k)));
3802 }
3803 if ($k == 'soapaction') {
3804
3805 $k = 'SOAPAction';
3806 $v = str_replace('"', '', $v);
3807 $v = str_replace('\\', '', $v);
3808 $this->SOAPAction = $v;
3809 } elseif ($k == 'content-type') {
3810
3811 if (strpos($v, '=')) {
3812 $enc = substr(strstr($v, '='), 1);
3813 $enc = str_replace('"', '', $enc);
3814 $enc = str_replace('\\', '', $enc);
3815 if (preg_match('/^(ISO-8859-1|US-ASCII|UTF-8)$/i', $enc)) {
3816 $this->xml_encoding = strtoupper($enc);
3817 } else {
3818 $this->xml_encoding = 'US-ASCII';
3819 }
3820 } else {
3821
3822 $this->xml_encoding = 'ISO-8859-1';
3823 }
3824 }
3825 $this->headers[$k] = $v;
3826 $this->request .= "$k: $v\r\n";
3827 $this->
debug(
"$k: $v");
3828 }
3829 } elseif (is_array($HTTP_SERVER_VARS)) {
3830 $this->
debug(
"In parse_http_headers, use HTTP_SERVER_VARS");
3831 foreach ($HTTP_SERVER_VARS as $k => $v) {
3832 if (substr($k, 0, 5) == 'HTTP_') {
3833 $k = str_replace(' ', '-', strtolower(str_replace('_', ' ', substr($k, 5))));
3834 $k = strtolower(substr($k, 5));
3835 } else {
3836 $k = str_replace(' ', '-', strtolower(str_replace('_', ' ', $k)));
3837 $k = strtolower($k);
3838 }
3839 if ($k == 'soapaction') {
3840
3841 $k = 'SOAPAction';
3842 $v = str_replace('"', '', $v);
3843 $v = str_replace('\\', '', $v);
3844 $this->SOAPAction = $v;
3845 } elseif ($k == 'content-type') {
3846
3847 if (strpos($v, '=')) {
3848 $enc = substr(strstr($v, '='), 1);
3849 $enc = str_replace('"', '', $enc);
3850 $enc = str_replace('\\', '', $enc);
3851 if (preg_match('/^(ISO-8859-1|US-ASCII|UTF-8)$/i', $enc)) {
3852 $this->xml_encoding = strtoupper($enc);
3853 } else {
3854 $this->xml_encoding = 'US-ASCII';
3855 }
3856 } else {
3857
3858 $this->xml_encoding = 'ISO-8859-1';
3859 }
3860 }
3861 $this->headers[$k] = $v;
3862 $this->request .= "$k: $v\r\n";
3863 $this->
debug(
"$k: $v");
3864 }
3865 } else {
3866 $this->
debug(
"In parse_http_headers, HTTP headers not accessible");
3867 $this->
setError(
"HTTP headers not accessible");
3868 }
3869 }
3870
3894 {
3895 $this->
debug(
'entering parse_request()');
3897 $this->
debug(
'got character encoding: ' . $this->xml_encoding);
3898
3899 if (isset($this->headers['content-encoding']) && $this->headers['content-encoding'] != '') {
3900 $this->
debug(
'got content encoding: ' . $this->headers[
'content-encoding']);
3901 if ($this->headers['content-encoding'] == 'deflate' || $this->headers['content-encoding'] == 'gzip') {
3902
3903 if (function_exists('gzuncompress')) {
3904 if ($this->headers[
'content-encoding'] ==
'deflate' && $degzdata = @gzuncompress(
$data)) {
3906 } elseif ($this->headers[
'content-encoding'] ==
'gzip' && $degzdata = gzinflate(substr(
$data, 10))) {
3908 } else {
3909 $this->
fault(
'SOAP-ENV:Client',
'Errors occurred when trying to decode the data');
3910 return;
3911 }
3912 } else {
3913 $this->
fault(
'SOAP-ENV:Client',
'This Server does not support compressed data');
3914 return;
3915 }
3916 }
3917 }
3918 $this->request .=
"\r\n" .
$data;
3920 $this->requestSOAP =
$data;
3921 $this->
debug(
'leaving parse_request');
3922 }
3923
3942 {
3943 $this->
debug(
'in invoke_method, methodname=' . $this->methodname .
' methodURI=' . $this->methodURI .
' SOAPAction=' . $this->SOAPAction);
3944
3947 $this->
debug(
'in invoke_method, found WSDL operation=' . $this->methodname);
3950
3951 $this->
debug(
'in invoke_method, found WSDL soapAction=' . $this->SOAPAction .
' for operation=' . $this->opData[
'name']);
3953 $this->methodname = $this->opData['name'];
3954 } else {
3955 $this->
debug(
'in invoke_method, no WSDL for operation=' . $this->methodname);
3956 $this->
fault(
'SOAP-ENV:Client',
"Operation '" . $this->methodname .
"' is not defined in the WSDL for this service");
3957 return;
3958 }
3959 } else {
3960 $this->
debug(
'in invoke_method, no WSDL to validate method');
3961 }
3962
3963
3964
3965
3967 $method = '';
3968 if (strpos($this->methodname, '..') > 0) {
3969 $delim = '..';
3970 } elseif (strpos($this->methodname, '.') > 0) {
3971 $delim = '.';
3972 } else {
3973 $delim = '';
3974 }
3975
3976 if (strlen($delim) > 0 && substr_count($this->methodname, $delim) == 1 &&
3977 class_exists(substr($this->methodname, 0, strpos($this->methodname, $delim)))) {
3978
3979 $class = substr($this->methodname, 0, strpos($this->methodname, $delim));
3980 $method = substr($this->methodname, strpos($this->methodname, $delim) + strlen($delim));
3981 $this->
debug(
"in invoke_method, class=$class method=$method delim=$delim");
3982 }
3983
3984
3985 if (
$class ==
'' && $this->
class !=
'') {
3987 $delim = "..";
3989 }
3990
3991
3993 if (!function_exists($this->methodname)) {
3994 $this->
debug(
"in invoke_method, function '$this->methodname' not found!");
3995 $this->result = 'fault: method not found';
3996 $this->
fault(
'SOAP-ENV:Client',
"method '$this->methodname' not defined in service");
3997 return;
3998 }
3999 } else {
4000 $method_to_compare = (substr(phpversion(), 0, 2) == '4.') ? strtolower($method) : $method;
4001 if (!in_array($method_to_compare, get_class_methods(
$class))) {
4002 $this->
debug(
"in invoke_method, method '$this->methodname' not found in class '$class'!");
4003 $this->result = 'fault: method not found';
4004 $this->
fault(
'SOAP-ENV:Client',
"method '$this->methodname' not defined in service");
4005 return;
4006 }
4007 }
4008
4009
4010
4011 if (! $this->
verify_method($this->methodname, $this->methodparams)) {
4012
4013 $this->
debug(
'ERROR: request not verified against method signature');
4014 $this->result = 'fault: request failed validation against method signature';
4015
4016 $this->
fault(
'SOAP-ENV:Client',
"Operation '$this->methodname' not defined in service.");
4017 return;
4018 }
4019
4020
4021 $this->
debug(
'in invoke_method, params:');
4023 $this->
debug(
"in invoke_method, calling '$this->methodname'");
4024 if (!function_exists('call_user_func_array')) {
4026 $this->
debug(
'in invoke_method, calling function using eval()');
4027 $funcCall = "\$this->methodreturn = $this->methodname(";
4028 } else {
4029 if ($delim == '..') {
4030 $this->
debug(
'in invoke_method, calling class method using eval()');
4031 $funcCall =
"\$this->methodreturn = " .
$class .
"::" . $method .
"(";
4032 } else {
4033 $this->
debug(
'in invoke_method, calling instance method using eval()');
4034
4035 $instname = "\$inst_" . time();
4036 $funcCall = $instname .
" = new " .
$class .
"(); ";
4037 $funcCall .= "\$this->methodreturn = " . $instname . "->" . $method . "(";
4038 }
4039 }
4040 if ($this->methodparams) {
4041 foreach ($this->methodparams as
$param) {
4043 $this->
fault(
'SOAP-ENV:Client',
'NuSOAP does not handle complexType parameters correctly when using eval; call_user_func_array must be available');
4044 return;
4045 }
4046 $funcCall .= "\"$param\",";
4047 }
4048 $funcCall = substr($funcCall, 0, -1);
4049 }
4050 $funcCall .= ');';
4051 $this->
debug(
'in invoke_method, function call: ' . $funcCall);
4052 @eval($funcCall);
4053 } else {
4055 $this->
debug(
'in invoke_method, calling function using call_user_func_array()');
4056 $call_arg = "$this->methodname";
4057 } elseif ($delim == '..') {
4058 $this->
debug(
'in invoke_method, calling class method using call_user_func_array()');
4059 $call_arg = array(
$class, $method);
4060 } else {
4061 $this->
debug(
'in invoke_method, calling instance method using call_user_func_array()');
4062 $instance =
new $class();
4063 $call_arg = array(&$instance, $method);
4064 }
4065 if (is_array($this->methodparams)) {
4066 $this->methodreturn = call_user_func_array($call_arg, array_values($this->methodparams));
4067 } else {
4068 $this->methodreturn = call_user_func_array($call_arg, array());
4069 }
4070 }
4071 $this->
debug(
'in invoke_method, methodreturn:');
4073 $this->
debug(
"in invoke_method, called method $this->methodname, received data of type " . gettype($this->methodreturn));
4074 }
4075
4088 {
4089 $this->
debug(
'Entering serialize_return methodname: ' . $this->methodname .
' methodURI: ' . $this->methodURI);
4090
4091 if (isset($this->methodreturn) && ((get_class((object) $this->methodreturn) == 'soap_fault') || (get_class((object) $this->methodreturn) == 'nusoap_fault'))) {
4092 $this->
debug(
'got a fault object from method');
4094 return;
4095 } elseif ($this->methodreturnisliteralxml) {
4097
4098 } else {
4099 $this->
debug(
'got a(n) ' . gettype($this->methodreturn) .
' from method');
4100 $this->
debug(
'serializing return value');
4102 if (sizeof($this->opData['output']['parts']) > 1) {
4103 $this->
debug(
'more than one output part, so use the method return unchanged');
4105 } elseif (sizeof($this->opData['output']['parts']) == 1) {
4106 $this->
debug(
'exactly one output part, so wrap the method return in a simple array');
4107
4108
4109
4110
4111 $opParams = array($this->methodreturn);
4112 }
4117 $this->
debug(
'got wsdl error: ' . $errstr);
4118 $this->
fault(
'SOAP-ENV:Server',
'unable to serialize result');
4119 return;
4120 }
4121 } else {
4122 if (isset($this->methodreturn)) {
4123 $return_val = $this->
serialize_val($this->methodreturn,
'return');
4124 } else {
4125 $return_val = '';
4126 $this->
debug(
'in absence of WSDL, assume void return for backward compatibility');
4127 }
4128 }
4129 }
4130 $this->
debug(
'return value:');
4132
4133 $this->
debug(
'serializing response');
4135 $this->
debug(
'have WSDL for serialization: style is ' . $this->opData[
'style']);
4136 if ($this->opData['style'] == 'rpc') {
4137 $this->
debug(
'style is rpc for serialization: use is ' . $this->opData[
'output'][
'use']);
4138 if ($this->opData['output']['use'] == 'literal') {
4139
4140 $payload =
'<ns1:' . $this->methodname .
'Response xmlns:ns1="' . $this->methodURI .
'">' . $return_val .
'</ns1:' . $this->methodname .
"Response>";
4141 } else {
4142 $payload =
'<ns1:' . $this->methodname .
'Response xmlns:ns1="' . $this->methodURI .
'">' . $return_val .
'</ns1:' . $this->methodname .
"Response>";
4143 }
4144 } else {
4145 $this->
debug(
'style is not rpc for serialization: assume document');
4147 }
4148 } else {
4149 $this->
debug(
'do not have WSDL for serialization: assume rpc/encoded');
4150 $payload =
'<ns1:' . $this->methodname .
'Response xmlns:ns1="' . $this->methodURI .
'">' . $return_val .
'</ns1:' . $this->methodname .
"Response>";
4151 }
4152 $this->result = 'successful';
4154
4156
4157 if (isset(
$opData[
'output'][
'encodingStyle'])) {
4158 $encodingStyle =
$opData[
'output'][
'encodingStyle'];
4159 } else {
4160 $encodingStyle = '';
4161 }
4162
4163 $this->responseSOAP = $this->
serializeEnvelope(
$payload, $this->responseHeaders, $this->
wsdl->usedNamespaces, $this->opData[
'style'], $this->opData[
'output'][
'use'], $encodingStyle);
4164 } else {
4166 }
4167 $this->
debug(
"Leaving serialize_return");
4168 }
4169
4181 {
4182 $this->
debug(
'Enter send_response');
4185 $this->outgoing_headers[] = "HTTP/1.0 500 Internal Server Error";
4186 $this->outgoing_headers[] = "Status: 500 Internal Server Error";
4187 } else {
4189
4190
4191
4192
4193
4194 }
4195
4196 if (isset($this->debug_flag) && $this->debug_flag) {
4198 }
4199 $this->outgoing_headers[] = "Server: $this->title Server v$this->version";
4200 preg_match('/\$Revisio' . 'n: ([^ ]+)/', $this->revision, $rev);
4201 $this->outgoing_headers[] = "X-SOAP-Server: $this->title/$this->version (" . $rev[1] . ")";
4202
4203
4207 $this->outgoing_headers[] = "Content-Type: $type" . ($charset ? '; charset=' . $charset : '');
4208
4209
4210
4211 if (strlen(
$payload) > 1024 && isset($this->headers) && isset($this->headers[
'accept-encoding'])) {
4212 if (strstr($this->headers['accept-encoding'], 'gzip')) {
4213 if (function_exists('gzencode')) {
4215 $payload .=
"<!-- Content being gzipped -->";
4216 }
4217 $this->outgoing_headers[] = "Content-Encoding: gzip";
4219 } else {
4220 if (isset($this->debug_flag) && $this->debug_flag) {
4221 $payload .=
"<!-- Content will not be gzipped: no gzencode -->";
4222 }
4223 }
4224 } elseif (strstr($this->headers['accept-encoding'], 'deflate')) {
4225
4226
4227
4228 if (function_exists('gzdeflate')) {
4229 if (isset($this->debug_flag) && $this->debug_flag) {
4230 $payload .=
"<!-- Content being deflated -->";
4231 }
4232 $this->outgoing_headers[] = "Content-Encoding: deflate";
4234 } else {
4235 if (isset($this->debug_flag) && $this->debug_flag) {
4236 $payload .=
"<!-- Content will not be deflated: no gzcompress -->";
4237 }
4238 }
4239 }
4240 }
4241
4242 $this->outgoing_headers[] =
"Content-Length: " . strlen(
$payload);
4243 reset($this->outgoing_headers);
4244 foreach ($this->outgoing_headers as $hdr) {
4246 }
4248 $this->response = join(
"\r\n", $this->outgoing_headers) .
"\r\n\r\n" .
$payload;
4249 }
4250
4261 {
4262 if (isset($this->
wsdl) && is_object($this->
wsdl)) {
4264 return true;
4265 }
4266 } elseif (isset($this->operations[$operation])) {
4267 return true;
4268 }
4269 return false;
4270 }
4271
4281 {
4282 $this->
debug(
'Entering parseRequest() for data of length ' . strlen(
$data) .
' and type ' .
$headers[
'content-type']);
4283 if (!strstr(
$headers[
'content-type'],
'text/xml')) {
4284 $this->
setError(
'Request not of type text/xml');
4285 return false;
4286 }
4287 if (strpos(
$headers[
'content-type'],
'=')) {
4288 $enc = str_replace(
'"',
'', substr(strstr(
$headers[
"content-type"],
'='), 1));
4289 $this->
debug(
'Got response encoding: ' . $enc);
4290 if (preg_match('/^(ISO-8859-1|US-ASCII|UTF-8)$/i', $enc)) {
4291 $this->xml_encoding = strtoupper($enc);
4292 } else {
4293 $this->xml_encoding = 'US-ASCII';
4294 }
4295 } else {
4296
4297 $this->xml_encoding = 'ISO-8859-1';
4298 }
4299 $this->
debug(
'Use encoding: ' . $this->xml_encoding .
' when creating nusoap_parser');
4300
4302
4303 $this->
debug(
"parser debug: \n" . $parser->getDebug());
4304
4305 if ($err = $parser->getError()) {
4306 $this->result = 'fault: error in msg parsing: ' . $err;
4307 $this->
fault(
'SOAP-ENV:Client',
"error in msg parsing:\n" . $err);
4308
4309 } else {
4310
4311 $this->methodURI = $parser->root_struct_namespace;
4312 $this->methodname = $parser->root_struct_name;
4313 $this->
debug(
'methodname: ' . $this->methodname .
' methodURI: ' . $this->methodURI);
4314 $this->
debug(
'calling parser->get_soapbody()');
4315 $this->methodparams = $parser->get_soapbody();
4316
4317 $this->requestHeaders = $parser->getHeaders();
4318
4319 $this->requestHeader = $parser->get_soapheader();
4320
4321 $this->document = $parser->document;
4322 }
4323 }
4324
4333 {
4334 return $soapmsg;
4335 }
4336
4346 {
4347 return 'text/xml';
4348 }
4349
4360 {
4362 }
4363
4374 {
4376 }
4377
4392 public function register($name, $in = array(),
$out = array(),
$namespace =
false, $soapaction =
false, $style =
false, $use =
false, $documentation =
'', $encodingStyle =
'')
4393 {
4394 global $HTTP_SERVER_VARS;
4395
4396 if ($this->externalWSDLURL) {
4397 die('You cannot bind to an external WSDL file, and register methods outside of it! Please choose either WSDL or no WSDL.');
4398 }
4399 if (! $name) {
4400 die('You must specify a name when you register an operation');
4401 }
4402 if (!is_array($in)) {
4403 die('You must provide an array for operation inputs');
4404 }
4405 if (!is_array(
$out)) {
4406 die('You must provide an array for operation outputs');
4407 }
4409 }
4410 if (false == $soapaction) {
4412 $SERVER_NAME =
$_SERVER[
'SERVER_NAME'];
4414 $HTTPS = isset(
$_SERVER[
'HTTPS']) ?
$_SERVER[
'HTTPS'] : (isset($HTTP_SERVER_VARS[
'HTTPS']) ? $HTTP_SERVER_VARS[
'HTTPS'] :
'off');
4415 } elseif (isset($HTTP_SERVER_VARS)) {
4416 $SERVER_NAME = $HTTP_SERVER_VARS['SERVER_NAME'];
4417 $SCRIPT_NAME = isset($HTTP_SERVER_VARS['PHP_SELF']) ? $HTTP_SERVER_VARS['PHP_SELF'] : $HTTP_SERVER_VARS['SCRIPT_NAME'];
4418 $HTTPS = isset($HTTP_SERVER_VARS['HTTPS']) ? $HTTP_SERVER_VARS['HTTPS'] : 'off';
4419 } else {
4420 $this->
setError(
"Neither _SERVER nor HTTP_SERVER_VARS is available");
4421 }
4422 if ($HTTPS == '1' || $HTTPS == 'on') {
4423 $SCHEME = 'https';
4424 } else {
4425 $SCHEME = 'http';
4426 }
4427 $soapaction = "$SCHEME://$SERVER_NAME$SCRIPT_NAME/$name";
4428 }
4429 if (false == $style) {
4430 $style = "rpc";
4431 }
4432 if (false == $use) {
4433 $use = "encoded";
4434 }
4435 if ($use == 'encoded' && $encodingStyle = '') {
4436 $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/';
4437 }
4438
4439 $this->operations[$name] = array(
4440 'name' => $name,
4441 'in' => $in,
4444 'soapaction' => $soapaction,
4445 'style' => $style);
4448 }
4449 return true;
4450 }
4451
4462 public function fault($faultcode, $faultstring, $faultactor =
'', $faultdetail =
'')
4463 {
4464 if ($faultdetail == '' && $this->debug_flag) {
4466 }
4467 $this->
fault =
new nusoap_fault($faultcode, $faultactor, $faultstring, $faultdetail);
4469 }
4470
4482 public function configureWSDL(
$serviceName,
$namespace =
false, $endpoint =
false, $style =
'rpc', $transport =
'http://schemas.xmlsoap.org/soap/http', $schemaTargetNamespace =
false)
4483 {
4484 global $HTTP_SERVER_VARS;
4485
4487 $SERVER_NAME =
$_SERVER[
'SERVER_NAME'];
4488 $SERVER_PORT =
$_SERVER[
'SERVER_PORT'];
4490 $HTTPS = isset(
$_SERVER[
'HTTPS']) ?
$_SERVER[
'HTTPS'] : (isset($HTTP_SERVER_VARS[
'HTTPS']) ? $HTTP_SERVER_VARS[
'HTTPS'] :
'off');
4491 } elseif (isset($HTTP_SERVER_VARS)) {
4492 $SERVER_NAME = $HTTP_SERVER_VARS['SERVER_NAME'];
4493 $SERVER_PORT = $HTTP_SERVER_VARS['SERVER_PORT'];
4494 $SCRIPT_NAME = isset($HTTP_SERVER_VARS['PHP_SELF']) ? $HTTP_SERVER_VARS['PHP_SELF'] : $HTTP_SERVER_VARS['SCRIPT_NAME'];
4495 $HTTPS = isset($HTTP_SERVER_VARS['HTTPS']) ? $HTTP_SERVER_VARS['HTTPS'] : 'off';
4496 } else {
4497 $this->
setError(
"Neither _SERVER nor HTTP_SERVER_VARS is available");
4498 }
4499
4500 $colon = strpos($SERVER_NAME, ":");
4501 if ($colon) {
4502 $SERVER_NAME = substr($SERVER_NAME, 0, $colon);
4503 }
4504 if ($SERVER_PORT == 80) {
4505 $SERVER_PORT = '';
4506 } else {
4507 $SERVER_PORT = ':' . $SERVER_PORT;
4508 }
4510 $namespace =
"http://$SERVER_NAME/soap/$serviceName";
4511 }
4512
4513 if (false == $endpoint) {
4514 if ($HTTPS == '1' || $HTTPS == 'on') {
4515 $SCHEME = 'https';
4516 } else {
4517 $SCHEME = 'http';
4518 }
4519 $endpoint = "$SCHEME://$SERVER_NAME$SERVER_PORT$SCRIPT_NAME";
4520 }
4521
4522 if (false == $schemaTargetNamespace) {
4524 }
4525
4528 $this->
wsdl->endpoint = $endpoint;
4530 $this->
wsdl->namespaces[
'soap'] =
'http://schemas.xmlsoap.org/wsdl/soap/';
4531 $this->
wsdl->namespaces[
'wsdl'] =
'http://schemas.xmlsoap.org/wsdl/';
4533 $this->
wsdl->namespaces[
'types'] = $schemaTargetNamespace;
4534 }
4536 if ($style == 'document') {
4537 $this->
wsdl->schemas[$schemaTargetNamespace][0]->schemaInfo[
'elementFormDefault'] =
'qualified';
4538 }
4539 $this->
wsdl->schemas[$schemaTargetNamespace][0]->schemaTargetNamespace = $schemaTargetNamespace;
4540 $this->
wsdl->schemas[$schemaTargetNamespace][0]->imports[
'http://schemas.xmlsoap.org/soap/encoding/'][0] = array(
'location' =>
'',
'loaded' =>
true);
4541 $this->
wsdl->schemas[$schemaTargetNamespace][0]->imports[
'http://schemas.xmlsoap.org/wsdl/'][0] = array(
'location' =>
'',
'loaded' =>
true);
4544 'style' => $style,
4545 'transport' => $transport,
4549 'location' => $endpoint,
4550 'bindingType' => 'http://schemas.xmlsoap.org/wsdl/soap/');
4551 }
4552
4554 {
4557 'location' => (string) (
new \
ILIAS\Data\URI(
$url))->withQuery(),
4558 'bindingType' => 'http://schemas.xmlsoap.org/wsdl/soap/'
4559 ];
4560 }
4561}
4562
4567{
4568}
4569
4570?><?php
4571
4572
4573
4584{
4585
4590
4608
4610
4615
4624
4629
4645 {
4647 $this->
debug(
"ctor wsdl=$wsdl timeout=$timeout response_timeout=$response_timeout");
4656 }
4659 }
4660
4667 {
4668 $this->
debug(
"parse and process WSDL path=$wsdl");
4670
4671 if ($this->
wsdl !=
"") {
4673 }
4674
4675
4676 $imported_urls = array();
4677 $imported = 1;
4678 while ($imported > 0) {
4679 $imported = 0;
4680
4681 foreach ($this->schemas as $ns => $list) {
4682 foreach ($list as $xs) {
4683 $wsdlparts = parse_url($this->
wsdl);
4684 foreach ($xs->imports as $ns2 => $list2) {
4685 for ($ii = 0; $ii < count($list2); $ii++) {
4686 if (! $list2[$ii]['loaded']) {
4687 $this->schemas[$ns]->imports[$ns2][$ii]['loaded'] = true;
4688 $url = $list2[$ii][
'location'];
4690 $urlparts = parse_url(
$url);
4691 if (!isset($urlparts['host'])) {
4692 $url = $wsdlparts[
'scheme'] .
'://' . $wsdlparts[
'host'] . (isset($wsdlparts[
'port']) ?
':' . $wsdlparts[
'port'] :
'') .
4693 substr($wsdlparts['path'], 0, strrpos($wsdlparts['path'], '/') + 1) . $urlparts['path'];
4694 }
4695 if (! in_array(
$url, $imported_urls)) {
4697 $imported++;
4698 $imported_urls[] =
$url;
4699 }
4700 } else {
4701 $this->
debug(
"Unexpected scenario: empty URL for unloaded import");
4702 }
4703 }
4704 }
4705 }
4706 }
4707 }
4708
4709 $wsdlparts = parse_url($this->
wsdl);
4710 foreach ($this->import as $ns => $list) {
4711 for ($ii = 0; $ii < count($list); $ii++) {
4712 if (! $list[$ii]['loaded']) {
4713 $this->import[$ns][$ii]['loaded'] = true;
4714 $url = $list[$ii][
'location'];
4716 $urlparts = parse_url(
$url);
4717 if (!isset($urlparts['host'])) {
4718 $url = $wsdlparts[
'scheme'] .
'://' . $wsdlparts[
'host'] . (isset($wsdlparts[
'port']) ?
':' . $wsdlparts[
'port'] :
'') .
4719 substr($wsdlparts['path'], 0, strrpos($wsdlparts['path'], '/') + 1) . $urlparts['path'];
4720 }
4721 if (! in_array(
$url, $imported_urls)) {
4723 $imported++;
4724 $imported_urls[] =
$url;
4725 }
4726 } else {
4727 $this->
debug(
"Unexpected scenario: empty URL for unloaded import");
4728 }
4729 }
4730 }
4731 }
4732 }
4733
4734 foreach ($this->bindings as $binding => $bindingData) {
4735 if (isset($bindingData['operations']) && is_array($bindingData['operations'])) {
4736 foreach ($bindingData[
'operations'] as $operation =>
$data) {
4737 $this->
debug(
'post-parse data gathering for ' . $operation);
4738 $this->bindings[$binding]['operations'][$operation]['input'] =
4739 isset($this->bindings[$binding]['operations'][$operation]['input']) ?
4740 array_merge($this->bindings[$binding]['operations'][$operation]['input'], $this->portTypes[ $bindingData['portType'] ][$operation]['input']) :
4741 $this->portTypes[ $bindingData['portType'] ][$operation]['input'];
4742 $this->bindings[$binding]['operations'][$operation]['output'] =
4743 isset($this->bindings[$binding]['operations'][$operation]['output']) ?
4744 array_merge($this->bindings[$binding]['operations'][$operation]['output'], $this->portTypes[ $bindingData['portType'] ][$operation]['output']) :
4745 $this->portTypes[ $bindingData['portType'] ][$operation]['output'];
4746 if (isset($this->messages[ $this->bindings[$binding]['operations'][$operation]['input']['message'] ])) {
4747 $this->bindings[$binding]['operations'][$operation]['input']['parts'] = $this->messages[ $this->bindings[$binding]['operations'][$operation]['input']['message'] ];
4748 }
4749 if (isset($this->messages[ $this->bindings[$binding]['operations'][$operation]['output']['message'] ])) {
4750 $this->bindings[$binding]['operations'][$operation]['output']['parts'] = $this->messages[ $this->bindings[$binding]['operations'][$operation]['output']['message'] ];
4751 }
4752
4753 if (isset($bindingData['style']) && !isset($this->bindings[$binding]['operations'][$operation]['style'])) {
4754 $this->bindings[$binding]['operations'][$operation]['style'] = $bindingData['style'];
4755 }
4756 $this->bindings[$binding]['operations'][$operation]['transport'] = isset($bindingData['transport']) ? $bindingData['transport'] : '';
4757 $this->bindings[$binding]['operations'][$operation]['documentation'] = isset($this->portTypes[ $bindingData['portType'] ][$operation]['documentation']) ? $this->portTypes[ $bindingData['portType'] ][$operation]['documentation'] : '';
4758 $this->bindings[$binding]['operations'][$operation]['endpoint'] = isset($bindingData['endpoint']) ? $bindingData['endpoint'] : '';
4759 }
4760 }
4761 }
4762 }
4763
4771 {
4772 $this->
debug(
"parse WSDL at path=$wsdl");
4773
4775 $this->
debug(
'no wsdl passed to parseWSDL()!!');
4776 $this->
setError(
'no wsdl passed to parseWSDL()!!');
4777 return false;
4778 }
4779
4780
4781 $wsdl_props = parse_url(
$wsdl);
4782
4783 if (isset($wsdl_props['scheme']) && ($wsdl_props['scheme'] == 'http' || $wsdl_props['scheme'] == 'https')) {
4784 $this->
debug(
'getting WSDL http(s) URL ' .
$wsdl);
4785
4787 $tr->request_method = 'GET';
4788 $tr->useSOAPAction = false;
4789 if ($this->proxyhost && $this->proxyport) {
4790 $tr->setProxy($this->proxyhost, $this->proxyport, $this->proxyusername, $this->proxypassword);
4791 }
4792 if ($this->authtype != '') {
4793 $tr->setCredentials($this->username, $this->password, $this->authtype, array(), $this->certRequest);
4794 }
4795 $tr->setEncoding('gzip, deflate');
4796 $wsdl_string = $tr->send('', $this->timeout, $this->response_timeout);
4797
4798
4800
4801 if ($err = $tr->getError()) {
4802 $errstr = 'HTTP ERROR: ' . $err;
4803 $this->
debug($errstr);
4805 unset($tr);
4806 return false;
4807 }
4808 unset($tr);
4809 $this->
debug(
"got WSDL URL");
4810 } else {
4811
4812 if (isset($wsdl_props['scheme']) && ($wsdl_props['scheme'] == 'file') && isset($wsdl_props['path'])) {
4813 $path = isset($wsdl_props[
'host']) ? ($wsdl_props[
'host'] .
':' . $wsdl_props[
'path']) : $wsdl_props[
'path'];
4814 } else {
4816 }
4818 if ($fp = @fopen(
$path,
'r')) {
4819 $wsdl_string = '';
4820 while (
$data = fread($fp, 32768)) {
4821 $wsdl_string .=
$data;
4822 }
4823 fclose($fp);
4824 } else {
4825 $errstr = "Bad path to WSDL file $path";
4826 $this->
debug($errstr);
4828 return false;
4829 }
4830 }
4831 $this->
debug(
'Parse WSDL');
4832
4833
4834 $this->parser = xml_parser_create();
4835
4836
4837 xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, 0);
4838
4839
4841 xml_set_character_data_handler($this->parser, $this->
character_data(...));
4842
4843 if (!xml_parse($this->parser, $wsdl_string, true)) {
4844
4845 $errstr = sprintf(
4846 'XML error parsing WSDL from %s on line %d: %s',
4848 xml_get_current_line_number($this->parser),
4849 xml_error_string(xml_get_error_code($this->parser))
4850 );
4851 $this->
debug($errstr);
4852 $this->
debug(
"XML payload:\n" . $wsdl_string);
4854 return false;
4855 }
4856
4857 xml_parser_free($this->parser);
4858 $this->
debug(
'Parsing WSDL done');
4859
4861 return false;
4862 }
4863 return true;
4864 }
4865
4875 {
4876 if ($this->status == 'schema') {
4877 $this->currentSchema->schemaStartElement(
$parser, $name, $attrs);
4878 $this->
appendDebug($this->currentSchema->getDebug());
4879 $this->currentSchema->clearDebug();
4880 } elseif (preg_match('/schema$/', $name)) {
4881 $this->
debug(
'Parsing WSDL schema');
4882
4883 $this->status = 'schema';
4885 $this->currentSchema->schemaStartElement(
$parser, $name, $attrs);
4886 $this->
appendDebug($this->currentSchema->getDebug());
4887 $this->currentSchema->clearDebug();
4888 } else {
4889
4890 $pos = $this->position++;
4892
4893 $this->depth_array[
$depth] = $pos;
4894 $this->message[$pos] = array('cdata' => '');
4895
4896 if (count($attrs) > 0) {
4897
4898 foreach ($attrs as $k => $v) {
4899 if (preg_match('/^xmlns/', $k)) {
4900 if ($ns_prefix = substr(strrchr($k, ':'), 1)) {
4901 $this->namespaces[$ns_prefix] = $v;
4902 } else {
4903 $this->namespaces['ns' . (count($this->namespaces) + 1)] = $v;
4904 }
4905 if ($v == 'http://www.w3.org/2001/XMLSchema' || $v == 'http://www.w3.org/1999/XMLSchema' || $v == 'http://www.w3.org/2000/10/XMLSchema') {
4906 $this->XMLSchemaVersion = $v;
4907 $this->namespaces['xsi'] = $v . '-instance';
4908 }
4909 }
4910 }
4911
4912 foreach ($attrs as $k => $v) {
4913 $k = strpos($k,
':') ? $this->
expandQname($k) : $k;
4914 if ($k != 'location' && $k != 'soapAction' && $k != 'namespace') {
4915 $v = strpos($v,
':') ? $this->
expandQname($v) : $v;
4916 }
4917 $eAttrs[$k] = $v;
4918 }
4919 $attrs = $eAttrs;
4920 } else {
4921 $attrs = array();
4922 }
4923
4924 if (preg_match('/:/', $name)) {
4925
4926 $prefix = substr($name, 0, strpos($name, ':'));
4927
4928 $namespace = isset($this->namespaces[$prefix]) ? $this->namespaces[$prefix] :
'';
4929
4930 $name = substr(strstr($name, ':'), 1);
4931 }
4932
4933
4934 switch ($this->status) {
4935 case 'message':
4936 if ($name == 'part') {
4937 if (isset($attrs['type'])) {
4938 $this->
debug(
"msg " . $this->currentMessage .
": found part (with type) $attrs[name]: " . implode(
',', $attrs));
4940 }
4941 if (isset($attrs['element'])) {
4942 $this->
debug(
"msg " . $this->currentMessage .
": found part (with element) $attrs[name]: " . implode(
',', $attrs));
4944 }
4945 }
4946 break;
4947 case 'portType':
4948 switch ($name) {
4949 case 'operation':
4950 $this->currentPortOperation = $attrs['name'];
4951 $this->
debug(
"portType $this->currentPortType operation: $this->currentPortOperation");
4952 if (isset($attrs['parameterOrder'])) {
4954 }
4955 break;
4956 case 'documentation':
4957 $this->documentation = true;
4958 break;
4959
4960 default:
4961 $m = isset($attrs[
'message']) ? $this->
getLocalPart($attrs[
'message']) :
'';
4963 break;
4964 }
4965 break;
4966 case 'binding':
4967 switch ($name) {
4968 case 'binding':
4969
4970 if (isset($attrs['style'])) {
4972 }
4973 $this->bindings[
$this->currentBinding] = array_merge($this->bindings[$this->currentBinding], $attrs);
4974 break;
4975 case 'header':
4977 break;
4978 case 'operation':
4979 if (isset($attrs['soapAction'])) {
4981 }
4982 if (isset($attrs['style'])) {
4984 }
4985 if (isset($attrs['name'])) {
4986 $this->currentOperation = $attrs['name'];
4987 $this->
debug(
"current binding operation: $this->currentOperation");
4991 }
4992 break;
4993 case 'input':
4994 $this->opStatus = 'input';
4995 break;
4996 case 'output':
4997 $this->opStatus = 'output';
4998 break;
4999 case 'body':
5000 if (isset($this->bindings[$this->currentBinding]['operations'][$this->currentOperation][$this->opStatus])) {
5002 } else {
5004 }
5005 break;
5006 }
5007 break;
5008 case 'service':
5009 switch ($name) {
5010 case 'port':
5011 $this->currentPort = $attrs['name'];
5012 $this->
debug(
'current port: ' . $this->currentPort);
5014
5015 break;
5016 case 'address':
5020 $this->bindings[ $this->ports[
$this->currentPort][
'binding'] ][
'endpoint'] = $attrs[
'location'];
5021 break;
5022 }
5023 break;
5024 }
5025
5026 switch ($name) {
5027 case 'import':
5028 if (isset($attrs['location'])) {
5029 $this->import[$attrs['namespace']][] = array('location' => $attrs['location'], 'loaded' => false);
5030 $this->
debug(
'parsing import ' . $attrs[
'namespace'] .
' - ' . $attrs[
'location'] .
' (' . count($this->
import[$attrs[
'namespace']]) .
')');
5031 } else {
5032 $this->import[$attrs['namespace']][] = array('location' => '', 'loaded' => true);
5034 $this->namespaces['ns' . (count($this->namespaces) + 1)] = $attrs['namespace'];
5035 }
5036 $this->
debug(
'parsing import ' . $attrs[
'namespace'] .
' - [no location] (' . count($this->
import[$attrs[
'namespace']]) .
')');
5037 }
5038 break;
5039
5040
5041
5042
5043 case 'message':
5044 $this->status = 'message';
5045 $this->messages[$attrs['name']] = array();
5046 $this->currentMessage = $attrs['name'];
5047 break;
5048 case 'portType':
5049 $this->status = 'portType';
5050 $this->portTypes[$attrs['name']] = array();
5051 $this->currentPortType = $attrs['name'];
5052 break;
5053 case "binding":
5054 if (isset($attrs['name'])) {
5055
5056 if (strpos($attrs['name'], ':')) {
5057 $this->currentBinding = $this->
getLocalPart($attrs[
'name']);
5058 } else {
5059 $this->currentBinding = $attrs['name'];
5060 }
5061 $this->status = 'binding';
5063 $this->
debug(
"current binding: $this->currentBinding of portType: " . $attrs[
'type']);
5064 }
5065 break;
5066 case 'service':
5067 $this->serviceName = $attrs['name'];
5068 $this->status = 'service';
5069 $this->
debug(
'current service: ' . $this->serviceName);
5070 break;
5071 case 'definitions':
5072 foreach ($attrs as $name => $value) {
5073 $this->wsdl_info[$name] = $value;
5074 }
5075 break;
5076 }
5077 }
5078 }
5079
5088 {
5089
5090 if ( preg_match('/schema$/', $name)) {
5091 $this->status = "";
5092 $this->
appendDebug($this->currentSchema->getDebug());
5093 $this->currentSchema->clearDebug();
5095 $this->
debug(
'Parsing WSDL schema done');
5096 }
5097 if ($this->status == 'schema') {
5098 $this->currentSchema->schemaEndElement(
$parser, $name);
5099 } else {
5100
5101 $this->depth--;
5102 }
5103
5104 if ($this->documentation) {
5105
5106
5107 $this->documentation = false;
5108 }
5109 }
5110
5119 {
5120 $pos = isset($this->depth_array[$this->depth]) ? $this->depth_array[
$this->depth] : 0;
5121 if (isset($this->message[$pos]['cdata'])) {
5122 $this->message[$pos][
'cdata'] .=
$data;
5123 }
5124 if ($this->documentation) {
5125 $this->documentation .=
$data;
5126 }
5127 }
5128
5139 {
5140 $this->
debug(
"setCredentials username=$username authtype=$authtype certRequest=");
5146 }
5147
5149 {
5150 if (is_array($this->bindings[$binding])) {
5151 return $this->bindings[$binding];
5152 }
5153 }
5154
5163 {
5164 $ops = array();
5165 if ($bindingType == 'soap') {
5166 $bindingType = 'http://schemas.xmlsoap.org/wsdl/soap/';
5167 } elseif ($bindingType == 'soap12') {
5168 $bindingType = 'http://schemas.xmlsoap.org/wsdl/soap12/';
5169 }
5170
5171 foreach ($this->ports as $port => $portData) {
5172
5173 if ($portData['bindingType'] == $bindingType) {
5174
5175
5176
5177
5178 if (isset($this->bindings[ $portData['binding'] ]['operations'])) {
5179 $ops = array_merge($ops, $this->bindings[ $portData['binding'] ]['operations']);
5180 }
5181 }
5182 }
5183 return $ops;
5184 }
5185
5195 {
5196 if ($bindingType == 'soap') {
5197 $bindingType = 'http://schemas.xmlsoap.org/wsdl/soap/';
5198 } elseif ($bindingType == 'soap12') {
5199 $bindingType = 'http://schemas.xmlsoap.org/wsdl/soap12/';
5200 }
5201
5202 foreach ($this->ports as $port => $portData) {
5203
5204 if ($portData['bindingType'] == $bindingType) {
5205
5206
5207 foreach (array_keys($this->bindings[ $portData['binding'] ]['operations']) as $bOperation) {
5208
5209 if ($operation == $bOperation) {
5210 $opData = $this->bindings[ $portData[
'binding'] ][
'operations'][$operation];
5212 }
5213 }
5214 }
5215 }
5216 }
5217
5227 {
5228 if ($bindingType == 'soap') {
5229 $bindingType = 'http://schemas.xmlsoap.org/wsdl/soap/';
5230 } elseif ($bindingType == 'soap12') {
5231 $bindingType = 'http://schemas.xmlsoap.org/wsdl/soap12/';
5232 }
5233
5234 foreach ($this->ports as $port => $portData) {
5235
5236 if ($portData['bindingType'] == $bindingType) {
5237
5238 foreach ($this->bindings[ $portData[
'binding'] ][
'operations'] as $bOperation =>
$opData) {
5239 if (
$opData[
'soapAction'] == $soapAction) {
5241 }
5242 }
5243 }
5244 }
5245 }
5246
5266 {
5267 $this->
debug(
"in getTypeDef: type=$type, ns=$ns");
5268 if ((! $ns) && isset($this->namespaces['tns'])) {
5269 $ns = $this->namespaces['tns'];
5270 $this->
debug(
"in getTypeDef: type namespace forced to $ns");
5271 }
5272 if (!isset($this->schemas[$ns])) {
5273 foreach ($this->schemas as $ns0 => $schema0) {
5274 if (strcasecmp($ns, $ns0) == 0) {
5275 $this->
debug(
"in getTypeDef: replacing schema namespace $ns with $ns0");
5276 $ns = $ns0;
5277 break;
5278 }
5279 }
5280 }
5281 if (isset($this->schemas[$ns])) {
5282 $this->
debug(
"in getTypeDef: have schema for namespace $ns");
5283 for ($i = 0; $i < count($this->schemas[$ns]); $i++) {
5284 $xs = &$this->schemas[$ns][$i];
5285 $t = $xs->getTypeDef($type);
5286
5287
5288 if ($t) {
5289 if (!isset($t['phpType'])) {
5290
5291 $uqType = substr($t['type'], strrpos($t['type'], ':') + 1);
5292 $ns = substr($t['type'], 0, strrpos($t['type'], ':'));
5294 if ($etype) {
5295 $this->
debug(
"found type for [element] $type:");
5297 if (isset($etype['phpType'])) {
5298 $t['phpType'] = $etype['phpType'];
5299 }
5300 if (isset($etype['elements'])) {
5301 $t['elements'] = $etype['elements'];
5302 }
5303 if (isset($etype['attrs'])) {
5304 $t['attrs'] = $etype['attrs'];
5305 }
5306 }
5307 }
5308 return $t;
5309 }
5310 }
5311 } else {
5312 $this->
debug(
"in getTypeDef: do not have schema for namespace $ns");
5313 }
5314 return false;
5315 }
5316
5323 {
5324 global $HTTP_SERVER_VARS;
5325
5328 } elseif (isset($HTTP_SERVER_VARS)) {
5329 $PHP_SELF = $HTTP_SERVER_VARS['PHP_SELF'];
5330 } else {
5331 $this->
setError(
"Neither _SERVER nor HTTP_SERVER_VARS is available");
5332 }
5333
5334 $PHP_SELF = htmlspecialchars($PHP_SELF, ENT_QUOTES | ENT_HTML5, 'UTF-8');
5335
5336
5338 <html><head><title>NuSOAP: ' . $this->serviceName . '</title>
5339 <style type="text/css">
5340 body { font-family: arial; color: #000000; background-color: #ffffff; margin: 0px 0px 0px 0px; }
5341 p { font-family: arial; color: #000000; margin-top: 0px; margin-bottom: 12px; }
5342 pre { background-color: silver; padding: 5px; font-family: Courier New; font-size: x-small; color: #000000;}
5343 ul { margin-top: 10px; margin-left: 20px; }
5344 li { list-style-type: none; margin-top: 10px; color: #000000; }
5345 .content{
5346 margin-left: 0px; padding-bottom: 2em; }
5347 .nav {
5348 padding-top: 10px; padding-bottom: 10px; padding-left: 15px; font-size: .70em;
5349 margin-top: 10px; margin-left: 0px; color: #000000;
5350 background-color: #ccccff; width: 20%; margin-left: 20px; margin-top: 20px; }
5351 .title {
5352 font-family: arial; font-size: 26px; color: #ffffff;
5353 background-color: #999999; width: 105%; margin-left: 0px;
5354 padding-top: 10px; padding-bottom: 10px; padding-left: 15px;}
5355 .hidden {
5356 position: absolute; visibility: hidden; z-index: 200; left: 250px; top: 100px;
5357 font-family: arial; overflow: hidden; width: 600;
5358 padding: 20px; font-size: 10px; background-color: #999999;
5359 layer-background-color:#FFFFFF; }
5360 a,a:active { color: charcoal; font-weight: bold; }
5361 a:visited { color: #666666; font-weight: bold; }
5362 a:hover { color: cc3300; font-weight: bold; }
5363 </style>
5364 <script language="JavaScript" type="text/javascript">
5365 <!--
5366 // POP-UP CAPTIONS...
5367 function lib_bwcheck(){ //Browsercheck (needed)
5368 this.ver=navigator.appVersion
5369 this.agent=navigator.userAgent
5370 this.dom=document.getElementById?1:0
5371 this.opera5=this.agent.indexOf("Opera 5")>-1
5372 this.ie5=(this.ver.indexOf("MSIE 5")>-1 && this.dom && !this.opera5)?1:0;
5373 this.ie6=(this.ver.indexOf("MSIE 6")>-1 && this.dom && !this.opera5)?1:0;
5374 this.ie4=(document.all && !this.dom && !this.opera5)?1:0;
5375 this.ie=this.ie4||this.ie5||this.ie6
5376 this.mac=this.agent.indexOf("Mac")>-1
5377 this.ns6=(this.dom && parseInt(this.ver) >= 5) ?1:0;
5378 this.ns4=(document.layers && !this.dom)?1:0;
5379 this.bw=(this.ie6 || this.ie5 || this.ie4 || this.ns4 || this.ns6 || this.opera5)
5380 return this
5381 }
5382 var bw = new lib_bwcheck()
5383 //Makes crossbrowser object.
5384 function makeObj(obj){
5385 this.evnt=bw.dom? document.getElementById(obj):bw.ie4?document.all[obj]:bw.ns4?document.layers[obj]:0;
5386 if(!this.evnt) return false
5387 this.css=bw.dom||bw.ie4?this.evnt.style:bw.ns4?this.evnt:0;
5388 this.wref=bw.dom||bw.ie4?this.evnt:bw.ns4?this.css.document:0;
5389 this.writeIt=b_writeIt;
5390 return this
5391 }
5392 // A unit of measure that will be added when setting the position of a layer.
5393 //var px = bw.ns4||window.opera?"":"px";
5394 function b_writeIt(text){
5395 if (bw.ns4){this.wref.write(text);this.wref.close()}
5396 else this.wref.innerHTML = text
5397 }
5398 //Shows the messages
5399 var oDesc;
5400 function popup(divid){
5401 if(oDesc = new makeObj(divid)){
5402 oDesc.css.visibility = "visible"
5403 }
5404 }
5405 function popout(){ // Hides message
5406 if(oDesc) oDesc.css.visibility = "hidden"
5407 }
5408 //-->
5409 </script>
5410 </head>
5411 <body>
5412 <div class=content>
5413 <br><br>
5414 <div class=title>' . $this->serviceName . '</div>
5415 <div class=nav>
5416 <p>View the <a href="' . $PHP_SELF . '?wsdl">WSDL</a> for the service.
5417 Click on an operation name to view it's details.</p>
5418 <ul>';
5420
5421 if (isset(
$data[
'endpoint'])) {
5422 $data[
'endpoint'] = htmlspecialchars(
$data[
'endpoint'], ENT_QUOTES | ENT_HTML5,
'UTF-8');
5423 }
5424
5425 $b .=
"<li><a href='#' onclick=\"popout();popup('$op')\">$op</a></li>";
5426
5427 $b .=
"<div id='$op' class='hidden'>
5428 <a href='#' onclick='popout()'><font color='#ffffff'>Close</font></a><br><br>";
5429 foreach (
$data as $donnie => $marie) {
5430 if ($donnie == 'input' || $donnie == 'output') {
5431 $b .=
"<font color='white'>" . ucfirst($donnie) .
':</font><br>';
5432 foreach ($marie as $captain => $tenille) {
5433 if ($captain == 'parts') {
5434 $b .=
" $captain:<br>";
5435
5436 foreach ($tenille as $joanie => $chachi) {
5437 $b .=
" $joanie: $chachi<br>";
5438 }
5439
5440 } else {
5441 $b .=
" $captain: $tenille<br>";
5442 }
5443 }
5444 } else {
5445 $b .=
"<font color='white'>" . ucfirst($donnie) .
":</font> $marie<br>";
5446 }
5447 }
5449 }
5451 <ul>
5452 </div>
5453 </div></body></html>';
5455 }
5456
5465 {
5466 $xml = '<?xml version="1.0" encoding="ISO-8859-1"?>';
5467 $xml .= "\n<definitions";
5468 foreach ($this->namespaces as $k => $v) {
5469 $xml .= " xmlns:$k=\"$v\"";
5470 }
5471
5472 if (isset($this->namespaces['wsdl'])) {
5473 $xml .= " xmlns=\"" . $this->namespaces['wsdl'] . "\"";
5474 }
5475 if (isset($this->namespaces['tns'])) {
5476 $xml .= " targetNamespace=\"" . $this->namespaces['tns'] . "\"";
5477 }
5478 $xml .= '>';
5479
5480 if (sizeof($this->import) > 0) {
5481 foreach ($this->import as $ns => $list) {
5482 foreach ($list as $ii) {
5483 if ($ii['location'] != '') {
5484 $xml .= '<import location="' . $ii['location'] . '" namespace="' . $ns . '" />';
5485 } else {
5486 $xml .= '<import namespace="' . $ns . '" />';
5487 }
5488 }
5489 }
5490 }
5491
5492 if (count($this->schemas) >= 1) {
5493 $xml .= "\n<types>\n";
5494 foreach ($this->schemas as $ns => $list) {
5495 foreach ($list as $xs) {
5496 $xml .= $xs->serializeSchema();
5497 }
5498 }
5499 $xml .= '</types>';
5500 }
5501
5502 if (count($this->messages) >= 1) {
5503 foreach ($this->messages as $msgName => $msgParts) {
5504 $xml .= "\n<message name=\"" . $msgName . '">';
5505 if (is_array($msgParts)) {
5506 foreach ($msgParts as $partName => $partType) {
5507
5508 if (strpos($partType, ':')) {
5510 } elseif (isset($this->typemap[$this->namespaces['xsd']][$partType])) {
5511
5512 $typePrefix = 'xsd';
5513 } else {
5514 foreach ($this->typemap as $ns => $types) {
5515 if (isset($types[$partType])) {
5517 }
5518 }
5519 if (!isset($typePrefix)) {
5520 die("$partType has no namespace!");
5521 }
5522 }
5525 $typeDef = $this->
getTypeDef($localPart, $ns);
5526 if (($typeDef['typeClass'] ?? '') == 'element') {
5527 $elementortype = 'element';
5528 if (substr($localPart, -1) == '^') {
5529 $localPart = substr($localPart, 0, -1);
5530 }
5531 } else {
5532 $elementortype = 'type';
5533 }
5534 $xml .= "\n" . ' <part name="' . $partName . '" ' . $elementortype . '="' . $typePrefix . ':' . $localPart . '" />';
5535 }
5536 }
5537 $xml .= '</message>';
5538 }
5539 }
5540
5541 if (count($this->bindings) >= 1) {
5542 $binding_xml = '';
5543 $portType_xml = '';
5544 foreach ($this->bindings as $bindingName => $attrs) {
5545 $binding_xml .= "\n<binding name=\"" . $bindingName . '" type="tns:' . $attrs['portType'] . '">';
5546 $binding_xml .= "\n" . ' <soap:binding style="' . $attrs['style'] . '" transport="' . $attrs['transport'] . '"/>';
5547 $portType_xml .= "\n<portType name=\"" . $attrs['portType'] . '">';
5548 foreach ($attrs['operations'] as $opName => $opParts) {
5549 $binding_xml .= "\n" . ' <operation name="' . $opName . '">';
5550 $binding_xml .= "\n" . ' <soap:operation soapAction="' . $opParts['soapAction'] . '" style="' . $opParts['style'] . '"/>';
5551 if (isset($opParts['input']['encodingStyle']) && $opParts['input']['encodingStyle'] != '') {
5552 $enc_style = ' encodingStyle="' . $opParts['input']['encodingStyle'] . '"';
5553 } else {
5554 $enc_style = '';
5555 }
5556 $binding_xml .= "\n" . ' <input><soap:body use="' . $opParts['input']['use'] . '" namespace="' . $opParts['input']['namespace'] . '"' . $enc_style . '/></input>';
5557 if (isset($opParts['output']['encodingStyle']) && $opParts['output']['encodingStyle'] != '') {
5558 $enc_style = ' encodingStyle="' . $opParts['output']['encodingStyle'] . '"';
5559 } else {
5560 $enc_style = '';
5561 }
5562 $binding_xml .= "\n" . ' <output><soap:body use="' . $opParts['output']['use'] . '" namespace="' . $opParts['output']['namespace'] . '"' . $enc_style . '/></output>';
5563 $binding_xml .= "\n" . ' </operation>';
5564 $portType_xml .= "\n" . ' <operation name="' . $opParts['name'] . '"';
5565 if (isset($opParts['parameterOrder'])) {
5566 $portType_xml .= ' parameterOrder="' . $opParts['parameterOrder'] . '"';
5567 }
5568 $portType_xml .= '>';
5569 if (isset($opParts['documentation']) && $opParts['documentation'] != '') {
5570 $portType_xml .= "\n" . ' <documentation>' . htmlspecialchars($opParts['documentation']) . '</documentation>';
5571 }
5572 $portType_xml .= "\n" . ' <input message="tns:' . $opParts['input']['message'] . '"/>';
5573 $portType_xml .= "\n" . ' <output message="tns:' . $opParts['output']['message'] . '"/>';
5574 $portType_xml .= "\n" . ' </operation>';
5575 }
5576 $portType_xml .= "\n" . '</portType>';
5577 $binding_xml .= "\n" . '</binding>';
5578 }
5579 $xml .= $portType_xml . $binding_xml;
5580 }
5581
5582 $xml .= "\n<service name=\"" . $this->serviceName . '">';
5583 $has_client = isset(
$_GET[
'client_id']);
5584 if (count($this->ports) >= 1) {
5585 foreach ($this->ports as $pName => $attrs) {
5586 $xml .= "\n" . ' <port name="' . $pName . '" binding="tns:' . $attrs['binding'] . '">';
5587 $locations = $attrs['location'];
5588 $locations = is_array($locations) ? $locations : [$locations];
5590 $address =
$location . ($debug || $has_client ?
"?" :
"")
5591 . ($debug ? 'debug=1' : '') . ($debug && $has_client ? "&" : "")
5592 . ($has_client ?
'client_id=' .
$_GET[
'client_id'] :
'');
5593 $xml .= "\n" . ' <soap:address location="' . $address . '"/>';
5594 }
5595 $xml .= "\n" . ' </port>';
5596 }
5597 }
5598
5599 $xml .= "\n" . '</service>';
5600 return $xml . "\n</definitions>";
5601 }
5602
5613 {
5614 $this->
debug(
"in parametersMatchWrapped type=$type, parameters=");
5616
5617
5618 if (strpos($type, ':')) {
5619 $uqType = substr($type, strrpos($type, ':') + 1);
5620 $ns = substr($type, 0, strrpos($type, ':'));
5621 $this->
debug(
"in parametersMatchWrapped: got a prefixed type: $uqType, $ns");
5624 $this->
debug(
"in parametersMatchWrapped: expanded prefixed type: $uqType, $ns");
5625 }
5626 } else {
5627
5628
5629 $this->
debug(
"in parametersMatchWrapped: No namespace for type $type");
5630 $ns = '';
5631 $uqType = $type;
5632 }
5633
5634
5635 if (!$typeDef = $this->
getTypeDef($uqType, $ns)) {
5636 $this->
debug(
"in parametersMatchWrapped: $type ($uqType) is not a supported type.");
5637 return false;
5638 }
5639 $this->
debug(
"in parametersMatchWrapped: found typeDef=");
5641 if (substr($uqType, -1) == '^') {
5642 $uqType = substr($uqType, 0, -1);
5643 }
5644 $phpType = $typeDef['phpType'];
5645 $arrayType = (isset($typeDef['arrayType']) ? $typeDef['arrayType'] : '');
5646 $this->
debug(
"in parametersMatchWrapped: uqType: $uqType, ns: $ns, phptype: $phpType, arrayType: $arrayType");
5647
5648
5649 if ($phpType != 'struct') {
5650 $this->
debug(
"in parametersMatchWrapped: not a struct");
5651 return false;
5652 }
5653
5654
5655 if (isset($typeDef['elements']) && is_array($typeDef['elements'])) {
5656 $elements = 0;
5657 $matches = 0;
5658 $change = false;
5659 if ($this->
isArraySimpleOrStruct($parameters) ==
'arraySimple' && count($parameters) == count($typeDef[
'elements'])) {
5660 $this->
debug(
"in parametersMatchWrapped: (wrapped return value kludge) correct number of elements in simple array, so change array and wrap");
5661 $change = true;
5662 }
5663 foreach ($typeDef['elements'] as $name => $attrs) {
5664 if ($change) {
5665 $this->
debug(
"in parametersMatchWrapped: change parameter $element to name $name");
5666 $parameters[$name] = $parameters[$elements];
5667 unset($parameters[$elements]);
5668 $matches++;
5669 } elseif (isset($parameters[$name])) {
5670 $this->
debug(
"in parametersMatchWrapped: have parameter named $name");
5671 $matches++;
5672 } else {
5673 $this->
debug(
"in parametersMatchWrapped: do not have parameter named $name");
5674 }
5675 $elements++;
5676 }
5677
5678 $this->
debug(
"in parametersMatchWrapped: $matches parameter names match $elements wrapped parameter names");
5679 if ($matches == 0) {
5680 return false;
5681 }
5682 return true;
5683 }
5684
5685
5686
5687 $this->
debug(
"in parametersMatchWrapped: no elements type $ns:$uqType");
5688 return count($parameters) == 0;
5689 }
5690
5707 {
5708 $this->
debug(
"in serializeRPCParameters: operation=$operation, direction=$direction, XMLSchemaVersion=$this->XMLSchemaVersion, bindingType=$bindingType");
5710
5711 if ($direction != 'input' && $direction != 'output') {
5712 $this->
debug(
'The value of the \$direction argument needs to be either "input" or "output"');
5713 $this->
setError(
'The value of the \$direction argument needs to be either "input" or "output"');
5714 return false;
5715 }
5717 $this->
debug(
'Unable to retrieve WSDL data for operation: ' . $operation .
' bindingType: ' . $bindingType);
5718 $this->
setError(
'Unable to retrieve WSDL data for operation: ' . $operation .
' bindingType: ' . $bindingType);
5719 return false;
5720 }
5721 $this->
debug(
'in serializeRPCParameters: opData:');
5723
5724
5725 $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/';
5726 if (($direction ==
'input') && isset(
$opData[
'output'][
'encodingStyle']) && (
$opData[
'output'][
'encodingStyle'] != $encodingStyle)) {
5727 $encodingStyle =
$opData[
'output'][
'encodingStyle'];
5728 $enc_style = $encodingStyle;
5729 }
5730
5731
5732 $xml = '';
5733 if (isset(
$opData[$direction][
'parts']) &&
sizeof(
$opData[$direction][
'parts']) > 0) {
5735 $part_count =
sizeof(
$parts);
5737 $use =
$opData[$direction][
'use'];
5738 $this->
debug(
"have $part_count part(s) to serialize using $style/$use");
5739 if (is_array($parameters)) {
5741 $parameter_count = count($parameters);
5742 $this->
debug(
"have $parameter_count parameter(s) provided as $parametersArrayType to serialize");
5743
5744 if ($style ==
'document' && $use ==
'literal' && $part_count == 1 && isset(
$parts[
'parameters'])) {
5745 $this->
debug(
'check whether the caller has wrapped the parameters');
5746 if ((($parametersArrayType == 'arrayStruct' || $parameter_count == 0) && !isset($parameters['parameters'])) || ($direction == 'output' && $parametersArrayType == 'arraySimple' && $parameter_count == 1)) {
5747 $this->
debug(
'check whether caller\'s parameters match the wrapped ones');
5749 $this->
debug(
'wrap the parameters for the caller');
5750 $parameters = array('parameters' => $parameters);
5751 $parameter_count = 1;
5752 }
5753 }
5754 }
5755 foreach (
$parts as $name => $type) {
5756 $this->
debug(
"serializing part $name of type $type");
5757
5758 if (isset(
$opData[$direction][
'encodingStyle']) && $encodingStyle !=
$opData[$direction][
'encodingStyle']) {
5759 $encodingStyle =
$opData[$direction][
'encodingStyle'];
5760 $enc_style = $encodingStyle;
5761 } else {
5762 $enc_style = false;
5763 }
5764
5765
5766 if ($parametersArrayType == 'arraySimple') {
5767 $p = array_shift($parameters);
5768 $this->
debug(
'calling serializeType w/indexed param');
5769 $xml .= $this->
serializeType($name, $type, $p, $use, $enc_style);
5770 } elseif (isset($parameters[$name])) {
5771 $this->
debug(
'calling serializeType w/named param');
5772 $xml .= $this->
serializeType($name, $type, $parameters[$name], $use, $enc_style);
5773 } else {
5774
5775 $this->
debug(
'calling serializeType w/null param');
5776 $xml .= $this->
serializeType($name, $type,
null, $use, $enc_style);
5777 }
5778 }
5779 } else {
5780 $this->
debug(
'no parameters passed.');
5781 }
5782 }
5783 $this->
debug(
"serializeRPCParameters returning: $xml");
5784 return $xml;
5785 }
5786
5802 {
5803 $this->
debug(
"in serializeParameters: operation=$operation, direction=$direction, XMLSchemaVersion=$this->XMLSchemaVersion");
5805
5806 if ($direction != 'input' && $direction != 'output') {
5807 $this->
debug(
'The value of the \$direction argument needs to be either "input" or "output"');
5808 $this->
setError(
'The value of the \$direction argument needs to be either "input" or "output"');
5809 return false;
5810 }
5812 $this->
debug(
'Unable to retrieve WSDL data for operation: ' . $operation);
5813 $this->
setError(
'Unable to retrieve WSDL data for operation: ' . $operation);
5814 return false;
5815 }
5816 $this->
debug(
'opData:');
5818
5819
5820 $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/';
5821 if (($direction ==
'input') && isset(
$opData[
'output'][
'encodingStyle']) && (
$opData[
'output'][
'encodingStyle'] != $encodingStyle)) {
5822 $encodingStyle =
$opData[
'output'][
'encodingStyle'];
5823 $enc_style = $encodingStyle;
5824 }
5825
5826
5827 $xml = '';
5828 if (isset(
$opData[$direction][
'parts']) &&
sizeof(
$opData[$direction][
'parts']) > 0) {
5829 $use =
$opData[$direction][
'use'];
5830 $this->
debug(
"use=$use");
5831 $this->
debug(
'got ' . count(
$opData[$direction][
'parts']) .
' part(s)');
5832 if (is_array($parameters)) {
5834 $this->
debug(
'have ' . $parametersArrayType .
' parameters');
5835 foreach (
$opData[$direction][
'parts'] as $name => $type) {
5836 $this->
debug(
'serializing part "' . $name .
'" of type "' . $type .
'"');
5837
5838 if (isset(
$opData[$direction][
'encodingStyle']) && $encodingStyle !=
$opData[$direction][
'encodingStyle']) {
5839 $encodingStyle =
$opData[$direction][
'encodingStyle'];
5840 $enc_style = $encodingStyle;
5841 } else {
5842 $enc_style = false;
5843 }
5844
5845
5846 if ($parametersArrayType == 'arraySimple') {
5847 $p = array_shift($parameters);
5848 $this->
debug(
'calling serializeType w/indexed param');
5849 $xml .= $this->
serializeType($name, $type, $p, $use, $enc_style);
5850 } elseif (isset($parameters[$name])) {
5851 $this->
debug(
'calling serializeType w/named param');
5852 $xml .= $this->
serializeType($name, $type, $parameters[$name], $use, $enc_style);
5853 } else {
5854
5855 $this->
debug(
'calling serializeType w/null param');
5856 $xml .= $this->
serializeType($name, $type,
null, $use, $enc_style);
5857 }
5858 }
5859 } else {
5860 $this->
debug(
'no parameters passed.');
5861 }
5862 }
5863 $this->
debug(
"serializeParameters returning: $xml");
5864 return $xml;
5865 }
5866
5879 public function serializeType($name, $type, $value, $use =
'encoded', $encodingStyle =
false, $unqualified =
false)
5880 {
5881 $this->
debug(
"in serializeType: name=$name, type=$type, use=$use, encodingStyle=$encodingStyle, unqualified=" . ($unqualified ?
"unqualified" :
"qualified"));
5883 if ($use == 'encoded' && $encodingStyle) {
5884 $encodingStyle = ' SOAP-ENV:encodingStyle="' . $encodingStyle . '"';
5885 }
5886
5887
5888 if (is_object($value) && get_class($value) == 'soapval') {
5889 if ($value->type_ns) {
5890 $type = $value->type_ns . ':' . $value->type;
5891 $forceType = true;
5892 $this->
debug(
"in serializeType: soapval overrides type to $type");
5893 } elseif ($value->type) {
5894 $type = $value->type;
5895 $forceType = true;
5896 $this->
debug(
"in serializeType: soapval overrides type to $type");
5897 } else {
5898 $forceType = false;
5899 $this->
debug(
"in serializeType: soapval does not override type");
5900 }
5901 $attrs = $value->attributes;
5902 $value = $value->value;
5903 $this->
debug(
"in serializeType: soapval overrides value to $value");
5904 if ($attrs) {
5905 if (!is_array($value)) {
5906 $value['!'] = $value;
5907 }
5908 foreach ($attrs as $n => $v) {
5909 $value['!' . $n] = $v;
5910 }
5911 $this->
debug(
"in serializeType: soapval provides attributes");
5912 }
5913 } else {
5914 $forceType = false;
5915 }
5916
5917 $xml = '';
5918 if (strpos($type, ':')) {
5919 $uqType = substr($type, strrpos($type, ':') + 1);
5920 $ns = substr($type, 0, strrpos($type, ':'));
5921 $this->
debug(
"in serializeType: got a prefixed type: $uqType, $ns");
5924 $this->
debug(
"in serializeType: expanded prefixed type: $uqType, $ns");
5925 }
5926
5927 if ($ns == $this->XMLSchemaVersion || $ns == 'http://schemas.xmlsoap.org/soap/encoding/') {
5928 $this->
debug(
'in serializeType: type namespace indicates XML Schema or SOAP Encoding type');
5929 if ($unqualified && $use == 'literal') {
5930 $elementNS = " xmlns=\"\"";
5931 } else {
5932 $elementNS = '';
5933 }
5934 if (is_null($value)) {
5935 if ($use == 'literal') {
5936
5937 $xml = "<$name$elementNS/>";
5938 } else {
5939
5940 $xml =
"<$name$elementNS xsi:nil=\"true\" xsi:type=\"" . $this->
getPrefixFromNamespace($ns) .
":$uqType\"/>";
5941 }
5942 $this->
debug(
"in serializeType: returning: $xml");
5943 return $xml;
5944 }
5945 if ($uqType == 'Array') {
5946
5947 return $this->
serialize_val($value, $name,
false,
false,
false,
false, $use);
5948 }
5949 if ($uqType == 'boolean') {
5950 if ((is_string($value) && $value == 'false') || (! $value)) {
5951 $value = 'false';
5952 } else {
5953 $value = 'true';
5954 }
5955 }
5956 if ($uqType == 'string' && gettype($value) == 'string') {
5958 }
5959 if (($uqType == 'long' || $uqType == 'unsignedLong') && gettype($value) == 'double') {
5960 $value = sprintf("%.0lf", $value);
5961 }
5962
5963
5964
5966 if ($use == 'literal') {
5967 if ($forceType) {
5968 $xml =
"<$name$elementNS xsi:type=\"" . $this->
getPrefixFromNamespace($ns) .
":$uqType\">$value</$name>";
5969 } else {
5970 $xml = "<$name$elementNS>$value</$name>";
5971 }
5972 } else {
5973 $xml =
"<$name$elementNS xsi:type=\"" . $this->
getPrefixFromNamespace($ns) .
":$uqType\"$encodingStyle>$value</$name>";
5974 }
5975 $this->
debug(
"in serializeType: returning: $xml");
5976 return $xml;
5977 }
5978 $this->
debug(
'custom type extends XML Schema or SOAP Encoding namespace (yuck)');
5979 } elseif ($ns == 'http://xml.apache.org/xml-soap') {
5980 $this->
debug(
'in serializeType: appears to be Apache SOAP type');
5981 if ($uqType == 'Map') {
5983 if (! $tt_prefix) {
5984 $this->
debug(
'in serializeType: Add namespace for Apache SOAP type');
5985 $tt_prefix = 'ns' . rand(1000, 9999);
5986 $this->namespaces[$tt_prefix] = 'http://xml.apache.org/xml-soap';
5987
5989 }
5990 $contents = '';
5991 foreach ($value as $k => $v) {
5992 $this->
debug(
"serializing map element: key $k, value $v");
5993 $contents .= '<item>';
5994 $contents .= $this->
serialize_val($k,
'key',
false,
false,
false,
false, $use);
5995 $contents .= $this->
serialize_val($v,
'value',
false,
false,
false,
false, $use);
5996 $contents .= '</item>';
5997 }
5998 if ($use == 'literal') {
5999 if ($forceType) {
6000 $xml = "<$name xsi:type=\"" . $tt_prefix . ":$uqType\">$contents</$name>";
6001 } else {
6002 $xml = "<$name>$contents</$name>";
6003 }
6004 } else {
6005 $xml = "<$name xsi:type=\"" . $tt_prefix . ":$uqType\"$encodingStyle>$contents</$name>";
6006 }
6007 $this->
debug(
"in serializeType: returning: $xml");
6008 return $xml;
6009 }
6010 $this->
debug(
'in serializeType: Apache SOAP type, but only support Map');
6011 }
6012 } else {
6013
6014
6015 $this->
debug(
"in serializeType: No namespace for type $type");
6016 $ns = '';
6017 $uqType = $type;
6018 }
6019 if (!$typeDef = $this->
getTypeDef($uqType, $ns)) {
6020 $this->
setError(
"$type ($uqType) is not a supported type.");
6021 $this->
debug(
"in serializeType: $type ($uqType) is not a supported type.");
6022 return false;
6023 } else {
6024 $this->
debug(
"in serializeType: found typeDef");
6026 if (substr($uqType, -1) == '^') {
6027 $uqType = substr($uqType, 0, -1);
6028 }
6029 }
6030 $phpType = $typeDef['phpType'];
6031 $this->
debug(
"in serializeType: uqType: $uqType, ns: $ns, phptype: $phpType, arrayType: " . (isset($typeDef[
'arrayType']) ? $typeDef[
'arrayType'] :
''));
6032
6033 if ($phpType == 'struct') {
6034 if (isset($typeDef['typeClass']) && $typeDef['typeClass'] == 'element') {
6035 $elementName = $uqType;
6036 if (isset($typeDef['form']) && ($typeDef['form'] == 'qualified')) {
6037 $elementNS = " xmlns=\"$ns\"";
6038 } else {
6039 $elementNS = " xmlns=\"\"";
6040 }
6041 } else {
6042 $elementName = $name;
6043 if ($unqualified) {
6044 $elementNS = " xmlns=\"\"";
6045 } else {
6046 $elementNS = '';
6047 }
6048 }
6049 if (is_null($value)) {
6050 if ($use == 'literal') {
6051
6052 $xml = "<$elementName$elementNS/>";
6053 } else {
6054 $xml =
"<$elementName$elementNS xsi:nil=\"true\" xsi:type=\"" . $this->
getPrefixFromNamespace($ns) .
":$uqType\"/>";
6055 }
6056 $this->
debug(
"in serializeType: returning: $xml");
6057 return $xml;
6058 }
6059 if (is_object($value)) {
6060 $value = get_object_vars($value);
6061 }
6062 if (is_array($value)) {
6064 if ($use == 'literal') {
6065 if ($forceType) {
6066 $xml =
"<$elementName$elementNS$elementAttrs xsi:type=\"" . $this->
getPrefixFromNamespace($ns) .
":$uqType\">";
6067 } else {
6068 $xml = "<$elementName$elementNS$elementAttrs>";
6069 }
6070 } else {
6071 $xml =
"<$elementName$elementNS$elementAttrs xsi:type=\"" . $this->
getPrefixFromNamespace($ns) .
":$uqType\"$encodingStyle>";
6072 }
6073
6075 $xml .= "</$elementName>";
6076 } else {
6077 $this->
debug(
"in serializeType: phpType is struct, but value is not an array");
6078 $this->
setError(
"phpType is struct, but value is not an array: see debug output for details");
6079 $xml = '';
6080 }
6081 } elseif ($phpType == 'array') {
6082 if (isset($typeDef['form']) && ($typeDef['form'] == 'qualified')) {
6083 $elementNS = " xmlns=\"$ns\"";
6084 } else {
6085 if ($unqualified) {
6086 $elementNS = " xmlns=\"\"";
6087 } else {
6088 $elementNS = '';
6089 }
6090 }
6091 if (is_null($value)) {
6092 if ($use == 'literal') {
6093
6094 $xml = "<$name$elementNS/>";
6095 } else {
6096 $xml = "<$name$elementNS xsi:nil=\"true\" xsi:type=\"" .
6098 ":Array\" " .
6100 ':arrayType="' .
6102 ':' .
6103 $this->
getLocalPart($typeDef[
'arrayType']) .
"[0]\"/>";
6104 }
6105 $this->
debug(
"in serializeType: returning: $xml");
6106 return $xml;
6107 }
6108 if (isset($typeDef['multidimensional'])) {
6109 $nv = array();
6110 foreach ($value as $v) {
6111 $cols = ',' . sizeof($v);
6112 $nv = array_merge($nv, $v);
6113 }
6114 $value = $nv;
6115 } else {
6116 $cols = '';
6117 }
6118 if (is_array($value) && sizeof($value) >= 1) {
6119 $rows = sizeof($value);
6120 $contents = '';
6121 foreach ($value as $k => $v) {
6122 $this->
debug(
"serializing array element: $k, $v of type: $typeDef[arrayType]");
6123
6124 if (!in_array($typeDef['arrayType'], $this->typemap['http://www.w3.org/2001/XMLSchema'])) {
6125 $contents .= $this->
serializeType(
'item', $typeDef[
'arrayType'], $v, $use);
6126 } else {
6127 $contents .= $this->
serialize_val($v,
'item', $typeDef[
'arrayType'],
null, $this->XMLSchemaVersion,
false, $use);
6128 }
6129 }
6130 } else {
6131 $rows = 0;
6132 $contents = null;
6133 }
6134
6135
6136 if ($use == 'literal') {
6137 $xml = "<$name$elementNS>"
6138 . $contents
6139 . "</$name>";
6140 } else {
6141 $xml =
"<$name$elementNS xsi:type=\"" . $this->
getPrefixFromNamespace(
'http://schemas.xmlsoap.org/soap/encoding/') .
':Array" ' .
6143 . ':arrayType="'
6145 .
":" . $this->
getLocalPart($typeDef[
'arrayType']) .
"[$rows$cols]\">"
6146 . $contents
6147 . "</$name>";
6148 }
6149 } elseif ($phpType == 'scalar') {
6150 if (isset($typeDef['form']) && ($typeDef['form'] == 'qualified')) {
6151 $elementNS = " xmlns=\"$ns\"";
6152 } else {
6153 if ($unqualified) {
6154 $elementNS = " xmlns=\"\"";
6155 } else {
6156 $elementNS = '';
6157 }
6158 }
6159 if ($use == 'literal') {
6160 if ($forceType) {
6161 $xml =
"<$name$elementNS xsi:type=\"" . $this->
getPrefixFromNamespace($ns) .
":$uqType\">$value</$name>";
6162 } else {
6163 $xml = "<$name$elementNS>$value</$name>";
6164 }
6165 } else {
6166 $xml =
"<$name$elementNS xsi:type=\"" . $this->
getPrefixFromNamespace($ns) .
":$uqType\"$encodingStyle>$value</$name>";
6167 }
6168 }
6169 $this->
debug(
"in serializeType: returning: $xml");
6170 return $xml;
6171 }
6172
6184 {
6185 $xml = '';
6186 if (isset($typeDef['attrs']) && is_array($typeDef['attrs'])) {
6187 $this->
debug(
"serialize attributes for XML Schema type $ns:$uqType");
6188 if (is_array($value)) {
6189 $xvalue = $value;
6190 } elseif (is_object($value)) {
6191 $xvalue = get_object_vars($value);
6192 } else {
6193 $this->
debug(
"value is neither an array nor an object for XML Schema type $ns:$uqType");
6194 $xvalue = array();
6195 }
6196 foreach ($typeDef['attrs'] as $aName => $attrs) {
6197 if (isset($xvalue['!' . $aName])) {
6198 $xname = '!' . $aName;
6199 $this->
debug(
"value provided for attribute $aName with key $xname");
6200 } elseif (isset($xvalue[$aName])) {
6201 $xname = $aName;
6202 $this->
debug(
"value provided for attribute $aName with key $xname");
6203 } elseif (isset($attrs['default'])) {
6204 $xname = '!' . $aName;
6205 $xvalue[$xname] = $attrs['default'];
6206 $this->
debug(
'use default value of ' . $xvalue[$aName] .
' for attribute ' . $aName);
6207 } else {
6208 $xname = '';
6209 $this->
debug(
"no value provided for attribute $aName");
6210 }
6211 if ($xname) {
6212 $xml .=
" $aName=\"" . $this->
expandEntities($xvalue[$xname]) .
"\"";
6213 }
6214 }
6215 } else {
6216 $this->
debug(
"no attributes to serialize for XML Schema type $ns:$uqType");
6217 }
6218 if (isset($typeDef['extensionBase'])) {
6219 $ns = $this->
getPrefix($typeDef[
'extensionBase']);
6220 $uqType = $this->
getLocalPart($typeDef[
'extensionBase']);
6223 }
6224 if ($typeDef = $this->
getTypeDef($uqType, $ns)) {
6225 $this->
debug(
"serialize attributes for extension base $ns:$uqType");
6227 } else {
6228 $this->
debug(
"extension base $ns:$uqType is not a supported type");
6229 }
6230 }
6231 return $xml;
6232 }
6233
6247 {
6248 $xml = '';
6249 if (isset($typeDef['elements']) && is_array($typeDef['elements'])) {
6250 $this->
debug(
"in serializeComplexTypeElements, serialize elements for XML Schema type $ns:$uqType");
6251 if (is_array($value)) {
6252 $xvalue = $value;
6253 } elseif (is_object($value)) {
6254 $xvalue = get_object_vars($value);
6255 } else {
6256 $this->
debug(
"value is neither an array nor an object for XML Schema type $ns:$uqType");
6257 $xvalue = array();
6258 }
6259
6260 if (count($typeDef['elements']) != count($xvalue)) {
6261 $optionals = true;
6262 }
6263 foreach ($typeDef['elements'] as $eName => $attrs) {
6264 if (!isset($xvalue[$eName])) {
6265 if (isset($attrs['default'])) {
6266 $xvalue[$eName] = $attrs['default'];
6267 $this->
debug(
'use default value of ' . $xvalue[$eName] .
' for element ' . $eName);
6268 }
6269 }
6270
6271 if (isset($optionals)
6272 && (!isset($xvalue[$eName]))
6273 && ((!isset($attrs['nillable'])) || $attrs['nillable'] != 'true')
6274 ) {
6275 if (isset($attrs['minOccurs']) && $attrs['minOccurs'] <> '0') {
6276 $this->
debug(
"apparent error: no value provided for element $eName with minOccurs=" . $attrs[
'minOccurs']);
6277 }
6278
6279 $this->
debug(
"no value provided for complexType element $eName and element is not nillable, so serialize nothing");
6280 } else {
6281
6282 if (isset($xvalue[$eName])) {
6283 $v = $xvalue[$eName];
6284 } else {
6285 $v = null;
6286 }
6287 if (isset($attrs['form'])) {
6288 $unqualified = ($attrs['form'] == 'unqualified');
6289 } else {
6290 $unqualified = false;
6291 }
6292 if (isset($attrs[
'maxOccurs']) && ($attrs[
'maxOccurs'] ==
'unbounded' || $attrs[
'maxOccurs'] > 1) && isset($v) && is_array($v) && $this->
isArraySimpleOrStruct($v) ==
'arraySimple') {
6293 $vv = $v;
6294 foreach ($vv as $k => $v) {
6295 if (isset($attrs['type']) || isset($attrs['ref'])) {
6296
6297 $xml .= $this->
serializeType($eName, isset($attrs[
'type']) ? $attrs[
'type'] : $attrs[
'ref'], $v, $use, $encodingStyle, $unqualified);
6298 } else {
6299
6300 $this->
debug(
"calling serialize_val() for $v, $eName, false, false, false, false, $use");
6301 $xml .= $this->
serialize_val($v, $eName,
false,
false,
false,
false, $use);
6302 }
6303 }
6304 } else {
6305 if (isset($attrs['type']) || isset($attrs['ref'])) {
6306
6307 $xml .= $this->
serializeType($eName, isset($attrs[
'type']) ? $attrs[
'type'] : $attrs[
'ref'], $v, $use, $encodingStyle, $unqualified);
6308 } else {
6309
6310 $this->
debug(
"calling serialize_val() for $v, $eName, false, false, false, false, $use");
6311 $xml .= $this->
serialize_val($v, $eName,
false,
false,
false,
false, $use);
6312 }
6313 }
6314 }
6315 }
6316 } else {
6317 $this->
debug(
"no elements to serialize for XML Schema type $ns:$uqType");
6318 }
6319 if (isset($typeDef['extensionBase'])) {
6320 $ns = $this->
getPrefix($typeDef[
'extensionBase']);
6321 $uqType = $this->
getLocalPart($typeDef[
'extensionBase']);
6324 }
6325 if ($typeDef = $this->
getTypeDef($uqType, $ns)) {
6326 $this->
debug(
"serialize elements for extension base $ns:$uqType");
6328 } else {
6329 $this->
debug(
"extension base $ns:$uqType is not a supported type");
6330 }
6331 }
6332 return $xml;
6333 }
6334
6349 public function addComplexType($name, $typeClass =
'complexType', $phpType =
'array', $compositor =
'', $restrictionBase =
'', $elements = array(), $attrs = array(), $arrayType =
'')
6350 {
6351 if (count($elements) > 0) {
6352 $eElements = array();
6353 foreach ($elements as $n =>
$e) {
6354
6355 $ee = array();
6356 foreach (
$e as $k => $v) {
6357 $k = strpos($k,
':') ? $this->
expandQname($k) : $k;
6358 $v = strpos($v,
':') ? $this->
expandQname($v) : $v;
6359 $ee[$k] = $v;
6360 }
6361 $eElements[$n] = $ee;
6362 }
6363 $elements = $eElements;
6364 }
6365
6366 if (count($attrs) > 0) {
6367 foreach ($attrs as $n =>
$a) {
6368
6369 foreach (
$a as $k => $v) {
6370 $k = strpos($k,
':') ? $this->
expandQname($k) : $k;
6371 $v = strpos($v,
':') ? $this->
expandQname($v) : $v;
6372 $aa[$k] = $v;
6373 }
6374 $eAttrs[$n] = $aa;
6375 }
6376 $attrs = $eAttrs;
6377 }
6378
6379 $restrictionBase = strpos($restrictionBase,
':') ? $this->
expandQname($restrictionBase) : $restrictionBase;
6380 $arrayType = strpos($arrayType,
':') ? $this->
expandQname($arrayType) : $arrayType;
6381
6382 $typens = isset($this->namespaces['types']) ? $this->namespaces['types'] : $this->namespaces['tns'];
6383 $this->schemas[$typens][0]->addComplexType($name, $typeClass, $phpType, $compositor, $restrictionBase, $elements, $attrs, $arrayType);
6384 }
6385
6397 public function addSimpleType($name, $restrictionBase =
'', $typeClass =
'simpleType', $phpType =
'scalar', $enumeration = array())
6398 {
6399 $restrictionBase = strpos($restrictionBase,
':') ? $this->
expandQname($restrictionBase) : $restrictionBase;
6400
6401 $typens = isset($this->namespaces['types']) ? $this->namespaces['types'] : $this->namespaces['tns'];
6402 $this->schemas[$typens][0]->addSimpleType($name, $restrictionBase, $typeClass, $phpType, $enumeration);
6403 }
6404
6413 {
6414 $typens = isset($this->namespaces['types']) ? $this->namespaces['types'] : $this->namespaces['tns'];
6415 $this->schemas[$typens][0]->addElement($attrs);
6416 }
6417
6433 {
6434 if ($use == 'encoded' && $encodingStyle == '') {
6435 $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/';
6436 }
6437
6438 if ($style == 'document') {
6439 $elements = array();
6440 foreach ($in as $n => $t) {
6441 $elements[$n] = array('name' => $n, 'type' => $t);
6442 }
6443 $this->
addComplexType($name .
'RequestType',
'complexType',
'struct',
'all',
'', $elements);
6444 $this->
addElement(array(
'name' => $name,
'type' => $name .
'RequestType'));
6445 $in = array('parameters' => 'tns:' . $name . '^');
6446
6447 $elements = array();
6448 foreach (
$out as $n => $t) {
6449 $elements[$n] = array('name' => $n, 'type' => $t);
6450 }
6451 $this->
addComplexType($name .
'ResponseType',
'complexType',
'struct',
'all',
'', $elements);
6452 $this->
addElement(array(
'name' => $name .
'Response',
'type' => $name .
'ResponseType',
'form' =>
'qualified'));
6453 $out = array(
'parameters' =>
'tns:' . $name .
'Response' .
'^');
6454 }
6455
6456
6457 $this->bindings[ $this->serviceName . 'Binding' ]['operations'][$name] =
6458 array(
6459 'name' => $name,
6460 'binding' => $this->serviceName . 'Binding',
6461 'endpoint' => $this->endpoint,
6462 'soapAction' => $soapaction,
6463 'style' => $style,
6464 'input' => array(
6465 'use' => $use,
6467 'encodingStyle' => $encodingStyle,
6468 'message' => $name . 'Request',
6469 'parts' => $in),
6470 'output' => array(
6471 'use' => $use,
6473 'encodingStyle' => $encodingStyle,
6474 'message' => $name . 'Response',
6477 'transport' => 'http://schemas.xmlsoap.org/soap/http',
6479
6480
6481 if ($in) {
6482 foreach ($in as $pName => $pType) {
6483 if (strpos($pType, ':')) {
6485 }
6486 $this->messages[$name . 'Request'][$pName] = $pType;
6487 }
6488 } else {
6489 $this->messages[$name . 'Request'] = '0';
6490 }
6492 foreach (
$out as $pName => $pType) {
6493 if (strpos($pType, ':')) {
6495 }
6496 $this->messages[$name . 'Response'][$pName] = $pType;
6497 }
6498 } else {
6499 $this->messages[$name . 'Response'] = '0';
6500 }
6501 return true;
6502 }
6503}
6504?><?php
6505
6506
6507
6518{
6529
6547
6548
6549 public $ids = array();
6550
6552
6554
6565 {
6568 $this->xml_encoding = $encoding;
6571
6572
6574
6575 $pos_xml = strpos(
$xml,
'<?xml');
6576 if ($pos_xml !== false) {
6577 $xml_decl = substr(
$xml, $pos_xml, strpos(
$xml,
'?>', $pos_xml + 2) - $pos_xml + 1);
6578 if (preg_match(
"/encoding=[\"']([^\"']*)[\"']/", $xml_decl,
$res)) {
6581 $err =
"Charset from HTTP Content-Type '" . $encoding .
"' does not match encoding from XML declaration '" .
$xml_encoding .
"'";
6583 if ($encoding !=
'ISO-8859-1' || strtoupper(
$xml_encoding) !=
'UTF-8') {
6585 return;
6586 }
6587
6588 } else {
6589 $this->
debug(
'Charset from HTTP Content-Type matches encoding from XML declaration');
6590 }
6591 } else {
6592 $this->
debug(
'No encoding specified in XML declaration');
6593 }
6594 } else {
6595 $this->
debug(
'No XML declaration');
6596 }
6597 $this->
debug(
'Entering nusoap_parser(), length=' . strlen(
$xml) .
', encoding=' . $encoding);
6598
6599 $this->parser = xml_parser_create($this->xml_encoding);
6600
6601
6602 xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, 0);
6603 xml_parser_set_option($this->parser, XML_OPTION_TARGET_ENCODING, $this->xml_encoding);
6604
6605
6607 xml_set_character_data_handler($this->parser, $this->
character_data(...));
6608
6609
6610 if (!xml_parse($this->parser,
$xml,
true)) {
6611
6612 $err = sprintf(
6613 'XML error parsing SOAP payload on line %d: %s',
6614 xml_get_current_line_number($this->parser),
6615 xml_error_string(xml_get_error_code($this->parser))
6616 );
6620 } else {
6621 $this->
debug(
'parsed successfully, found root struct: ' . $this->root_struct .
' of name ' . $this->root_struct_name);
6622
6624
6625 if ($this->root_header != '' && isset($this->message[$this->root_header]['result'])) {
6627 }
6628
6629 if (sizeof($this->multirefs) > 0) {
6630 foreach ($this->multirefs as
$id => $hrefs) {
6631 $this->
debug(
'resolving multirefs for id: ' .
$id);
6633 if (is_array($idVal) && isset($idVal['!id'])) {
6634 unset($idVal['!id']);
6635 }
6636 foreach ($hrefs as $refPos => $ref) {
6637 $this->
debug(
'resolving href at pos ' . $refPos);
6638 $this->multirefs[
$id][$refPos] = $idVal;
6639 }
6640 }
6641 }
6642 }
6643 xml_parser_free($this->parser);
6644 } else {
6645 $this->
debug(
'xml was empty, didn\'t parse!');
6646 $this->
setError(
'xml was empty, didn\'t parse!');
6647 }
6648 }
6649
6659 {
6660
6661
6662 $pos = $this->position++;
6663
6664 $this->message[$pos] = array('pos' => $pos,'children' => '','cdata' => '');
6665
6666
6667 $this->message[$pos]['depth'] = $this->depth++;
6668
6669
6670 if ($pos != 0) {
6672 }
6673
6675
6676 $this->parent = $pos;
6677
6679
6680 if (strpos($name, ':')) {
6681
6682 $prefix = substr($name, 0, strpos($name, ':'));
6683
6684 $name = substr(strstr($name, ':'), 1);
6685 }
6686
6687 if ($name == 'Envelope') {
6688 $this->status = 'envelope';
6689 } elseif ($name == 'Header' && $this->status = 'envelope') {
6690 $this->root_header = $pos;
6691 $this->status = 'header';
6692 } elseif ($name == 'Body' && $this->status = 'envelope') {
6693 $this->status = 'body';
6694 $this->body_position = $pos;
6695
6696 } elseif ($this->status == 'body' && $pos == ($this->body_position + 1)) {
6697 $this->status = 'method';
6698 $this->root_struct_name = $name;
6699 $this->root_struct = $pos;
6700 $this->message[$pos]['type'] = 'struct';
6701 $this->
debug(
"found root struct $this->root_struct_name, pos $this->root_struct");
6702 }
6703
6705
6706 $this->message[$pos]['name'] = htmlspecialchars($name);
6707
6708 $this->message[$pos]['attrs'] = $attrs;
6709
6710
6711 $attstr = '';
6712 foreach ($attrs as $key => $value) {
6715
6716 if ($key_prefix == 'xmlns') {
6717 if (preg_match('/^http:\/\/www.w3.org\/[0-9]{4}\/XMLSchema$/', $value)) {
6718 $this->XMLSchemaVersion = $value;
6720 $this->namespaces['xsi'] = $this->XMLSchemaVersion . '-instance';
6721 }
6722 $this->namespaces[$key_localpart] = $value;
6723
6724 if ($name == $this->root_struct_name) {
6725 $this->methodNamespace = $value;
6726 }
6727
6728 } elseif ($key_localpart == 'type') {
6729 if (isset($this->message[$pos]['type']) && $this->message[$pos]['type'] == 'array') {
6730
6731 } else {
6732 $value_prefix = $this->
getPrefix($value);
6734 $this->message[$pos]['type'] = $value_localpart;
6735 $this->message[$pos]['typePrefix'] = $value_prefix;
6736 if (isset($this->namespaces[$value_prefix])) {
6737 $this->message[$pos]['type_namespace'] = $this->namespaces[$value_prefix];
6738 } elseif (isset($attrs['xmlns:' . $value_prefix])) {
6739 $this->message[$pos]['type_namespace'] = $attrs['xmlns:' . $value_prefix];
6740 }
6741
6742 }
6743 } elseif ($key_localpart == 'arrayType') {
6744 $this->message[$pos]['type'] = 'array';
6745
6746
6747
6748
6749
6750
6751
6752
6753 $expr = '/([A-Za-z0-9_]+):([A-Za-z]+[A-Za-z0-9_]+)\[([0-9]+),?([0-9]*)\]/';
6754 if (preg_match($expr, $value, $regs)) {
6755 $this->message[$pos]['typePrefix'] = $regs[1];
6756 $this->message[$pos]['arrayTypePrefix'] = $regs[1];
6757 if (isset($this->namespaces[$regs[1]])) {
6758 $this->message[$pos]['arrayTypeNamespace'] = $this->namespaces[$regs[1]];
6759 } elseif (isset($attrs['xmlns:' . $regs[1]])) {
6760 $this->message[$pos]['arrayTypeNamespace'] = $attrs['xmlns:' . $regs[1]];
6761 }
6762 $this->message[$pos]['arrayType'] = $regs[2];
6763 $this->message[$pos]['arraySize'] = $regs[3];
6764 $this->message[$pos]['arrayCols'] = $regs[4];
6765 }
6766
6767 } elseif ($key_localpart == 'nil') {
6768 $this->message[$pos]['nil'] = ($value == 'true' || $value == '1');
6769
6770 } elseif ($key != 'href' && $key != 'xmlns' && $key_localpart != 'encodingStyle' && $key_localpart != 'root') {
6771 $this->message[$pos]['xattrs']['!' . $key] = $value;
6772 }
6773
6774 if ($key == 'xmlns') {
6775 $this->default_namespace = $value;
6776 }
6777
6778 if ($key == 'id') {
6779 $this->ids[$value] = $pos;
6780 }
6781
6782 if ($key_localpart == 'root' && $value == 1) {
6783 $this->status = 'method';
6784 $this->root_struct_name = $name;
6785 $this->root_struct = $pos;
6786 $this->
debug(
"found root struct $this->root_struct_name, pos $pos");
6787 }
6788
6789 $attstr .= " $key=\"$value\"";
6790 }
6791
6792 if (isset($prefix)) {
6793 $this->message[$pos]['namespace'] = $this->namespaces[$prefix];
6794 $this->default_namespace = $this->namespaces[$prefix];
6795 } else {
6797 }
6798 if ($this->status == 'header') {
6799 if ($this->root_header != $pos) {
6800 $this->responseHeaders .= "<" . (isset($prefix) ? $prefix . ':' : '') . "$name$attstr>";
6801 }
6802 } elseif ($this->root_struct_name != '') {
6803 $this->document .= "<" . (isset($prefix) ? $prefix . ':' : '') . "$name$attstr>";
6804 }
6805 }
6806
6815 {
6816
6817 $pos = $this->depth_array[$this->depth--];
6818
6819
6820 if (strpos($name, ':')) {
6821
6822 $prefix = substr($name, 0, strpos($name, ':'));
6823
6824 $name = substr(strstr($name, ':'), 1);
6825 }
6826
6827
6828 if (isset($this->body_position) && $pos > $this->body_position) {
6829
6830 if (isset($this->message[$pos]['attrs']['href'])) {
6831
6832 $id = substr($this->message[$pos][
'attrs'][
'href'], 1);
6833
6834 $this->multirefs[
$id][$pos] =
'placeholder';
6835
6836 $this->message[$pos][
'result'] = & $this->multirefs[
$id][$pos];
6837
6838 } elseif ($this->message[$pos]['children'] != '') {
6839
6840 if (!isset($this->message[$pos]['result'])) {
6841 $this->message[$pos][
'result'] = $this->
buildVal($pos);
6842 }
6843
6844 } elseif (isset($this->message[$pos]['xattrs'])) {
6845 if (isset($this->message[$pos]['nil']) && $this->message[$pos]['nil']) {
6846 $this->message[$pos]['xattrs']['!'] = null;
6847 } elseif (isset($this->message[$pos]['cdata']) && trim($this->message[$pos]['cdata']) != '') {
6848 if (isset($this->message[$pos]['type'])) {
6849 $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'] :
'');
6850 } else {
6851 $parent = $this->message[$pos][
'parent'];
6852 if (isset($this->message[
$parent][
'type']) && ($this->message[
$parent][
'type'] ==
'array') && isset($this->message[
$parent][
'arrayType'])) {
6853 $this->message[$pos][
'xattrs'][
'!'] = $this->
decodeSimple($this->message[$pos][
'cdata'], $this->message[
$parent][
'arrayType'], isset($this->message[
$parent][
'arrayTypeNamespace']) ? $this->message[
$parent][
'arrayTypeNamespace'] :
'');
6854 } else {
6855 $this->message[$pos]['xattrs']['!'] = $this->message[$pos]['cdata'];
6856 }
6857 }
6858 }
6859 $this->message[$pos]['result'] = $this->message[$pos]['xattrs'];
6860
6861 } else {
6862
6863 if (isset($this->message[$pos]['nil']) && $this->message[$pos]['nil']) {
6864 $this->message[$pos]['xattrs']['!'] = null;
6865 } elseif (isset($this->message[$pos]['type'])) {
6866 $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'] :
'');
6867 } else {
6868 $parent = $this->message[$pos][
'parent'];
6869 if (isset($this->message[
$parent][
'type']) && ($this->message[
$parent][
'type'] ==
'array') && isset($this->message[
$parent][
'arrayType'])) {
6870 $this->message[$pos][
'result'] = $this->
decodeSimple($this->message[$pos][
'cdata'], $this->message[
$parent][
'arrayType'], isset($this->message[
$parent][
'arrayTypeNamespace']) ? $this->message[
$parent][
'arrayTypeNamespace'] :
'');
6871 } else {
6872 $this->message[$pos]['result'] = $this->message[$pos]['cdata'];
6873 }
6874 }
6875
6876
6877
6878
6879
6880
6881
6882
6883
6884
6885
6886 }
6887 }
6888
6889
6890 if ($this->status == 'header') {
6891 if ($this->root_header != $pos) {
6892 $this->responseHeaders .= "</" . (isset($prefix) ? $prefix . ':' : '') . "$name>";
6893 }
6894 } elseif ($pos >= $this->root_struct) {
6895 $this->document .= "</" . (isset($prefix) ? $prefix . ':' : '') . "$name>";
6896 }
6897
6898 if ($pos == $this->root_struct) {
6899 $this->status = 'body';
6900 $this->root_struct_namespace = $this->message[$pos]['namespace'];
6901 } elseif ($name == 'Body') {
6902 $this->status = 'envelope';
6903 } elseif ($name == 'Header') {
6904 $this->status = 'envelope';
6905 } elseif ($name == 'Envelope') {
6906
6907 }
6908
6909 $this->parent = $this->message[$pos]['parent'];
6910 }
6911
6920 {
6922 if ($this->xml_encoding == 'UTF-8') {
6923
6924
6925
6926 if ($this->decode_utf8) {
6928 }
6929 }
6930 $this->message[$pos][
'cdata'] .=
$data;
6931
6932 if ($this->status == 'header') {
6933 $this->responseHeaders .=
$data;
6934 } else {
6935 $this->document .=
$data;
6936 }
6937 }
6938
6947 {
6949 }
6950
6958 {
6960 }
6961
6969 {
6971 }
6972
6980 {
6982 }
6983
6994 {
6995
6996 if ((!isset($type)) || $type == 'string' || $type == 'long' || $type == 'unsignedLong') {
6997 return (string) $value;
6998 }
6999 if ($type == 'int' || $type == 'integer' || $type == 'short' || $type == 'byte') {
7000 return (int) $value;
7001 }
7002 if ($type == 'float' || $type == 'double' || $type == 'decimal') {
7003 return (float) $value;
7004 }
7005 if ($type == 'boolean') {
7006 if (strtolower($value) == 'false' || strtolower($value) == 'f') {
7007 return false;
7008 }
7009 return (bool) $value;
7010 }
7011 if ($type == 'base64' || $type == 'base64Binary') {
7012 $this->
debug(
'Decode base64 value');
7013 return base64_decode($value);
7014 }
7015
7016 if ($type == 'nonPositiveInteger' || $type == 'negativeInteger'
7017 || $type == 'nonNegativeInteger' || $type == 'positiveInteger'
7018 || $type == 'unsignedInt'
7019 || $type == 'unsignedShort' || $type == 'unsignedByte') {
7020 return (int) $value;
7021 }
7022
7023 if ($type == 'array') {
7024 return array();
7025 }
7026
7027 return (string) $value;
7028 }
7029
7039 {
7040 if (!isset($this->message[$pos]['type'])) {
7041 $this->message[$pos]['type'] = '';
7042 }
7043 $this->
debug(
'in buildVal() for ' . $this->message[$pos][
'name'] .
"(pos $pos) of type " . $this->message[$pos][
'type']);
7044
7045 if ($this->message[$pos]['children'] != '') {
7046 $this->
debug(
'in buildVal, there are children');
7047 $children = explode('|', $this->message[$pos]['children']);
7048 array_shift($children);
7049
7050 if (isset($this->message[$pos]['arrayCols']) && $this->message[$pos]['arrayCols'] != '') {
7051 $r = 0;
7053 foreach ($children as $child_pos) {
7054 $this->
debug(
"in buildVal, got an MD array element: $r, $c");
7055 $params[$r][] = $this->message[$child_pos][
'result'];
7057 if (
$c == $this->message[$pos][
'arrayCols']) {
7059 $r++;
7060 }
7061 }
7062
7063 } elseif ($this->message[$pos]['type'] == 'array' || $this->message[$pos]['type'] == 'Array') {
7064 $this->
debug(
'in buildVal, adding array ' . $this->message[$pos][
'name']);
7065 foreach ($children as $child_pos) {
7066 $params[] = &$this->message[$child_pos][
'result'];
7067 }
7068
7069 } elseif ($this->message[$pos]['type'] == 'Map' && $this->message[$pos]['type_namespace'] == 'http://xml.apache.org/xml-soap') {
7070 $this->
debug(
'in buildVal, Java Map ' . $this->message[$pos][
'name']);
7071 foreach ($children as $child_pos) {
7072 $kv = explode("|", $this->message[$child_pos]['children']);
7073 $params[$this->message[$kv[1]][
'result']] = &$this->message[$kv[2]][
'result'];
7074 }
7075
7076
7077 } else {
7078
7079 $this->
debug(
'in buildVal, adding Java Vector or generic compound type ' . $this->message[$pos][
'name']);
7080 if ($this->message[$pos]['type'] == 'Vector' && $this->message[$pos]['type_namespace'] == 'http://xml.apache.org/xml-soap') {
7081 $notstruct = 1;
7082 } else {
7083 $notstruct = 0;
7084 }
7085
7086 foreach ($children as $child_pos) {
7087 if ($notstruct) {
7088 $params[] = &$this->message[$child_pos][
'result'];
7089 } else {
7090 if (isset(
$params[$this->message[$child_pos][
'name']])) {
7091
7092 if ((!is_array(
$params[$this->message[$child_pos][
'name']])) || (!isset(
$params[$this->message[$child_pos][
'name']][0]))) {
7093 $params[$this->message[$child_pos][
'name']] = array(
$params[$this->message[$child_pos][
'name']]);
7094 }
7095 $params[$this->message[$child_pos][
'name']][] = &$this->message[$child_pos][
'result'];
7096 } else {
7097 $params[$this->message[$child_pos][
'name']] = &$this->message[$child_pos][
'result'];
7098 }
7099 }
7100 }
7101 }
7102 if (isset($this->message[$pos]['xattrs'])) {
7103 $this->
debug(
'in buildVal, handling attributes');
7104 foreach ($this->message[$pos]['xattrs'] as $n => $v) {
7106 }
7107 }
7108
7109 if (isset($this->message[$pos]['cdata']) && trim($this->message[$pos]['cdata']) != '') {
7110 $this->
debug(
'in buildVal, handling simpleContent');
7111 if (isset($this->message[$pos]['type'])) {
7112 $params[
'!'] = $this->
decodeSimple($this->message[$pos][
'cdata'], $this->message[$pos][
'type'], isset($this->message[$pos][
'type_namespace']) ? $this->message[$pos][
'type_namespace'] :
'');
7113 } else {
7114 $parent = $this->message[$pos][
'parent'];
7115 if (isset($this->message[
$parent][
'type']) && ($this->message[
$parent][
'type'] ==
'array') && isset($this->message[
$parent][
'arrayType'])) {
7116 $params[
'!'] = $this->
decodeSimple($this->message[$pos][
'cdata'], $this->message[
$parent][
'arrayType'], isset($this->message[
$parent][
'arrayTypeNamespace']) ? $this->message[
$parent][
'arrayTypeNamespace'] :
'');
7117 } else {
7118 $params[
'!'] = $this->message[$pos][
'cdata'];
7119 }
7120 }
7121 }
7123 $this->
debug(
'in buildVal, return:');
7125 return $ret;
7126 } else {
7127 $this->
debug(
'in buildVal, no children, building scalar');
7128 $cdata = isset($this->message[$pos]['cdata']) ? $this->message[$pos]['cdata'] : '';
7129 if (isset($this->message[$pos]['type'])) {
7130 $ret = $this->
decodeSimple($cdata, $this->message[$pos][
'type'], isset($this->message[$pos][
'type_namespace']) ? $this->message[$pos][
'type_namespace'] :
'');
7131 $this->
debug(
"in buildVal, return: $ret");
7132 return $ret;
7133 }
7134 $parent = $this->message[$pos][
'parent'];
7135 if (isset($this->message[
$parent][
'type']) && ($this->message[
$parent][
'type'] ==
'array') && isset($this->message[
$parent][
'arrayType'])) {
7136 $ret = $this->
decodeSimple($cdata, $this->message[
$parent][
'arrayType'], isset($this->message[
$parent][
'arrayTypeNamespace']) ? $this->message[
$parent][
'arrayTypeNamespace'] :
'');
7137 $this->
debug(
"in buildVal, return: $ret");
7138 return $ret;
7139 }
7140 $ret = $this->message[$pos]['cdata'];
7141 $this->
debug(
"in buildVal, return: $ret");
7142 return $ret;
7143 }
7144 }
7145}
7146
7151{
7152}
7153
7154?><?php
7155
7156
7157
7179{
7215
7216
7217
7218
7239
7255 {
7264
7265 $this->
debug(
"ctor wsdl=$wsdl timeout=$timeout response_timeout=$response_timeout");
7267
7268
7272 $this->endpoint = $this->
wsdl->wsdl;
7274 $this->
debug(
'existing wsdl instance created from ' . $this->endpoint);
7276 } else {
7279 $this->
debug(
'will use lazy evaluation of wsdl from ' . $this->endpoint);
7280 }
7281 $this->endpointType = 'wsdl';
7282 } else {
7283 $this->
debug(
"instantiate SOAP with endpoint at $endpoint");
7284 $this->endpointType = 'soap';
7285 }
7286 }
7287
7313 public function call(
$operation,
$params = array(),
$namespace =
'http://tempuri.org', $soapAction =
'', $headers =
false, $rpcParams =
null, $style =
'rpc', $use =
'encoded')
7314 {
7316 $this->fault = false;
7318 $this->request = '';
7319 $this->response = '';
7320 $this->responseData = '';
7321 $this->faultstring = '';
7322 $this->faultcode = '';
7323 $this->opData = array();
7324
7325 $this->
debug(
"call: operation=$operation, namespace=$namespace, soapAction=$soapAction, rpcParams=$rpcParams, style=$style, use=$use, endpointType=$this->endpointType");
7328 if ($headers) {
7329 $this->requestHeaders = $headers;
7330 }
7331 if ($this->endpointType ==
'wsdl' && is_null($this->
wsdl)) {
7334 return false;
7335 }
7336 }
7337
7339
7341 $this->
debug(
"found operation");
7343 if (isset(
$opData[
'soapAction'])) {
7344 $soapAction =
$opData[
'soapAction'];
7345 }
7346 if (! $this->forceEndpoint) {
7347 $this->endpoint =
$opData[
'endpoint'];
7348 } else {
7350 }
7353 $use =
$opData[
'input'][
'use'];
7354
7356 $nsPrefix = 'ns' . rand(1000, 9999);
7358 }
7360
7362 $this->
debug(
"serializing param string for WSDL operation $operation");
7364 } elseif (is_array(
$params)) {
7365 $this->
debug(
"serializing param array for WSDL operation $operation");
7367 } else {
7368 $this->
debug(
'params must be array or string');
7369 $this->
setError(
'params must be array or string');
7370 return false;
7371 }
7373 if (isset(
$opData[
'input'][
'encodingStyle'])) {
7374 $encodingStyle =
$opData[
'input'][
'encodingStyle'];
7375 } else {
7376 $encodingStyle = '';
7377 }
7381 $this->
debug(
'got wsdl error: ' . $errstr);
7382 $this->
setError(
'wsdl error: ' . $errstr);
7383 return false;
7384 }
7385 } elseif ($this->endpointType == 'wsdl') {
7386
7389 $this->
setError(
'operation ' . $operation .
' not present.');
7390 $this->
debug(
"operation '$operation' not present.");
7391 return false;
7392 } else {
7393
7394
7395 $nsPrefix = 'ns' . rand(1000, 9999);
7396
7399 $this->
debug(
"serializing param string for operation $operation");
7401 } elseif (is_array(
$params)) {
7402 $this->
debug(
"serializing param array for operation $operation");
7403 foreach (
$params as $k => $v) {
7405 }
7406 } else {
7407 $this->
debug(
'params must be array or string');
7408 $this->
setError(
'params must be array or string');
7409 return false;
7410 }
7412 if ($use == 'encoded') {
7413 $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/';
7414 } else {
7415 $encodingStyle = '';
7416 }
7417 }
7418
7419 if ($style == 'rpc') {
7420 if ($use == 'literal') {
7421 $this->
debug(
"wrapping RPC request with literal method element");
7423
7424 $payload =
"<$nsPrefix:$operation xmlns:$nsPrefix=\"$namespace\">" .
7426 "</$nsPrefix:$operation>";
7427 } else {
7429 }
7430 } else {
7431 $this->
debug(
"wrapping RPC request with encoded method element");
7433 $payload =
"<$nsPrefix:$operation xmlns:$nsPrefix=\"$namespace\">" .
7435 "</$nsPrefix:$operation>";
7436 } else {
7439 "</$operation>";
7440 }
7441 }
7442 }
7443
7445 $this->
debug(
"endpoint=$this->endpoint, soapAction=$soapAction, namespace=$namespace, style=$style, use=$use, encodingStyle=$encodingStyle");
7446 $this->
debug(
'SOAP message length=' . strlen($soapmsg) .
' contents (max 1000 bytes)=' . substr($soapmsg, 0, 1000));
7447
7448 $return = $this->
send($this->
getHTTPBody($soapmsg), $soapAction, $this->timeout, $this->response_timeout);
7450 $this->
debug(
'Error: ' . $errstr);
7451 return false;
7452 } else {
7454 $this->
debug(
'sent message successfully and got a(n) ' . gettype(
$return));
7456
7457
7459 $this->
debug(
'got fault');
7460 $this->
setError($return[
'faultcode'] .
': ' .
$return[
'faultstring']);
7461 $this->fault = true;
7462 foreach (
$return as $k => $v) {
7463 $this->$k = $v;
7464 $this->
debug(
"$k = $v<br>");
7465 }
7467 } elseif ($style == 'document') {
7468
7469
7471 } else {
7472
7474
7475
7478 }
7479
7481 $this->
debug(
'return shifted value: ');
7484
7485 } else {
7486 return "";
7487 }
7488 }
7489 }
7490 }
7491
7498 {
7501 $this->
debug(
'checkWSDL');
7502
7504 $this->
debug(
'got wsdl error: ' . $errstr);
7505 $this->
setError(
'wsdl error: ' . $errstr);
7507 $this->bindingType = 'soap';
7508 $this->
debug(
'got ' . count($this->operations) .
' operations from wsdl ' . $this->wsdlFile .
' for binding type ' . $this->bindingType);
7510 $this->bindingType = 'soap12';
7511 $this->
debug(
'got ' . count($this->operations) .
' operations from wsdl ' . $this->wsdlFile .
' for binding type ' . $this->bindingType);
7512 $this->
debug(
'**************** WARNING: SOAP 1.2 BINDING *****************');
7513 } else {
7514 $this->
debug(
'getOperations returned false');
7515 $this->
setError(
'no operations defined in the WSDL document!');
7516 }
7517 }
7518
7525 {
7526 $this->
debug(
'instantiating wsdl class with doc: ' . $this->wsdlFile);
7527 $this->
wsdl =
new wsdl(
'', $this->proxyhost, $this->proxyport, $this->proxyusername, $this->proxypassword, $this->timeout, $this->response_timeout, $this->curl_options, $this->use_curl);
7528 $this->
wsdl->
setCredentials($this->username, $this->password, $this->authtype, $this->certRequest);
7531 }
7532
7541 {
7542 if ($this->endpointType ==
'wsdl' && is_null($this->
wsdl)) {
7545 return false;
7546 }
7547 }
7550 }
7551 $this->
debug(
"No data for operation: $operation");
7552 }
7553
7569 {
7571
7572 switch (true) {
7573
7574 case preg_match('/^http/', $this->endpoint):
7575 $this->
debug(
'transporting via HTTP');
7576 if ($this->persistentConnection == true && is_object($this->persistentConnection)) {
7578 } else {
7580 if ($this->persistentConnection) {
7581 $http->usePersistentConnection();
7582 }
7583 }
7585 $http->setSOAPAction($soapaction);
7586 if ($this->proxyhost && $this->proxyport) {
7587 $http->setProxy($this->proxyhost, $this->proxyport, $this->proxyusername, $this->proxypassword);
7588 }
7589 if ($this->authtype != '') {
7590 $http->setCredentials($this->username, $this->password, $this->authtype, array(), $this->certRequest);
7591 }
7592 if ($this->http_encoding != '') {
7593 $http->setEncoding($this->http_encoding);
7594 }
7595 $this->
debug(
'sending message, length=' . strlen($msg));
7596 if (preg_match('/^http:/', $this->endpoint)) {
7597
7599 } elseif (preg_match('/^https/', $this->endpoint)) {
7600
7601
7602
7603
7604
7605
7607 } else {
7608 $this->
setError(
'no http/s in endpoint url');
7609 }
7610 $this->request =
$http->outgoing_payload;
7611 $this->response =
$http->incoming_payload;
7614
7615
7616 if ($this->persistentConnection) {
7617 $http->clearDebug();
7618 if (!is_object($this->persistentConnection)) {
7619 $this->persistentConnection =
$http;
7620 }
7621 }
7622
7623 if ($err =
$http->getError()) {
7624 $this->
setError(
'HTTP Error: ' . $err);
7625 return false;
7627 return false;
7628 } else {
7629 $this->
debug(
'got response, length=' . strlen($this->responseData) .
' type=' .
$http->incoming_headers[
'content-type']);
7631 }
7632 break;
7633 default:
7634 $this->
setError(
'no transport found, or selected transport is not yet supported!');
7635 return false;
7636 break;
7637 }
7638 }
7639
7649 {
7650 $this->
debug(
'Entering parseResponse() for data of length ' . strlen(
$data) .
' headers:');
7652 if (!strstr($headers['content-type'], 'text/xml')) {
7653 $this->
setError(
'Response not of type text/xml: ' . $headers[
'content-type']);
7654 return false;
7655 }
7656 if (strpos($headers['content-type'], '=')) {
7657 $enc = str_replace('"', '', substr(strstr($headers["content-type"], '='), 1));
7658 $this->
debug(
'Got response encoding: ' . $enc);
7659 if (preg_match('/^(ISO-8859-1|US-ASCII|UTF-8)$/i', $enc)) {
7660 $this->xml_encoding = strtoupper($enc);
7661 } else {
7662 $this->xml_encoding = 'US-ASCII';
7663 }
7664 } else {
7665
7666 $this->xml_encoding = 'ISO-8859-1';
7667 }
7668 $this->
debug(
'Use encoding: ' . $this->xml_encoding .
' when creating nusoap_parser');
7669 $parser =
new nusoap_parser(
$data, $this->xml_encoding, $this->operation, $this->decode_utf8);
7670
7672
7673 if ($errstr = $parser->getError()) {
7675
7676 unset($parser);
7677 return false;
7678 } else {
7679
7680 $this->responseHeaders = $parser->getHeaders();
7681
7682 $this->responseHeader = $parser->get_soapheader();
7683
7684 $return = $parser->get_soapbody();
7685
7686 $this->document = $parser->document;
7687
7688 unset($parser);
7689
7691 }
7692 }
7693
7702 {
7703 $this->
debug(
"setCurlOption option=$option, value=");
7705 $this->curl_options[$option] = $value;
7706 }
7707
7715 {
7716 $this->
debug(
"setEndpoint(\"$endpoint\")");
7718 }
7719
7727 {
7728 $this->
debug(
"setHeaders headers=");
7730 $this->requestHeaders = $headers;
7731 }
7732
7740 {
7742 }
7743
7751 {
7753 }
7754
7765 {
7770 }
7771
7782 {
7783 $this->
debug(
"setCredentials username=$username authtype=$authtype certRequest=");
7789 }
7790
7798 {
7799 $this->
debug(
"setHTTPEncoding(\"$enc\")");
7800 $this->http_encoding = $enc;
7801 }
7802
7810 {
7811 $this->
debug(
"setUseCURL($use)");
7812 $this->use_curl = $use;
7813 }
7814
7821 {
7822 $this->
debug(
"useHTTPPersistentConnection");
7823 $this->persistentConnection = true;
7824 }
7825
7838 {
7840 }
7841
7854 {
7855 $this->defaultRpcParams = $rpcParams;
7856 }
7857
7866 {
7867 $r = rand();
7869
7871 $this->
debug(
"Error from _getProxyClassCode, so return NULL");
7872 return null;
7873 }
7874
7875 eval($evalStr);
7876
7877 eval("\$proxy = new nusoap_proxy_$r('');");
7878
7879 $proxy->endpointType = 'wsdl';
7884
7905 return $proxy;
7906 }
7907
7915 {
7916 $this->
debug(
"in getProxy endpointType=$this->endpointType");
7918 if ($this->endpointType != 'wsdl') {
7919 $evalStr = 'A proxy can only be created for a WSDL client';
7921 $evalStr = "echo \"$evalStr\";";
7922 return $evalStr;
7923 }
7924 if ($this->endpointType ==
'wsdl' && is_null($this->
wsdl)) {
7927 return "echo \"" . $this->
getError() .
"\";";
7928 }
7929 }
7930 $evalStr = '';
7933
7934 if (
sizeof(
$opData[
'input'][
'parts']) > 0) {
7935 $paramStr = '';
7936 $paramArrayStr = '';
7937 $paramCommentStr = '';
7938 foreach (
$opData[
'input'][
'parts'] as $name => $type) {
7939 $paramStr .= "\$$name, ";
7940 $paramArrayStr .= "'$name' => \$$name, ";
7941 $paramCommentStr .= "$type \$$name, ";
7942 }
7943 $paramStr = substr($paramStr, 0, strlen($paramStr) - 2);
7944 $paramArrayStr = substr($paramArrayStr, 0, strlen($paramArrayStr) - 2);
7945 $paramCommentStr = substr($paramCommentStr, 0, strlen($paramCommentStr) - 2);
7946 } else {
7947 $paramStr = '';
7948 $paramArrayStr = '';
7949 $paramCommentStr = 'void';
7950 }
7952 $evalStr .= "// $paramCommentStr
7953 function " . str_replace(
'.',
'__',
$operation) .
"($paramStr) {
7954 \$params = array($paramArrayStr);
7955 return \$this->call('$operation', \$params, '" .
$opData[
'namespace'] .
"', '" . (isset(
$opData[
'soapAction']) ?
$opData[
'soapAction'] :
'') .
"');
7956 }
7957 ";
7958 unset($paramStr);
7959 unset($paramCommentStr);
7960 }
7961 }
7962 $evalStr = 'class nusoap_proxy_' . $r . ' extends nusoap_client {
7963 ' . $evalStr . '
7964}';
7965 return $evalStr;
7966 }
7967
7975 {
7976 $r = rand();
7978 }
7979
7988 {
7989 return $soapmsg;
7990 }
7991
8001 {
8002 return 'text/xml';
8003 }
8004
8015 {
8017 }
8018
8019
8020
8021
8022
8023
8024
8026 {
8027 $this->decode_utf8 = $bool;
8028 return true;
8029 }
8030
8039 public function setCookie($name, $value)
8040 {
8041 if (strlen($name) == 0) {
8042 return false;
8043 }
8044 $this->cookies[] = array('name' => $name, 'value' => $value);
8045 return true;
8046 }
8047
8055 {
8057 }
8058
8066 {
8067 if (sizeof($this->cookies) == 0) {
8068 return true;
8069 }
8070 $this->
debug(
'checkCookie: check ' .
sizeof($this->cookies) .
' cookies');
8072 $this->cookies = array();
8073 foreach ($curr_cookies as $cookie) {
8074 if (! is_array($cookie)) {
8075 $this->
debug(
'Remove cookie that is not an array');
8076 continue;
8077 }
8078 if ((isset($cookie['expires'])) && (! empty($cookie['expires']))) {
8079 if (strtotime($cookie['expires']) > time()) {
8080 $this->cookies[] = $cookie;
8081 } else {
8082 $this->
debug(
'Remove expired cookie ' . $cookie[
'name']);
8083 }
8084 } else {
8085 $this->cookies[] = $cookie;
8086 }
8087 }
8088 $this->
debug(
'checkCookie: ' .
sizeof($this->cookies) .
' cookies left in array');
8089 return true;
8090 }
8091
8100 {
8101 if (sizeof($this->cookies) == 0) {
8102
8104 $this->
debug(
'Setting new cookie(s)');
8106 }
8107 return true;
8108 }
8110
8111 return true;
8112 }
8113
8115 if (!is_array($newCookie)) {
8116 continue;
8117 }
8118 if ((!isset($newCookie['name'])) || (!isset($newCookie['value']))) {
8119 continue;
8120 }
8121 $newName = $newCookie['name'];
8122
8123 $found = false;
8124 for ($i = 0; $i < count($this->cookies); $i++) {
8125 $cookie = $this->cookies[$i];
8126 if (!is_array($cookie)) {
8127 continue;
8128 }
8129 if (!isset($cookie['name'])) {
8130 continue;
8131 }
8132 if ($newName != $cookie['name']) {
8133 continue;
8134 }
8135 $newDomain = isset($newCookie['domain']) ? $newCookie['domain'] : 'NODOMAIN';
8136 $domain = isset($cookie['domain']) ? $cookie['domain'] : 'NODOMAIN';
8137 if ($newDomain != $domain) {
8138 continue;
8139 }
8140 $newPath = isset($newCookie['path']) ? $newCookie['path'] : 'NOPATH';
8141 $path = isset($cookie[
'path']) ? $cookie[
'path'] :
'NOPATH';
8142 if ($newPath !=
$path) {
8143 continue;
8144 }
8145 $this->cookies[$i] = $newCookie;
8146 $found = true;
8147 $this->
debug(
'Update cookie ' . $newName .
'=' . $newCookie[
'value']);
8148 break;
8149 }
8150 if (! $found) {
8151 $this->
debug(
'Add cookie ' . $newName .
'=' . $newCookie[
'value']);
8152 $this->cookies[] = $newCookie;
8153 }
8154 }
8155 return true;
8156 }
8157}
8158
8159if (!extension_loaded('soap')) {
8164 {
8165 }
8166}
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
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...
setError($str)
sets error string
getNamespaceFromPrefix($prefix)
pass it a prefix, it returns a namespace
debug($string)
adds debug data to the instance debug string with formatting
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.
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.
expandQname($qname)
expands (changes prefix to namespace) a qualified name
varDump($data)
Returns a string with the output of var_dump.
getError()
returns error string if present
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)
[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.
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
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
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.
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
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
For creating serializable abstractions of native PHP types.
serialize($use='encoded')
return serialized value
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
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