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 { |
| 505 | 505 | |
| 506 | 506 | foreach ( $links as $item ) { |
| 507 | 507 | // 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 ) { |
| 509 | 509 | // Ensure we keep the same order. |
| 510 | 510 | $embeds[] = array(); |
| 511 | 511 | continue; |
| 512 | 512 | } |
| 513 | 513 | |
| 514 | 514 | // Run through our internal routing and serve. |
| 515 | | $route = substr( $item['href'], strlen( untrailingslashit( $api_root ) ) ); |
| 516 | 515 | $query_params = array(); |
| 517 | 516 | |
| 518 | 517 | // 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 { |
| 521 | 531 | $embeds[] = array(); |
| 522 | 532 | continue; |
| 523 | 533 | } |
| 524 | 534 | |
| 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 ); |
| 532 | 538 | } |
| 533 | 539 | |
| 534 | 540 | // Embedded resources get passed context=embed. |
| … |
… |
class WP_REST_Server { |
| 536 | 542 | $query_params['context'] = 'embed'; |
| 537 | 543 | } |
| 538 | 544 | |
| 539 | | $request = new WP_REST_Request( 'GET', $parsed['path'] ); |
| | 545 | $request = new WP_REST_Request( 'GET', $path ); |
| 540 | 546 | |
| 541 | 547 | $request->set_query_params( $query_params ); |
| 542 | 548 | $response = $this->dispatch( $request ); |
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 { |
| 423 | 423 | ) ); |
| 424 | 424 | |
| 425 | 425 | $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 ) ); |
| 427 | 427 | |
| 428 | 428 | $data = $this->server->response_to_data( $response, true ); |
| 429 | 429 | |
| … |
… |
class Tests_REST_Server extends WP_Test_REST_TestCase { |
| 438 | 438 | * @depends test_link_embedding_params |
| 439 | 439 | */ |
| 440 | 440 | 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', |
| 444 | 443 | 'callback' => array( $this, 'embedded_response_callback' ), |
| 445 | 444 | ) ); |
| 446 | 445 | |
| 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 ); |
| 450 | 450 | $data = $this->server->response_to_data( $response, true ); |
| 451 | 451 | |
| 452 | 452 | $this->assertArrayHasKey( '_embedded', $data ); |
| … |
… |
class Tests_REST_Server extends WP_Test_REST_TestCase { |
| 488 | 488 | 'parameters' => $params, |
| 489 | 489 | ); |
| 490 | 490 | |
| 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; |
| 492 | 497 | } |
| 493 | 498 | |
| 494 | 499 | public function test_removing_links() { |