Make WordPress Core

Changeset 47559


Ignore:
Timestamp:
04/09/2020 07:28:58 PM (6 years ago)
Author:
kadamwhite
Message:

REST API: Handle parameter types consistently within set_param().

A request has multiple parameter types, including "query" and "json." Updating a parameter could previously modify a key's value in the wrong parameter type, leading to confusing and self-contradictory response objects.

Props mnelson4, TimothyBlynJacobs, vagios, jnylen0.
Fixes #40838.

Location:
trunk
Files:
2 edited

Legend:

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

    r47122 r47559  
    421421         * Sets a parameter on the request.
    422422         *
     423         * If the given parameter key exists in any parameter type an update will take place,
     424         * otherwise a new param will be created in the first parameter type (respecting
     425         * get_parameter_order()).
     426         *
    423427         * @since 4.4.0
    424428         *
     
    427431         */
    428432        public function set_param( $key, $value ) {
    429                 $order                             = $this->get_parameter_order();
    430                 $this->params[ $order[0] ][ $key ] = $value;
     433                $order     = $this->get_parameter_order();
     434                $found_key = false;
     435
     436                foreach ( $order as $type ) {
     437                        if ( 'defaults' !== $type && array_key_exists( $key, $this->params[ $type ] ) ) {
     438                                $this->params[ $type ][ $key ] = $value;
     439                                $found_key                     = true;
     440                        }
     441                }
     442
     443                if ( ! $found_key ) {
     444                        $this->params[ $order[0] ][ $key ] = $value;
     445                }
    431446        }
    432447
  • trunk/tests/phpunit/tests/rest-api/rest-request.php

    r46586 r47559  
    651651                );
    652652        }
     653
     654        /**
     655         * @ticket 40838
     656         */
     657        public function test_set_param_updates_param_in_json_and_query() {
     658                $request = new WP_REST_Request();
     659                $request->add_header( 'content-type', 'application/json' );
     660                $request->set_method( 'POST' );
     661                $request->set_body(
     662                        wp_json_encode(
     663                                array(
     664                                        'param' => 'value_body',
     665                                )
     666                        )
     667                );
     668                $request->set_query_params(
     669                        array(
     670                                'param' => 'value_query',
     671                        )
     672                );
     673                $request->set_param( 'param', 'new_value' );
     674
     675                $this->assertEquals( 'new_value', $request->get_param( 'param' ) );
     676                $this->assertEquals( array(), $request->get_body_params() );
     677                $this->assertEquals( array( 'param' => 'new_value' ), $request->get_json_params() );
     678                $this->assertEquals( array( 'param' => 'new_value' ), $request->get_query_params() );
     679        }
     680
     681        /**
     682         * @ticket 40838
     683         */
     684        public function test_set_param_updates_param_if_already_exists_in_query() {
     685                $request = new WP_REST_Request();
     686                $request->add_header( 'content-type', 'application/json' );
     687                $request->set_method( 'POST' );
     688                $request->set_body(
     689                        wp_json_encode(
     690                                array(
     691                                        'param_body' => 'value_body',
     692                                )
     693                        )
     694                );
     695                $original_defaults = array(
     696                        'param_query' => 'default_query_value',
     697                        'param_body'  => 'default_body_value',
     698                );
     699                $request->set_default_params( $original_defaults );
     700                $request->set_query_params(
     701                        array(
     702                                'param_query' => 'value_query',
     703                        )
     704                );
     705                $request->set_param( 'param_query', 'new_value' );
     706
     707                $this->assertEquals( 'new_value', $request->get_param( 'param_query' ) );
     708                $this->assertEquals( array(), $request->get_body_params() );
     709                $this->assertEquals( array( 'param_body' => 'value_body' ), $request->get_json_params() );
     710                $this->assertEquals( array( 'param_query' => 'new_value' ), $request->get_query_params() );
     711                // Verify the default wasn't overwritten.
     712                $this->assertEquals( $original_defaults, $request->get_default_params() );
     713        }
     714
     715        /**
     716         * @ticket 40838
     717         */
     718        public function test_set_param_to_null_updates_param_in_json_and_query() {
     719                $request = new WP_REST_Request();
     720                $request->add_header( 'content-type', 'application/json' );
     721                $request->set_method( 'POST' );
     722                $request->set_body(
     723                        wp_json_encode(
     724                                array(
     725                                        'param' => 'value_body',
     726                                )
     727                        )
     728                );
     729                $request->set_query_params(
     730                        array(
     731                                'param' => 'value_query',
     732                        )
     733                );
     734                $request->set_param( 'param', null );
     735
     736                $this->assertEquals( null, $request->get_param( 'param' ) );
     737                $this->assertEquals( array(), $request->get_body_params() );
     738                $this->assertEquals( array( 'param' => null ), $request->get_json_params() );
     739                $this->assertEquals( array( 'param' => null ), $request->get_query_params() );
     740        }
     741
     742        /**
     743         * @ticket 40838
     744         */
     745        public function test_set_param_from_null_updates_param_in_json_and_query_with_null() {
     746                $request = new WP_REST_Request();
     747                $request->add_header( 'content-type', 'application/json' );
     748                $request->set_method( 'POST' );
     749                $request->set_body(
     750                        wp_json_encode(
     751                                array(
     752                                        'param' => null,
     753                                )
     754                        )
     755                );
     756                $request->set_query_params(
     757                        array(
     758                                'param' => null,
     759                        )
     760                );
     761                $request->set_param( 'param', 'new_value' );
     762
     763                $this->assertEquals( 'new_value', $request->get_param( 'param' ) );
     764                $this->assertEquals( array(), $request->get_body_params() );
     765                $this->assertEquals( array( 'param' => 'new_value' ), $request->get_json_params() );
     766                $this->assertEquals( array( 'param' => 'new_value' ), $request->get_query_params() );
     767        }
    653768}
Note: See TracChangeset for help on using the changeset viewer.