WordPress.org

Make WordPress Core

Changeset 45016


Ignore:
Timestamp:
03/26/2019 11:10:21 PM (4 months ago)
Author:
SergeyBiryukov
Message:

Bootstrap/Load: Add support for XML requests to wp_die().

In addition to AJAX, XML-RPC, JSON, and JSONP requests, wp_die() now handles XML requests correctly, returning information in the expected content type.

Props spacedmonkey, birgire.
Fixes #46026. See #44458.

Location:
trunk/src/wp-includes
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/functions.php

    r45015 r45016  
    30083008         */
    30093009        $function = apply_filters( 'wp_die_xmlrpc_handler', '_xmlrpc_wp_die_handler' );
     3010    } elseif ( wp_is_xml_request()
     3011        || function_exists( 'is_feed' ) && is_feed()
     3012        || function_exists( 'is_comment_feed' ) && is_comment_feed()
     3013        || function_exists( 'is_trackback' ) && is_trackback() ) {
     3014        /**
     3015         * Filters the callback for killing WordPress execution for XML requests.
     3016         *
     3017         * @since 5.2.0
     3018         *
     3019         * @param callable $function Callback function name.
     3020         */
     3021        $function = apply_filters( 'wp_die_xml_handler', '_xml_wp_die_handler' );
    30103022    } else {
    30113023        /**
    3012          * Filters the callback for killing WordPress execution for all non-Ajax, non-XML-RPC requests.
     3024         * Filters the callback for killing WordPress execution for all non-Ajax, non-JSON, non-XML requests.
    30133025         *
    30143026         * @since 3.0.0
     
    32203232
    32213233/**
     3234 * Kills WordPress execution and displays Ajax response with an error message.
     3235 *
     3236 * This is the handler for wp_die() when processing Ajax requests.
     3237 *
     3238 * @since 3.4.0
     3239 * @access private
     3240 *
     3241 * @param string       $message Error message.
     3242 * @param string       $title   Optional. Error title (unused). Default empty.
     3243 * @param string|array $args    Optional. Arguments to control behavior. Default empty array.
     3244 */
     3245function _ajax_wp_die_handler( $message, $title = '', $args = array() ) {
     3246    // Set default 'response' to 200 for AJAX requests.
     3247    $args = wp_parse_args(
     3248        $args,
     3249        array( 'response' => 200 )
     3250    );
     3251
     3252    list( $message, $title, $r ) = _wp_die_process_input( $message, $title, $args );
     3253
     3254    if ( ! headers_sent() ) {
     3255        // This is intentional. For backward-compatibility, support passing null here.
     3256        if ( null !== $args['response'] ) {
     3257            status_header( $r['response'] );
     3258        }
     3259        nocache_headers();
     3260    }
     3261
     3262    if ( is_scalar( $message ) ) {
     3263        $message = (string) $message;
     3264    } else {
     3265        $message = '0';
     3266    }
     3267
     3268    if ( $r['exit'] ) {
     3269        die( $message );
     3270    }
     3271
     3272    echo $message;
     3273}
     3274
     3275/**
    32223276 * Kills WordPress execution and displays JSON response with an error message.
    32233277 *
     
    33323386
    33333387/**
    3334  * Kills WordPress execution and displays Ajax response with an error message.
    3335  *
    3336  * This is the handler for wp_die() when processing Ajax requests.
    3337  *
    3338  * @since 3.4.0
     3388 * Kill WordPress execution and display XML message with error message.
     3389 *
     3390 * This is the handler for wp_die when processing XML requests.
     3391 *
     3392 * @since 5.2.0
    33393393 * @access private
    33403394 *
    33413395 * @param string       $message Error message.
    3342  * @param string       $title   Optional. Error title (unused). Default empty.
     3396 * @param string       $title   Optional. Error title. Default empty.
    33433397 * @param string|array $args    Optional. Arguments to control behavior. Default empty array.
    33443398 */
    3345 function _ajax_wp_die_handler( $message, $title = '', $args = array() ) {
    3346     // Set default 'response' to 200 for AJAX requests.
    3347     $args = wp_parse_args(
    3348         $args,
    3349         array( 'response' => 200 )
    3350     );
    3351 
     3399function _xml_wp_die_handler( $message, $title = '', $args = array() ) {
    33523400    list( $message, $title, $r ) = _wp_die_process_input( $message, $title, $args );
    33533401
     3402    $message = htmlspecialchars( $message );
     3403    $title   = htmlspecialchars( $title );
     3404
     3405    $xml = <<<EOD
     3406<error>
     3407    <code>{$r['code']}</code>
     3408    <title><![CDATA[{$title}]]></title>
     3409    <message><![CDATA[{$message}]]></message>
     3410    <data>
     3411        <status>{$r['response']}</status>
     3412    </data>
     3413</error>
     3414
     3415EOD;
     3416
    33543417    if ( ! headers_sent() ) {
    3355         // This is intentional. For backward-compatibility, support passing null here.
    3356         if ( null !== $args['response'] ) {
     3418        header( 'Content-Type: text/xml; charset=utf-8' );
     3419        if ( null !== $r['response'] ) {
    33573420            status_header( $r['response'] );
    33583421        }
     
    33603423    }
    33613424
    3362     if ( is_scalar( $message ) ) {
    3363         $message = (string) $message;
    3364     } else {
    3365         $message = '0';
    3366     }
    3367 
     3425    echo $xml;
    33683426    if ( $r['exit'] ) {
    3369         die( $message );
    3370     }
    3371 
    3372     echo $message;
     3427        die();
     3428    }
    33733429}
    33743430
  • trunk/src/wp-includes/load.php

    r45015 r45016  
    15301530
    15311531}
     1532
     1533/**
     1534 *
     1535 * Checks whether current request is a XML request, or is expecting a XML response.
     1536 *
     1537 * @since 5.2.0
     1538 *
     1539 * @return bool True if Accepts or Content-Type headers contain xml, false otherwise.
     1540 */
     1541function wp_is_xml_request() {
     1542    $accepted = array(
     1543        'text/xml',
     1544        'application/rss+xml',
     1545        'application/atom+xml',
     1546        'application/rdf+xml',
     1547        'text/xml+oembed',
     1548        'application/xml+oembed',
     1549    );
     1550
     1551    if ( isset( $_SERVER['HTTP_ACCEPT'] ) ) {
     1552        foreach ( $accepted as $type ) {
     1553            if ( false !== strpos( $_SERVER['HTTP_ACCEPT'], $type ) ) {
     1554                return true;
     1555            }
     1556        }
     1557    }
     1558
     1559    if ( isset( $_SERVER['CONTENT_TYPE'] ) && in_array( $_SERVER['CONTENT_TYPE'], $accepted, true ) ) {
     1560        return true;
     1561    }
     1562
     1563    return false;
     1564}
Note: See TracChangeset for help on using the changeset viewer.