From 10bfe70f06396cb34cc559b3a516dcc56151124b Mon Sep 17 00:00:00 2001 From: Ryan McCue Date: Tue, 16 Feb 2016 05:50:21 +0000 Subject: [PATCH] REST API: Allow explicit HEAD callbacks. HEAD callbacks can now be registered independently, with the GET callback still used as a fallback. Fixes #34841. git-svn-id: https://develop.svn.wordpress.org/trunk@36535 602fd350-edb4-49c9-b593-d223f7449a82 --- .../rest-api/class-wp-rest-server.php | 6 ++++- tests/phpunit/tests/rest-api/rest-server.php | 23 +++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) 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 5672cd39dd..cc9fda7014 100644 --- a/src/wp-includes/rest-api/class-wp-rest-server.php +++ b/src/wp-includes/rest-api/class-wp-rest-server.php @@ -820,7 +820,11 @@ class WP_REST_Server { $callback = $handler['callback']; $response = null; - $checked_method = 'HEAD' === $method ? 'GET' : $method; + // Fallback to GET method if no HEAD method is registered. + $checked_method = $method; + if ( 'HEAD' === $method && empty( $handler['methods']['HEAD'] ) ) { + $checked_method = 'GET'; + } if ( empty( $handler['methods'][ $checked_method ] ) ) { continue; } diff --git a/tests/phpunit/tests/rest-api/rest-server.php b/tests/phpunit/tests/rest-api/rest-server.php index 768374d754..52b3ba6ca3 100644 --- a/tests/phpunit/tests/rest-api/rest-server.php +++ b/tests/phpunit/tests/rest-api/rest-server.php @@ -138,6 +138,29 @@ class Tests_REST_Server extends WP_Test_REST_TestCase { $this->assertEquals( 200, $response->get_status() ); } + /** + * Plugins should be able to register explicit HEAD callbacks before the + * GET callback. + * + * @depends test_head_request_handled_by_get + */ + public function test_explicit_head_callback() { + register_rest_route( 'head-request', '/test', array( + array( + 'methods' => array( 'HEAD' ), + 'callback' => '__return_true', + ), + array( + 'methods' => array( 'GET' ), + 'callback' => '__return_false', + 'permission_callback' => array( $this, 'permission_denied' ), + ), + )); + $request = new WP_REST_Request( 'HEAD', '/head-request/test' ); + $response = $this->server->dispatch( $request ); + $this->assertEquals( 200, $response->get_status() ); + } + /** * Pass a capability which the user does not have, this should * result in a 403 error.