WordPress/wp-includes/class-wp-http-ixr-client.php
Gary Pendergast aaf99e6913 Code is Poetry.
WordPress' code just... wasn't.
This is now dealt with.

Props jrf, pento, netweb, GaryJ, jdgrimes, westonruter, Greg Sherwood from PHPCS, and everyone who's ever contributed to WPCS and PHPCS.
Fixes #41057.


Built from https://develop.svn.wordpress.org/trunk@42343


git-svn-id: http://core.svn.wordpress.org/trunk@42172 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-11-30 23:11:00 +00:00

124 lines
3.2 KiB
PHP

<?php
/**
* WP_HTTP_IXR_Client
*
* @package WordPress
* @since 3.1.0
*/
class WP_HTTP_IXR_Client extends IXR_Client {
public $scheme;
/**
* @var IXR_Error
*/
public $error;
/**
* @param string $server
* @param string|bool $path
* @param int|bool $port
* @param int $timeout
*/
public function __construct( $server, $path = false, $port = false, $timeout = 15 ) {
if ( ! $path ) {
// Assume we have been given a URL instead
$bits = parse_url( $server );
$this->scheme = $bits['scheme'];
$this->server = $bits['host'];
$this->port = isset( $bits['port'] ) ? $bits['port'] : $port;
$this->path = ! empty( $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->scheme = 'http';
$this->server = $server;
$this->path = $path;
$this->port = $port;
}
$this->useragent = 'The Incutio XML-RPC PHP Library';
$this->timeout = $timeout;
}
/**
* @return bool
*/
public function query() {
$args = func_get_args();
$method = array_shift( $args );
$request = new IXR_Request( $method, $args );
$xml = $request->getXml();
$port = $this->port ? ":$this->port" : '';
$url = $this->scheme . '://' . $this->server . $port . $this->path;
$args = array(
'headers' => array( 'Content-Type' => 'text/xml' ),
'user-agent' => $this->useragent,
'body' => $xml,
);
// Merge Custom headers ala #8145
foreach ( $this->headers as $header => $value ) {
$args['headers'][ $header ] = $value;
}
/**
* Filters the headers collection to be sent to the XML-RPC server.
*
* @since 4.4.0
*
* @param array $headers Array of headers to be sent.
*/
$args['headers'] = apply_filters( 'wp_http_ixr_client_headers', $args['headers'] );
if ( $this->timeout !== false ) {
$args['timeout'] = $this->timeout;
}
// Now send the request
if ( $this->debug ) {
echo '<pre class="ixr_request">' . htmlspecialchars( $xml ) . "\n</pre>\n\n";
}
$response = wp_remote_post( $url, $args );
if ( is_wp_error( $response ) ) {
$errno = $response->get_error_code();
$errorstr = $response->get_error_message();
$this->error = new IXR_Error( -32300, "transport error: $errno $errorstr" );
return false;
}
if ( 200 != wp_remote_retrieve_response_code( $response ) ) {
$this->error = new IXR_Error( -32301, 'transport error - HTTP status code was not 200 (' . wp_remote_retrieve_response_code( $response ) . ')' );
return false;
}
if ( $this->debug ) {
echo '<pre class="ixr_response">' . htmlspecialchars( wp_remote_retrieve_body( $response ) ) . "\n</pre>\n\n";
}
// Now parse what we've got back
$this->message = new IXR_Message( wp_remote_retrieve_body( $response ) );
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;
}
}