WordPress.org

Make WordPress Core

Ticket #45753: 45753.3.diff

File 45753.3.diff, 4.8 KB (added by kadamwhite, 2 years ago)

Add test assertion for logged-in user, mirror test to attachments controller, and run filters in tests instead of causing side-effects within rest_handle_options_request.

  • src/wp-includes/rest-api.php

    diff --git src/wp-includes/rest-api.php src/wp-includes/rest-api.php
    index a2e3363951..a541e1dadd 100644
    function rest_send_cors_headers( $value ) { 
    604604 * @param mixed           $response Current response, either response or `null` to indicate pass-through.
    605605 * @param WP_REST_Server  $handler  ResponseHandler instance (usually WP_REST_Server).
    606606 * @param WP_REST_Request $request  The request that was used to make current response.
     607 *
    607608 * @return WP_REST_Response Modified response, either response or `null` to indicate pass-through.
    608609 */
    609610function rest_handle_options_request( $response, $handler, $request ) {
    function rest_handle_options_request( $response, $handler, $request ) { 
    615616        $data     = array();
    616617
    617618        foreach ( $handler->get_routes() as $route => $endpoints ) {
    618                 $match = preg_match( '@^' . $route . '$@i', $request->get_route() );
     619                $match = preg_match( '@^' . $route . '$@i', $request->get_route(), $matches );
    619620
    620621                if ( ! $match ) {
    621622                        continue;
    622623                }
    623624
     625                $args = array();
     626                foreach ( $matches as $param => $value ) {
     627                        if ( ! is_int( $param ) ) {
     628                                $args[ $param ] = $value;
     629                        }
     630                }
     631
     632                foreach ( $endpoints as $endpoint ) {
     633                        // Remove the redundant preg_match argument.
     634                        unset( $args[0] );
     635
     636                        $request->set_url_params( $args );
     637                        $request->set_attributes( $endpoint );
     638                }
     639
    624640                $data = $handler->get_data_for_route( $route, $endpoints, 'help' );
    625641                $response->set_matched_route( $route );
    626642                break;
    627643        }
    628644
    629645        $response->set_data( $data );
     646
    630647        return $response;
    631648}
    632649
  • tests/phpunit/tests/rest-api/rest-attachments-controller.php

    diff --git tests/phpunit/tests/rest-api/rest-attachments-controller.php tests/phpunit/tests/rest-api/rest-attachments-controller.php
    index 3ad2b09a72..556cc6c8be 100644
    class WP_Test_REST_Attachments_Controller extends WP_Test_REST_Post_Type_Control 
    208208                $this->assertEquals( array( 'context', 'id' ), $keys );
    209209        }
    210210
     211        /**
     212         * @ticket 43701
     213         */
     214        public function test_allow_header_sent_on_options_request() {
     215                $id1      = $this->factory->attachment->create_object(
     216                        $this->test_file,
     217                        0,
     218                        array(
     219                                'post_mime_type' => 'image/jpeg',
     220                                'post_excerpt'   => 'A sample caption',
     221                        )
     222                );
     223                $request  = new WP_REST_Request( 'OPTIONS', sprintf( '/wp/v2/media/%d', $id1 ) );
     224                $response = rest_get_server()->dispatch( $request );
     225                $response = apply_filters( 'rest_post_dispatch', $response, rest_get_server(), $request );
     226                $headers  = $response->get_headers();
     227
     228                $this->assertNotEmpty( $headers['Allow'] );
     229                $this->assertEquals( $headers['Allow'], 'GET' );
     230
     231                wp_set_current_user( self::$editor_id );
     232                $request  = new WP_REST_Request( 'OPTIONS', sprintf( '/wp/v2/media/%d', $id1 ) );
     233                $response = rest_get_server()->dispatch( $request );
     234                $response = apply_filters( 'rest_post_dispatch', $response, rest_get_server(), $request );
     235                $headers  = $response->get_headers();
     236
     237                $this->assertNotEmpty( $headers['Allow'] );
     238                $this->assertEquals( $headers['Allow'], 'GET, POST, PUT, PATCH, DELETE' );
     239        }
     240
    211241        public function test_get_items() {
    212242                wp_set_current_user( 0 );
    213243                $id1            = $this->factory->attachment->create_object(
  • tests/phpunit/tests/rest-api/rest-posts-controller.php

    diff --git tests/phpunit/tests/rest-api/rest-posts-controller.php tests/phpunit/tests/rest-api/rest-posts-controller.php
    index ee01eb717e..40d609c75d 100644
    class WP_Test_REST_Posts_Controller extends WP_Test_REST_Post_Type_Controller_Te 
    189189                $this->assertEquals( array( 'context', 'id', 'password' ), $keys );
    190190        }
    191191
     192        /**
     193         * @ticket 43701
     194         */
     195        public function test_allow_header_sent_on_options_request() {
     196                $request  = new WP_REST_Request( 'OPTIONS', sprintf( '/wp/v2/posts/%d', self::$post_id ) );
     197                $response = rest_get_server()->dispatch( $request );
     198                $response = apply_filters( 'rest_post_dispatch', $response, rest_get_server(), $request );
     199                $headers  = $response->get_headers();
     200
     201                $this->assertNotEmpty( $headers['Allow'] );
     202                $this->assertEquals( $headers['Allow'], 'GET' );
     203
     204                wp_set_current_user( self::$editor_id );
     205                $request  = new WP_REST_Request( 'OPTIONS', sprintf( '/wp/v2/posts/%d', self::$post_id ) );
     206                $response = rest_get_server()->dispatch( $request );
     207                $response = apply_filters( 'rest_post_dispatch', $response, rest_get_server(), $request );
     208                $headers  = $response->get_headers();
     209
     210                $this->assertNotEmpty( $headers['Allow'] );
     211                $this->assertEquals( $headers['Allow'], 'GET, POST, PUT, PATCH, DELETE' );
     212        }
     213
    192214        public function test_get_items() {
    193215                $request  = new WP_REST_Request( 'GET', '/wp/v2/posts' );
    194216                $response = rest_get_server()->dispatch( $request );