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() { |