diff --git a/include/xmlrpcutils/utils.php b/include/xmlrpcutils/utils.php new file mode 100644 index 000000000..401d0d933 --- /dev/null +++ b/include/xmlrpcutils/utils.php @@ -0,0 +1,267 @@ + + * Andreas Oesterreicher < andreas.oesterreicher@technikum-wien.at > + * Rudolf Hangl < rudolf.hangl@technikum-wien.at > + * Gerald Simane-Sequens < gerald.simane-sequens@technikum-wien.at > + */ + + /* + This file is part of, or distributed with, libXMLRPC - a C library for + xml-encoded function calls. + + Author: Dan Libby (dan@libby.com) + Epinions.com may be contacted at feedback@epinions-inc.com + */ + + +// ensure extension is loaded. +// a function to ensure the xmlrpc extension is loaded. +// xmlrpc_epi_dir = directory where libxmlrpc.so.0 is located +// xmlrpc_php_dir = directory where xmlrpc-epi-php.so is located +function xu_load_extension($xmlrpc_php_dir="") { + $bSuccess = false; + if(!extension_loaded('xmlrpc')) { + $bSuccess = true; + @putenv("LD_LIBRARY_PATH=/usr/lib/php4/apache/xmlrpc/"); + if ($xmlrpc_php_dir) { + $xmlrpc_php_dir .= '/'; + } + if (!extension_loaded("xmlrpc")) { + $bSuccess = @dl($xmlrpc_php_dir . "xmlrpc-epi-php.so"); + } + } + return $bSuccess; +} + +/* generic function to call an http server with post method */ +function xu_query_http_post($request, $host, $uri, $port, $debug, + $timeout, $user, $pass, $secure=false) { + $response_buf = ""; + if ($host && $uri && $port) { + $content_len = strlen($request); + + $fsockopen = $secure ? "fsockopen_ssl" : "fsockopen"; + if (!function_exists($fsockopen)) { + dbg1("opening socket not OK : change from $fsockopen to fsockopen", $debug); + $fsockopen="fsockopen"; + } + + dbg1("opening socket to host: $host, port: $port, uri: $uri", $debug); + $query_fd = $fsockopen($host, $port, $errno, $errstr, 10); + + if ($query_fd) { + + $auth = ""; + if ($user) { + dbg1("sending User Authorization: \n$user\n", $debug); + $auth = "Authorization: Basic " .base64_encode($user . ":" . $pass) . "\r\n"; + } + + $http_request = + "POST $uri HTTP/1.0\r\n" . + "User-Agent: xmlrpc-epi-php/0.2 (PHP)\r\n" . + "Host: $host".($port!=''?":$port":"")."\r\n" . + $auth . + "Content-Type: text/xml\r\n" . + "Content-Length: $content_len\r\n" . + "\r\n" . + $request; + + dbg1("sending http request: \n$http_request\n", $debug); + fputs($query_fd, $http_request, strlen($http_request)); + dbg1("receiving response...", $debug); + $header_parsed = false; + $line = fgets($query_fd, 4096); + $response_buf=""; + while ($line) { + if (!$header_parsed) { + if ($line === "\r\n" || $line === "\n") { + $header_parsed = 1; + } + dbg2("got header - $line", $debug); + } + else { + $response_buf .= $line; + } + $line = fgets($query_fd, 4096); + } + if (isset($query_fd)) + fclose($query_fd); + } + else { + dbg1("socket open failed", $debug); + return false; + } + } + else { + dbg1("missing param(s)", $debug); + return false; + } + dbg1("got response:. \n$response_buf\n\n", $debug); + return $response_buf; +} + +function xu_fault_code($code, $string) { + return array('faultCode' => $code, + 'faultString' => $string); +} + +function find_and_decode_xml($buf, $debug) { + $retval=''; + if (strlen($buf)) { + $xml_begin = substr($buf, strpos($buf, " 'xml', + * 'verbosity' => 'pretty', + * 'escaping' => array('markup', 'non-ascii', 'non-print'), + * 'version' => 'xmlrpc', + * 'encoding' => 'utf-8' + * ); + * or + * + * $output_options = array('output_type' => 'php'); + */ +function xu_rpc_http_concise($params) { + $host = $uri = $port = $method = $args = $debug = null; + $timeout = $user = $pass = $secure = $debug = $output= null; + + extract($params); + + // default values + if(!$port) { + $port = 80; + } + if(!$uri) { + $uri = '/'; + } + if(!$output) { + $output = array('version' => 'xmlrpc'); + } + + $response_buf = ""; + $retval= "fail: utils.php Param not OK "; + if ($host && $uri && $port) { + if (!$request_xml = xmlrpc_encode_request($method, $args, $output)) + return "fail: xmlrpc_encode_request "; + + if (!$response_buf = xu_query_http_post($request_xml, + $host, + $uri, + $port, + $debug, + $timeout, + $user, + $pass, + $secure)) + return "fail: xu_query_http_post "; + + $retval = find_and_decode_xml($response_buf, $debug); + } + return $retval; +} + +/* call an xmlrpc method on a remote http server. legacy support. */ +function xu_rpc_http($method, $args, $host, $uri="/", $port=80, $debug=false, + $timeout=0, $user=false, $pass=false, $secure=false) { + return xu_rpc_http_concise( + array( + method => $method, + args => $args, + host => $host, + uri => $uri, + port => $port, + debug => $debug, + timeout => $timeout, + user => $user, + pass => $pass, + secure => $secure + )); +} + +function xu_is_fault($arg) { + // xmlrpc extension finally supports this. + return is_array($arg) ? xmlrpc_is_fault($arg) : false; +} + +/* sets some http headers and prints xml */ +function xu_server_send_http_response($xml) { + header("Content-type: text/xml"); + header("Content-length: " . strlen($xml) ); + echo $xml; +} + +function dbg($msg) { + echo "

$msg

"; flush(); +} +function dbg1($msg, $debug_level) { + if ($debug_level >= 1) { + dbg($msg); + } +} +function dbg2($msg, $debug_level) { + if ($debug_level >= 2) { + dbg($msg); + } +} +?>