Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <style>
- pre {max-height: 400px; overflow: auto; background-color: #EEEEEE;}
- div {border: solid 2px black;}
- .error {border: solid 1px red;}
- .notice {border: solid 1px blue;}
- .success { border: solid 1px green;}
- </style>
- <?php
- class XMLCurler
- {
- public $username = '[redacted]';
- public $password = '[redacted]';
- public $url = 'https://amp.xplan.iress.com.au/RPC2/';
- public $ch; // the curl handle
- public $token;
- public $results;
- public function __construct() {
- if ($this->connect()) {
- if ($this->login()) {
- echo "<div class=\"success\">Successful Connection & Login. Token: {$this->token}</div>";
- }
- }
- }
- public function __destruct() {
- if ($this->ch) {
- $this->disconnect();
- }
- }
- public function connect() {
- if (!$this->ch = curl_init($this->url)) { // generate curl handle
- echo "<div class=\"error\">CURL Error While Connecting (check url)";
- return false;
- }
- return true;
- }
- public function disconnect() {
- curl_close($this->ch);
- }
- public function processResponse($response) {
- if (!$response) {
- echo "<div class=\"error\">CURL Error While Attempting to Login - No XML token string<br><b>" , curl_error($this->ch) , "</b></div>";
- return false;
- }
- $decoded = xmlrpc_decode($response);
- if (is_array($decoded) && xmlrpc_is_fault($decoded)) {
- echo "<div class=\"error\">Error Response: {$decoded['faultString']} ({$decoded['faultCode']})</div>";
- return false;
- }
- return $decoded;
- }
- public function login() {
- $postfields = xmlrpc_encode_request('edai.Login', array($this->username, $this->password)); // package as xml
- curl_setopt($this->ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml'));
- curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, true);
- curl_setopt($this->ch, CURLOPT_POSTFIELDS, $postfields);
- curl_setopt($this->ch, CURLOPT_SSL_VERIFYHOST, 0); // not advised, I need to find out how to avoid this
- curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, 0); // not advised, I need to find out how to avoid this
- if (!$token = $this->processResponse(curl_exec($this->ch))) {
- return false;
- }
- if (!preg_match("~^[\w+]{20}$~", $token)) {
- echo "<div class=\"error\">Invalid/Unexpected Token Generated<br><b>$token</b>";
- return false;
- }
- $this->token = $token; // cache the valid token
- return true;
- }
- public function listChildren($path) {
- $method = "edai.ListChildren";
- $request = xmlrpc_encode_request($method, array($this->token, $path));
- echo "<div class=\"notice\">XMLRPC Encoded Request (for $method): <pre>" , htmlentities($request) , "</pre></div>";
- curl_setopt($this->ch, CURLOPT_POSTFIELDS, $request);
- if (!$results = $this->processResponse(curl_exec($this->ch))) {
- return false;
- }
- $this->results = $results; // cache the valid results
- return true;
- }
- public function search($basepath, $queryxml) {
- $method = "edai.Search";
- /** Desperate/Manual xml construction ...
- * $xml = new DOMDocument("1.0", "utf-8");
- * $xml->appendChild($methodCall = $xml->createElement("methodCall"));
- * $methodCall->appendChild($methodName = $xml->createElement("methodName"));
- * $methodCall->appendChild($params = $xml->createElement("params"));
- * $params->appendChild($param1 = $xml->createElement("param"));
- * $param1->appendChild($value1 = $xml->createElement("value"));
- * $value1->appendChild($string1 = $xml->createElement("string"));
- * $params->appendChild($param2 = $xml->createElement("param"));
- * $param2->appendChild($value2 = $xml->createElement("value"));
- * $value2->appendChild($string2 = $xml->createElement("string"));
- * $params->appendChild($param3 = $xml->createElement("param"));
- * $param3->appendChild($value3 = $xml->createElement("value"));
- * $value3->appendChild($string3 = $xml->createElement("string"));
- * $string3->appendChild($EntitySearch = $xml->createElement("EntitySearch"));
- * $EntitySearch->appendChild($SearchResult1 = $xml->createElement("SearchResult"));
- * $SearchResult1->setAttribute("field", "first_name");
- * $EntitySearch->appendChild($SearchResult2 = $xml->createElement("SearchResult"));
- * $SearchResult2->setAttribute('field', "last_name");
- * $EntitySearch->appendChild($SearchQuick = $xml->createElement("SearchQuick"));
- * $SearchQuick->appendChild($s = $xml->createElement("s"));
- * $xpath = new DOMXPath($xml);
- * $result1 = $xpath->query("//methodName");
- * $result1->item(0)->nodeValue = $method;
- * $result2 = $xpath->query("//params/param[1]/value/string");
- * $result2->item(0)->nodeValue = $this->token;
- * $result3 = $xpath->query("//params/param[2]/value/string");
- * $result3->item(0)->nodeValue = "entitymgr/client";
- * $result4 = $xpath->query("//SearchQuick/s");
- * $result4->item(0)->nodeValue = "last_name:Smith";
- * $xml->formatOutput = true;
- * $request = $xml->saveXML();
- */
- /** Desperately attempted passing array ...
- * $queryarray = array(
- * "EntitySearch" => array(
- * array(
- * "SearchResult" => array(
- * "@attr" => array(
- * "field" => "first_name"
- * )
- * )
- * ),
- * array(
- * "SearchResult" => array(
- * "@attr" => array(
- * "field" => "last_name"
- * )
- * )
- * ),
- * array(
- * "SearchQuick" => array(
- * "s" => "last_name:Smith"
- * )
- * )
- * )
- * );
- */
- $request = xmlrpc_encode_request($method, array($this->token, $basepath, $queryxml)); // this mutates the nest $queryxml string
- // Causes:
- //Error Response: UNKNOWN(CORBA.UNKNOWN(omniORB.UNKNOWN_PythonException, CORBA.COMPLETED_MAYBE)) (-32505)
- //$request = html_entity_decode($request); // repair encoded entities
- //$request = preg_replace('~(?:>\K\s+)|(?:\s+(?=<))~', '', $request); // strip every whitespace character between tags (hack)
- // Causes:
- // Error Response: ExpatError(syntax error: line 1, column 0 (byte 0)) (-32505)
- echo "<div class=\"notice\">XMLRPC Encoded Request (for $method): <pre>" , htmlentities($request) , "</pre></div>";
- curl_setopt($this->ch, CURLOPT_POSTFIELDS, $request);
- if (!$results = $this->processResponse(curl_exec($this->ch))) {
- return false;
- }
- $this->results = $results; // cache the valid results
- return true;
- }
- }
- $XC = new XMLCurler();
- /* edai.ListChildren works as desired/expected */
- $path = "/entitymgr/client";
- if ($XC->listChildren($path)) {
- echo "<div>List of Children Successful.<pre>";
- var_export($XC->results);
- echo "</pre></div>";
- }
- /* edai.Search does not work */
- $basepath = "entitymgr/client";
- $queryxml = <<<XML
- <EntitySearch>
- <SearchResult field="first_name"/>
- <SearchResult field="last_name"/>
- <SearchQuick><s>last_name:Smith</s></SearchQuick>
- </EntitySearch>
- XML;
- if ($XC->search($basepath, $queryxml)) {
- echo "<div>Search Successful.<pre>";
- var_export($XC->results);
- echo "</pre></div>";
- }
Advertisement
Add Comment
Please, Sign In to add comment