Make WordPress Core

Ticket #35629: 35629.1.diff

File 35629.1.diff, 4.1 KB (added by danielbachhuber, 9 years ago)
  • src/wp-includes/rest-api/class-wp-rest-server.php

    diff --git a/src/wp-includes/rest-api/class-wp-rest-server.php b/src/wp-includes/rest-api/class-wp-rest-server.php
    index dad4070..a6b5044 100644
    a b class WP_REST_Server { 
    505505
    506506                        foreach ( $links as $item ) {
    507507                                // Determine if the link is embeddable.
    508                                 if ( empty( $item['embeddable'] ) || strpos( $item['href'], $api_root ) !== 0 ) {
     508                                if ( empty( $item['embeddable'] ) || strpos( $item['href'], substr( $api_root, 0, -1 ) ) !== 0 ) {
    509509                                        // Ensure we keep the same order.
    510510                                        $embeds[] = array();
    511511                                        continue;
    512512                                }
    513513
    514514                                // Run through our internal routing and serve.
    515                                 $route = substr( $item['href'], strlen( untrailingslashit( $api_root ) ) );
    516515                                $query_params = array();
    517516
    518517                                // Parse out URL query parameters.
    519                                 $parsed = parse_url( $route );
    520                                 if ( empty( $parsed['path'] ) ) {
     518                                $parsed = parse_url( $item['href'] );
     519                                if ( ! empty( $parsed['query'] ) ) {
     520                                        parse_str( $parsed['query'], $query_params );
     521                                } else {
     522                                        $query_params = array();
     523                                }
     524
     525                                if ( ! empty( $query_params['rest_route'] ) ) {
     526                                        $path = $query_params['rest_route'];
     527                                        unset( $query_params['rest_route'] );
     528                                } else if ( ! empty( $parsed['path'] ) ) {
     529                                        $path = $parsed['path'];
     530                                } else {
    521531                                        $embeds[] = array();
    522532                                        continue;
    523533                                }
    524534
    525                                 if ( ! empty( $parsed['query'] ) ) {
    526                                         parse_str( $parsed['query'], $query_params );
    527 
    528                                         // Ensure magic quotes are stripped.
    529                                         if ( get_magic_quotes_gpc() ) {
    530                                                 $query_params = stripslashes_deep( $query_params );
    531                                         }
     535                                // Ensure magic quotes are stripped.
     536                                if ( ! empty( $query_params ) && get_magic_quotes_gpc() ) {
     537                                        $query_params = stripslashes_deep( $query_params );
    532538                                }
    533539
    534540                                // Embedded resources get passed context=embed.
    class WP_REST_Server { 
    536542                                        $query_params['context'] = 'embed';
    537543                                }
    538544
    539                                 $request = new WP_REST_Request( 'GET', $parsed['path'] );
     545                                $request = new WP_REST_Request( 'GET', $path );
    540546
    541547                                $request->set_query_params( $query_params );
    542548                                $response = $this->dispatch( $request );
  • tests/phpunit/tests/rest-api/rest-server.php

    diff --git a/tests/phpunit/tests/rest-api/rest-server.php b/tests/phpunit/tests/rest-api/rest-server.php
    index 33e3f24..b5305d6 100644
    a b class Tests_REST_Server extends WP_Test_REST_TestCase { 
    423423                ) );
    424424
    425425                $response = new WP_REST_Response();
    426                 $response->add_link( 'alternate', rest_url( '/test/embeddable?parsed_params=yes' ), array( 'embeddable' => true ) );
     426                $response->add_link( 'alternate', add_query_arg( 'parsed_params', 'yes', rest_url( '/test/embeddable' ) ), array( 'embeddable' => true ) );
    427427
    428428                $data = $this->server->response_to_data( $response, true );
    429429
    class Tests_REST_Server extends WP_Test_REST_TestCase { 
    438438         * @depends test_link_embedding_params
    439439         */
    440440        public function test_link_embedding_error() {
    441                 // Register our testing route.
    442                 $this->server->register_route( 'test', '/test/embeddable', array(
    443                         'methods' => 'GET',
     441                register_rest_route( 'test', '/test/embeddable', array(
     442                        'methods'  => 'GET',
    444443                        'callback' => array( $this, 'embedded_response_callback' ),
    445444                ) );
    446445
    447                 $response = new WP_REST_Response();
    448                 $response->add_link( 'up', rest_url( '/test/embeddable?error=1' ), array( 'embeddable' => true ) );
    449 
     446                $request = new WP_REST_Request( 'GET', '/test/test/embeddable' );
     447                $request->set_param( '_embed', 1 );
     448                $request->set_param( 'embed_error', 1 );
     449                $response = $this->server->dispatch( $request );
    450450                $data = $this->server->response_to_data( $response, true );
    451451
    452452                $this->assertArrayHasKey( '_embedded', $data );
    class Tests_REST_Server extends WP_Test_REST_TestCase { 
    488488                        'parameters' => $params,
    489489                );
    490490
    491                 return $data;
     491                $response = rest_ensure_response( $data );
     492                if ( ! empty( $request['embed_error'] ) ) {
     493                        $response->add_link( 'up', add_query_arg( 'error', 1, rest_url( '/test/test/embeddable' ) ), array( 'embeddable' => true ) );
     494                }
     495
     496                return $response;
    492497        }
    493498
    494499        public function test_removing_links() {