You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
166 lines
4.5 KiB
166 lines
4.5 KiB
<?php |
|
|
|
/** |
|
* IXR_Client |
|
* |
|
* @package IXR |
|
* @since 1.5.0 |
|
* |
|
*/ |
|
class IXR_Client |
|
{ |
|
var $server; |
|
var $port; |
|
var $path; |
|
var $useragent; |
|
var $response; |
|
var $message = false; |
|
var $debug = false; |
|
var $timeout; |
|
var $headers = array(); |
|
|
|
// Storage place for an error message |
|
var $error = false; |
|
|
|
/** |
|
* PHP5 constructor. |
|
*/ |
|
function __construct( $server, $path = false, $port = 80, $timeout = 15 ) |
|
{ |
|
if (!$path) { |
|
// Assume we have been given a URL instead |
|
$bits = parse_url($server); |
|
$this->server = $bits['host']; |
|
$this->port = isset($bits['port']) ? $bits['port'] : 80; |
|
$this->path = isset($bits['path']) ? $bits['path'] : '/'; |
|
|
|
// Make absolutely sure we have a path |
|
if (!$this->path) { |
|
$this->path = '/'; |
|
} |
|
|
|
if ( ! empty( $bits['query'] ) ) { |
|
$this->path .= '?' . $bits['query']; |
|
} |
|
} else { |
|
$this->server = $server; |
|
$this->path = $path; |
|
$this->port = $port; |
|
} |
|
$this->useragent = 'The Incutio XML-RPC PHP Library'; |
|
$this->timeout = $timeout; |
|
} |
|
|
|
/** |
|
* PHP4 constructor. |
|
*/ |
|
public function IXR_Client( $server, $path = false, $port = 80, $timeout = 15 ) { |
|
self::__construct( $server, $path, $port, $timeout ); |
|
} |
|
|
|
function query() |
|
{ |
|
$args = func_get_args(); |
|
$method = array_shift($args); |
|
$request = new IXR_Request($method, $args); |
|
$length = $request->getLength(); |
|
$xml = $request->getXml(); |
|
$r = "\r\n"; |
|
$request = "POST {$this->path} HTTP/1.0$r"; |
|
|
|
// Merged from WP #8145 - allow custom headers |
|
$this->headers['Host'] = $this->server; |
|
$this->headers['Content-Type'] = 'text/xml'; |
|
$this->headers['User-Agent'] = $this->useragent; |
|
$this->headers['Content-Length']= $length; |
|
|
|
foreach( $this->headers as $header => $value ) { |
|
$request .= "{$header}: {$value}{$r}"; |
|
} |
|
$request .= $r; |
|
|
|
$request .= $xml; |
|
|
|
// Now send the request |
|
if ($this->debug) { |
|
echo '<pre class="ixr_request">'.htmlspecialchars($request)."\n</pre>\n\n"; |
|
} |
|
|
|
if ($this->timeout) { |
|
$fp = @fsockopen($this->server, $this->port, $errno, $errstr, $this->timeout); |
|
} else { |
|
$fp = @fsockopen($this->server, $this->port, $errno, $errstr); |
|
} |
|
if (!$fp) { |
|
$this->error = new IXR_Error(-32300, 'transport error - could not open socket'); |
|
return false; |
|
} |
|
fputs($fp, $request); |
|
$contents = ''; |
|
$debugContents = ''; |
|
$gotFirstLine = false; |
|
$gettingHeaders = true; |
|
while (!feof($fp)) { |
|
$line = fgets($fp, 4096); |
|
if (!$gotFirstLine) { |
|
// Check line for '200' |
|
if (strstr($line, '200') === false) { |
|
$this->error = new IXR_Error(-32300, 'transport error - HTTP status code was not 200'); |
|
return false; |
|
} |
|
$gotFirstLine = true; |
|
} |
|
if (trim($line) == '') { |
|
$gettingHeaders = false; |
|
} |
|
if (!$gettingHeaders) { |
|
// merged from WP #12559 - remove trim |
|
$contents .= $line; |
|
} |
|
if ($this->debug) { |
|
$debugContents .= $line; |
|
} |
|
} |
|
if ($this->debug) { |
|
echo '<pre class="ixr_response">'.htmlspecialchars($debugContents)."\n</pre>\n\n"; |
|
} |
|
|
|
// Now parse what we've got back |
|
$this->message = new IXR_Message($contents); |
|
if (!$this->message->parse()) { |
|
// XML error |
|
$this->error = new IXR_Error(-32700, 'parse error. not well formed'); |
|
return false; |
|
} |
|
|
|
// Is the message a fault? |
|
if ($this->message->messageType == 'fault') { |
|
$this->error = new IXR_Error($this->message->faultCode, $this->message->faultString); |
|
return false; |
|
} |
|
|
|
// Message must be OK |
|
return true; |
|
} |
|
|
|
function getResponse() |
|
{ |
|
// methodResponses can only have one param - return that |
|
return $this->message->params[0]; |
|
} |
|
|
|
function isError() |
|
{ |
|
return (is_object($this->error)); |
|
} |
|
|
|
function getErrorCode() |
|
{ |
|
return $this->error->code; |
|
} |
|
|
|
function getErrorMessage() |
|
{ |
|
return $this->error->message; |
|
} |
|
}
|
|
|