REST API: Send a 500 status code when JSON encoding fails.

Previously, a 200 status code would be sent despite the 500 status code present in the response body.

Props hermpheus, lalitjalandhar.
Fixes #53056.


git-svn-id: https://develop.svn.wordpress.org/trunk@51960 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
Timothy Jacobs 2021-10-31 06:06:02 +00:00
parent 57ded3c85d
commit 07ad6efdf7
3 changed files with 32 additions and 0 deletions

View File

@ -497,6 +497,7 @@ class WP_REST_Server {
$json_error_message = $this->get_json_last_error();
if ( $json_error_message ) {
$this->set_status( 500 );
$json_error_obj = new WP_Error(
'rest_encode_error',
$json_error_message,

View File

@ -6,6 +6,7 @@ class Spy_REST_Server extends WP_REST_Server {
public $sent_body = '';
public $last_request = null;
public $override_by_default = false;
public $status = null;
/**
* Gets the raw $endpoints data from the server.
@ -37,6 +38,14 @@ class Spy_REST_Server extends WP_REST_Server {
$this->sent_headers[ $header ] = $value;
}
/**
* Stores last set status.
* @param int $code HTTP status.
*/
public function set_status( $status ) {
$this->status = $status;
}
/**
* Removes a header from the list of sent headers.
*

View File

@ -2022,6 +2022,28 @@ class Tests_REST_Server extends WP_Test_REST_TestCase {
$this->assertArrayHasKey( 'https://api.w.org/active-theme', $index->get_links() );
}
/**
* @ticket 53056
*/
public function test_json_encode_error_results_in_500_status_code() {
register_rest_route(
'test-ns/v1',
'/test',
array(
array(
'methods' => \WP_REST_Server::READABLE,
'callback' => function() {
return new \WP_REST_Response( INF );
},
'permission_callback' => '__return_true',
'args' => array(),
),
)
);
rest_get_server()->serve_request( '/test-ns/v1/test' );
$this->assertSame( 500, rest_get_server()->status );
}
public function _validate_as_integer_123( $value, $request, $key ) {
if ( ! is_int( $value ) ) {
return new WP_Error( 'some-error', 'This is not valid!' );