echo('x')."\n"; * print $client->add(1, 3)."\n"; */ class XmlrpcClient { private $url; private $urlparts; public $bt = null; public function __construct($url) { $this->url = $url; $this->urlparts = parse_url($this->url); if (empty($this->urlparts['port'])) { $this->urlparts['port'] = 80; } if (empty($this->urlparts['path'])) { $this->urlparts['path'] = '/'; } } private function http_post($request) { $host = $path = $port = $user = $pass = null; extract($this->urlparts); if ($scheme == 'https') { $host = 'ssl://'.$host; } $query_fd = fsockopen($host, $port, $errno, $errstr, 10); if (!$query_fd) return null; $auth = ''; if ($user) { $auth = 'Authorization: Basic ' . base64_encode("$user:$pass") . "\r\n"; } $content_len = strlen($request); $http_request = "POST $path HTTP/1.0\r\n" . $auth . "Content-Type: text/xml\r\n" . "Content-Length: $content_len\r\n" . "Connection: Close\r\n" . "Host: $host:$port\r\n" . "\r\n" . $request; fputs($query_fd, $http_request, strlen($http_request)); $buf = ''; while (!feof($query_fd)) { $buf .= fread($query_fd, 8192); } fclose($query_fd); return $buf; } private function find_and_decode_xml($buf) { $pos = strpos($buf, 'bt) { $this->bt->start($method . "\n" . var_export($args, true)); } $answer = $this->http_post($query, $this->urlparts); if ($this->bt) { $this->bt->stop(); } if (is_null($answer)) { Platal::page()->trigError("L'accès aux listes de diffusion n'est pas disponible actuellement."); $this->bt->update(0, "Connection failed"); return null; } Platal::assert(starts_with($answer, 'HTTP/1.0 200 OK'), "HTTP Error:\n" . $answer, "Une erreur est survenue lors de l'accès aux listes de diffusion."); $result = $this->find_and_decode_xml($answer); if ($this->bt) { if (is_array($result) && isset($result['faultCode'])) { $this->bt->update(0, $result['faultString']); } else { $this->bt->update(count($result)); } } else { Platal::assert(!is_array($result) || !isset($result['faultCode']), "RPC Error:\n" . $answer, "Une erreur est survenue lors de l'accès aux listes de diffusion."); } if (is_array($result) && isset($result['faultCode'])) { trigger_error("Error in xmlrpc call $function\n". " code : {$result['faultCode']}\n". " message: {$result['faultString']}\n"); return null; } return $result; } } // vim:set et sw=4 sts=4 sws=4 enc=utf-8: ?>