Make WordPress Core

Changeset 60635


Ignore:
Timestamp:
08/14/2025 09:14:18 PM (14 months ago)
Author:
SergeyBiryukov
Message:

REST API: Correct error handling in WP_REST_Server::serve_batch_request_v1().

This aims to avoid a fatal error when hitting the batch request endpoint with a malformed URL.

Follow-up to [49252].

Props bor0, SirLouen, SergeyBiryukov.
Fixes #63502.

Location:
trunk
Files:
2 edited

Legend:

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

    r60177 r60635  
    17481748
    17491749                foreach ( $requests as $single_request ) {
     1750                        if ( is_wp_error( $single_request ) ) {
     1751                                $has_error    = true;
     1752                                $validation[] = $single_request;
     1753                                continue;
     1754                        }
     1755
    17501756                        $match     = $this->match_request_to_handler( $single_request );
    17511757                        $matches[] = $match;
    … …  
    18181824
    18191825                foreach ( $requests as $i => $single_request ) {
     1826                        if ( is_wp_error( $single_request ) ) {
     1827                                $result      = $this->error_to_response( $single_request );
     1828                                $responses[] = $this->envelope_response( $result, false )->get_data();
     1829                                continue;
     1830                        }
     1831
    18201832                        $clean_request = clone $single_request;
    18211833                        $clean_request->set_url_params( array() );
  • trunk/tests/phpunit/tests/rest-api/rest-server.php

    r60251 r60635  
    23312331
    23322332        /**
     2333         * @ticket 63502
     2334         */
     2335        public function test_batch_request_with_malformed_url() {
     2336                $request = new WP_REST_Request( 'POST', '/batch/v1' );
     2337                $request->set_header( 'Content-Type', 'application/json' );
     2338                $request->set_body_params(
     2339                        array(
     2340                                'requests' => array(
     2341                                        array(
     2342                                                'method' => 'POST',
     2343                                                'path'   => 'http://user@:80',
     2344                                        ),
     2345                                ),
     2346                        )
     2347                );
     2348
     2349                $response = rest_get_server()->dispatch( $request );
     2350                $data     = $response->get_data()['responses'][0]['body'] ?? null;
     2351
     2352                $this->assertIsArray( $data );
     2353                $this->assertSame( 'parse_path_failed', $data['code'] );
     2354        }
     2355
     2356        /**
    23332357         * @ticket 51020
    23342358         */
Note: See TracChangeset for help on using the changeset viewer.