Make WordPress Core

Changeset 47849


Ignore:
Timestamp:
05/23/2020 02:34:38 PM (6 years ago)
Author:
ocean90
Message:

Rest API: Ensure rest_ensure_response() upgrades WP_HTTP_Response to WP_REST_Response.

An instance of WP_HTTP_Response doesn't ensure that the required methods used in WP_REST_Server::dispatch() exist, currently causing a fatal error.

Props ali11007, TimothyBlynJacobs, ocean90.
Fixes #49495.

Location:
trunk
Files:
3 edited

Legend:

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

    r47842 r47849  
    507507 * Ensures a REST response is a response object (for consistency).
    508508 *
    509  * This implements WP_HTTP_Response, allowing usage of `set_status`/`header`/etc
     509 * This implements WP_REST_Response, allowing usage of `set_status`/`header`/etc
    510510 * without needing to double-check the object. Will also allow WP_Error to indicate error
    511511 * responses, so users should immediately check for this value.
    … …  
    513513 * @since 4.4.0
    514514 *
    515  * @param WP_HTTP_Response|WP_Error|mixed $response Response to check.
    516  * @return WP_REST_Response|mixed If response generated an error, WP_Error, if response
    517  *                                is already an instance, WP_HTTP_Response, otherwise
    518  *                                returns a new WP_REST_Response instance.
     515 * @param WP_REST_Response|WP_Error|WP_HTTP_Response|mixed $response Response to check.
     516 * @return WP_REST_Response|WP_Error If response generated an error, WP_Error, if response
     517 *                                   is already an instance, WP_REST_Response, otherwise
     518 *                                   returns a new WP_REST_Response instance.
    519519 */
    520520function rest_ensure_response( $response ) {
    … …  
    523523        }
    524524
     525        if ( $response instanceof WP_REST_Response ) {
     526                return $response;
     527        }
     528
     529        // While WP_HTTP_Response is the base class of WP_REST_Response, it doesn't provide
     530        // all the required methods used in WP_REST_Server::dispatch().
    525531        if ( $response instanceof WP_HTTP_Response ) {
    526                 return $response;
     532                return new WP_REST_Response(
     533                        $response->get_data(),
     534                        $response->get_status(),
     535                        $response->get_headers()
     536                );
    527537        }
    528538
  • trunk/src/wp-includes/rest-api/class-wp-rest-server.php

    r47351 r47849  
    970970                                 * @since 4.7.0
    971971                                 *
    972                                  * @param WP_HTTP_Response|WP_Error $response Result to send to the client. Usually a WP_REST_Response or WP_Error.
    973                                  * @param array                     $handler  Route handler used for the request.
    974                                  * @param WP_REST_Request           $request  Request used to generate the response.
     972                                 * @param WP_REST_Response|WP_HTTP_Response|WP_Error|mixed $response Result to send to the client. Usually a WP_REST_Response or WP_Error.
     973                                 * @param array                                            $handler  Route handler used for the request.
     974                                 * @param WP_REST_Request                                  $request  Request used to generate the response.
    975975                                 */
    976976                                $response = apply_filters( 'rest_request_before_callbacks', $response, $handler, $request );
    … …  
    10331033                                 * @since 4.7.0
    10341034                                 *
    1035                                  * @param WP_HTTP_Response|WP_Error $response Result to send to the client. Usually a WP_REST_Response or WP_Error.
    1036                                  * @param array                     $handler  Route handler used for the request.
    1037                                  * @param WP_REST_Request           $request  Request used to generate the response.
     1035                                 * @param WP_REST_Response|WP_HTTP_Response|WP_Error|mixed $response Result to send to the client. Usually a WP_REST_Response or WP_Error.
     1036                                 * @param array                                            $handler  Route handler used for the request.
     1037                                 * @param WP_REST_Request                                  $request  Request used to generate the response.
    10381038                                 */
    10391039                                $response = apply_filters( 'rest_request_after_callbacks', $response, $handler, $request );
  • trunk/tests/phpunit/tests/rest-api.php

    r47842 r47849  
    943943         * @ticket 40614
    944944         */
    945         function test_rest_ensure_response_accepts_path_string() {
     945        function test_rest_ensure_request_accepts_path_string() {
    946946                $request = rest_ensure_request( '/wp/v2/posts' );
    947947                $this->assertInstanceOf( 'WP_REST_Request', $request );
    … …  
    13161316                );
    13171317        }
     1318
     1319        function test_rest_ensure_response_accepts_wp_error_and_returns_wp_error() {
     1320                $response = rest_ensure_response( new WP_Error() );
     1321                $this->assertInstanceOf( 'WP_Error', $response );
     1322        }
     1323
     1324        /**
     1325         * @dataProvider rest_ensure_response_data_provider
     1326         * @group test1
     1327         *
     1328         * @param mixed $response      The response passed to rest_ensure_response().
     1329         * @param mixed $expected_data The expected data a response should include.
     1330         */
     1331        function test_rest_ensure_response_returns_instance_of_wp_rest_response( $response, $expected_data ) {
     1332                $response_object = rest_ensure_response( $response );
     1333                $this->assertInstanceOf( 'WP_REST_Response', $response_object );
     1334                $this->assertSame( $expected_data, $response_object->get_data() );
     1335        }
     1336
     1337        /**
     1338         * Data provider for test_rest_ensure_response_returns_instance_of_wp_rest_response().
     1339         *
     1340         * @return array
     1341         */
     1342        function rest_ensure_response_data_provider() {
     1343                return array(
     1344                        array( null, null ),
     1345                        array( array( 'chocolate' => 'cookies' ), array( 'chocolate' => 'cookies' ) ),
     1346                        array( 123, 123 ),
     1347                        array( true, true ),
     1348                        array( 'chocolate', 'chocolate' ),
     1349                        array( new WP_HTTP_Response( 'http' ), 'http' ),
     1350                        array( new WP_REST_Response( 'rest' ), 'rest' ),
     1351                );
     1352        }
    13181353}
Note: See TracChangeset for help on using the changeset viewer.