WordPress.org

Make WordPress Core

Ticket #40444: 40444.2.patch

File 40444.2.patch, 2.8 KB (added by zinigor, 2 years ago)

New patch that uses send_header and adds a test.

  • 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 9d4a5fec05..81394f0629 100644
    a b class WP_REST_Server { 
    252252                $send_no_cache_headers = apply_filters( 'rest_send_nocache_headers', is_user_logged_in() );
    253253                if ( $send_no_cache_headers ) {
    254254                        foreach ( wp_get_nocache_headers() as $header => $header_value ) {
     255                                if ( empty( $header_value ) ) {
     256                                        $this->clear_header( $header );
     257                                        continue;
     258                                }
     259
    255260                                $this->send_header( $header, $header_value );
    256261                        }
    257262                }
    class WP_REST_Server { 
    12611266                        $this->send_header( $key, $value );
    12621267                }
    12631268        }
     1269        /**
     1270         * Sends an HTTP header.
     1271         *
     1272         * @since 4.4.0
     1273         * @access public
     1274         *
     1275         * @param string $key Header key.
     1276         * @param string $value Header value.
     1277         */
     1278
     1279        /**
     1280         * Removes an HTTP header from the current response.
     1281         *
     1282         * @since 4.8.0
     1283         * @access public
     1284         *
     1285         * @param string $key Header key.
     1286         */
     1287        public function clear_header( $key ) {
     1288
     1289                // In PHP 5.3+ there is a way to remove an already set header.
     1290                if ( function_exists( 'header_remove' ) ) {
     1291                        @header_remove( $key );
     1292                } else {
     1293                        // In PHP 5.2, send an empty header, but only as a
     1294                        // last resort to override a header already sent.
     1295                        $this->send_header( $key, '' );
     1296                }
     1297        }
    12641298
    12651299        /**
    12661300         * Retrieves the raw request entity (body).
  • tests/phpunit/includes/spy-rest-server.php

    diff --git a/tests/phpunit/includes/spy-rest-server.php b/tests/phpunit/includes/spy-rest-server.php
    index 58e3c3b521..722f1b7b50 100644
    a b class Spy_REST_Server extends WP_REST_Server { 
    3131                $this->sent_headers[ $header ] = $value;
    3232        }
    3333
     34        public function clear_header( $header ) {
     35                unset( $this->sent_headers[ $header ] );
     36        }
     37
    3438        /**
    3539         * Override the dispatch method so we can get a handle on the request object.
    3640         *
  • 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 046d2b5f62..1cd9e68463 100644
    a b class Tests_REST_Server extends WP_Test_REST_TestCase { 
    763763                $headers = $this->server->sent_headers;
    764764
    765765                foreach ( wp_get_nocache_headers() as $header => $value ) {
     766                        if ( empty( $value ) ) {
     767                                continue;
     768                        }
     769
    766770                        $this->assertTrue( isset( $headers[ $header ] ), sprintf( 'Header %s is not present in the response.', $header ) );
    767771                        $this->assertEquals( $value, $headers[ $header ] );
    768772                }
     773
     774                // Last-Modified should be unset as per #WP23021
     775                $this->assertFalse( isset( $headers['Last-Modified'] ), 'Last-Modified should not be sent.' );
    769776        }
    770777
    771778        public function test_no_nocache_headers_on_unauthenticated_requests() {