diff --git a/wp-includes/functions.php b/wp-includes/functions.php index af0d556252..5112785bc0 100644 --- a/wp-includes/functions.php +++ b/wp-includes/functions.php @@ -2854,6 +2854,42 @@ if ( 'rtl' == $text_direction ) : ?> die(); } +/** + * Kill WordPress execution and display XML message with error message. + * + * This is the handler for wp_die when processing XMLRPC requests. + * + * @since 3.2.0 + * @access private + * + * @param string $message Error message. + * @param string $title Error title. + * @param string|array $args Optional arguements to control behaviour. + */ +function _xmlrpc_wp_die_handler( $message, $title = '', $args = array() ) { + global $wp_xmlrpc_server; + $defaults = array( 'response' => 500 ); + + $r = wp_parse_args($args, $defaults); + + if ( $wp_xmlrpc_server ) { + $error = new IXR_Error( $r['response'] , $message); + $wp_xmlrpc_server->output( $error->getXml() ); + } + die(); +} + +/** + * Filter to enable special wp_die handler for xmlrpc requests. + * + * @since 3.2.0 + * @access private + */ +function _xmlrpc_wp_die_filter() { + return '_xmlrpc_wp_die_handler'; +} + + /** * Retrieve the WordPress home page URL. * diff --git a/xmlrpc.php b/xmlrpc.php index d7f54fe99a..ff7bfcde9e 100644 --- a/xmlrpc.php +++ b/xmlrpc.php @@ -98,6 +98,9 @@ function logIO($io,$msg) { if ( isset($HTTP_RAW_POST_DATA) ) logIO("I", $HTTP_RAW_POST_DATA); +// Make sure wp_die output is XML +add_filter( 'wp_die_handler', '_xmlrpc_wp_die_filter' ); + // Allow for a plugin to insert a different class to handle requests. $wp_xmlrpc_server_class = apply_filters('wp_xmlrpc_server_class', 'wp_xmlrpc_server'); $wp_xmlrpc_server = new $wp_xmlrpc_server_class;