* 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);
}
}
?>