Make WordPress Core

Ticket #20383: 20383.3.patch

File 20383.3.patch, 7.8 KB (added by SergeyBiryukov, 7 years ago)
  • src/wp-includes/canonical.php

     
    391391        // trailing /index.php
    392392        $redirect['path'] = preg_replace('|/' . preg_quote( $wp_rewrite->index, '|' ) . '/*?$|', '/', $redirect['path']);
    393393
    394         // Remove trailing spaces from the path
    395         $redirect['path'] = preg_replace( '#(%20| )+$#', '', $redirect['path'] );
     394        $punctuation_pattern = implode( '|', array_map( 'preg_quote', array(
     395                ' ', '%20',       // space
     396                '!', '%21',       // exclamation mark
     397                '"', '%22',       // double quote
     398                "'", '%27',       // single quote
     399                '(', '%28',       // opening bracket
     400                ')', '%29',       // closing bracket
     401                ',', '%2C',       // comma
     402                '.', '%2E',       // period
     403                ';', '%3B',       // semicolon
     404                '{', '%7B',       // opening curly bracket
     405                '}', '%7D',       // closing curly bracket
     406                '“', '%E2%80%9C', // opening curly quote
     407                '”', '%E2%80%9D', // closing curly quote
     408        ) ) );
    396409
     410        // Remove trailing spaces and end punctuation from the path.
     411        $redirect['path'] = preg_replace( "#($punctuation_pattern)+$#", '', $redirect['path'] );
     412
    397413        if ( !empty( $redirect['query'] ) ) {
    398                 // Remove trailing spaces from certain terminating query string args
    399                 $redirect['query'] = preg_replace( '#((p|page_id|cat|tag)=[^&]*?)(%20| )+$#', '$1', $redirect['query'] );
     414                // Remove trailing spaces and end punctuation from certain terminating query string args
     415                $redirect['query'] = preg_replace( "#((p|page_id|cat|tag)=[^&]*?)($punctuation_pattern)+$#", '$1', $redirect['query'] );
    400416
    401417                // Clean up empty query strings
    402418                $redirect['query'] = trim(preg_replace( '#(^|&)(p|page_id|cat|tag)=?(&|$)#', '&', $redirect['query']), '&');
  • tests/phpunit/tests/canonical/noRewrite.php

     
    4646                        // Strip an existing but incorrect post_type arg
    4747                        array( '/?post_type=page&page_id=1', '/?p=1' ),
    4848
    49                         array( '/?p=358 ', array('url' => '/?p=358',  'qv' => array('p' => '358') ) ), // Trailing spaces
    50                         array( '/?p=358%20', array('url' => '/?p=358',  'qv' => array('p' => '358') ) ),
     49                        // Trailing spaces and punctuation in query string args.
     50                        array( '/?p=358 ',          array( 'url' => '/?p=358', 'qv' => array( 'p' => '358' ) ), 20383 ), // space
     51                        array( '/?p=358%20',        array( 'url' => '/?p=358', 'qv' => array( 'p' => '358' ) ), 20383 ), // encoded space
     52                        array( '/?p=358!',          array( 'url' => '/?p=358', 'qv' => array( 'p' => '358' ) ), 20383 ), // exclamation mark
     53                        array( '/?p=358%21',        array( 'url' => '/?p=358', 'qv' => array( 'p' => '358' ) ), 20383 ), // encoded exclamation mark
     54                        array( '/?p=358"',          array( 'url' => '/?p=358', 'qv' => array( 'p' => '358' ) ), 20383 ), // double quote
     55                        array( '/?p=358%22',        array( 'url' => '/?p=358', 'qv' => array( 'p' => '358' ) ), 20383 ), // encoded double quote
     56                        array( '/?p=358\'',         array( 'url' => '/?p=358', 'qv' => array( 'p' => '358' ) ), 20383 ), // single quote
     57                        array( '/?p=358%27',        array( 'url' => '/?p=358', 'qv' => array( 'p' => '358' ) ), 20383 ), // encoded single quote
     58                        array( '/?p=358(',          array( 'url' => '/?p=358', 'qv' => array( 'p' => '358' ) ), 20383 ), // opening bracket
     59                        array( '/?p=358%28',        array( 'url' => '/?p=358', 'qv' => array( 'p' => '358' ) ), 20383 ), // encoded opening bracket
     60                        array( '/?p=358)',          array( 'url' => '/?p=358', 'qv' => array( 'p' => '358' ) ), 20383 ), // closing bracket
     61                        array( '/?p=358%29',        array( 'url' => '/?p=358', 'qv' => array( 'p' => '358' ) ), 20383 ), // encoded closing bracket
     62                        array( '/?p=358,',          array( 'url' => '/?p=358', 'qv' => array( 'p' => '358' ) ), 20383 ), // comma
     63                        array( '/?p=358%2C',        array( 'url' => '/?p=358', 'qv' => array( 'p' => '358' ) ), 20383 ), // encoded comma
     64                        array( '/?p=358.',          array( 'url' => '/?p=358', 'qv' => array( 'p' => '358' ) ), 20383 ), // period
     65                        array( '/?p=358%2E',        array( 'url' => '/?p=358', 'qv' => array( 'p' => '358' ) ), 20383 ), // encoded period
     66                        array( '/?p=358;',          array( 'url' => '/?p=358', 'qv' => array( 'p' => '358' ) ), 20383 ), // semicolon
     67                        array( '/?p=358%3B',        array( 'url' => '/?p=358', 'qv' => array( 'p' => '358' ) ), 20383 ), // encoded semicolon
     68                        array( '/?p=358{',          array( 'url' => '/?p=358', 'qv' => array( 'p' => '358' ) ), 20383 ), // opening curly bracket
     69                        array( '/?p=358%7B',        array( 'url' => '/?p=358', 'qv' => array( 'p' => '358' ) ), 20383 ), // encoded opening curly bracket
     70                        array( '/?p=358}',          array( 'url' => '/?p=358', 'qv' => array( 'p' => '358' ) ), 20383 ), // closing curly bracket
     71                        array( '/?p=358%7D',        array( 'url' => '/?p=358', 'qv' => array( 'p' => '358' ) ), 20383 ), // encoded closing curly bracket
     72                        array( '/?p=358“',          array( 'url' => '/?p=358', 'qv' => array( 'p' => '358' ) ), 20383 ), // opening curly quote
     73                        array( '/?p=358%E2%80%9C',  array( 'url' => '/?p=358', 'qv' => array( 'p' => '358' ) ), 20383 ), // encoded opening curly quote
     74                        array( '/?p=358”',          array( 'url' => '/?p=358', 'qv' => array( 'p' => '358' ) ), 20383 ), // closing curly quote
     75                        array( '/?p=358%E2%80%9D',  array( 'url' => '/?p=358', 'qv' => array( 'p' => '358' ) ), 20383 ), // encoded closing curly quote
    5176
     77                        // Trailing spaces and punctuation in permalinks.
     78                        array( '/page/2/ ',         '/page/2/', 20383 ), // space
     79                        array( '/page/2/%20',       '/page/2/', 20383 ), // encoded space
     80                        array( '/page/2/!',         '/page/2/', 20383 ), // exclamation mark
     81                        array( '/page/2/%21',       '/page/2/', 20383 ), // encoded exclamation mark
     82                        array( '/page/2/"',         '/page/2/', 20383 ), // double quote
     83                        array( '/page/2/%22',       '/page/2/', 20383 ), // encoded double quote
     84                        array( '/page/2/\'',        '/page/2/', 20383 ), // single quote
     85                        array( '/page/2/%27',       '/page/2/', 20383 ), // encoded single quote
     86                        array( '/page/2/(',         '/page/2/', 20383 ), // opening bracket
     87                        array( '/page/2/%28',       '/page/2/', 20383 ), // encoded opening bracket
     88                        array( '/page/2/)',         '/page/2/', 20383 ), // closing bracket
     89                        array( '/page/2/%29',       '/page/2/', 20383 ), // encoded closing bracket
     90                        array( '/page/2/,',         '/page/2/', 20383 ), // comma
     91                        array( '/page/2/%2C',       '/page/2/', 20383 ), // encoded comma
     92                        array( '/page/2/.',         '/page/2/', 20383 ), // period
     93                        array( '/page/2/%2E',       '/page/2/', 20383 ), // encoded period
     94                        array( '/page/2/;',         '/page/2/', 20383 ), // semicolon
     95                        array( '/page/2/%3B',       '/page/2/', 20383 ), // encoded semicolon
     96                        array( '/page/2/{',         '/page/2/', 20383 ), // opening curly bracket
     97                        array( '/page/2/%7B',       '/page/2/', 20383 ), // encoded opening curly bracket
     98                        array( '/page/2/}',         '/page/2/', 20383 ), // closing curly bracket
     99                        array( '/page/2/%7D',       '/page/2/', 20383 ), // encoded closing curly bracket
     100                        array( '/page/2/“',         '/page/2/', 20383 ), // opening curly quote
     101                        array( '/page/2/%E2%80%9C', '/page/2/', 20383 ), // encoded opening curly quote
     102                        array( '/page/2/”',         '/page/2/', 20383 ), // closing curly quote
     103                        array( '/page/2/%E2%80%9D', '/page/2/', 20383 ), // encoded closing curly quote
     104
    52105                        array( '/?page_id=1', '/?p=1' ), // redirect page_id to p (should cover page_id|p|attachment_id to one another
    53106                        array( '/?page_id=1&post_type=revision', '/?p=1' ),
    54107
    55108                        array( '/?feed=rss2&p=1', '/?feed=rss2&p=1', 21841 ),
    56109                        array( '/?feed=rss&p=1', '/?feed=rss2&p=1', 24623 ),
    57 
    58110                );
    59111        }
    60112}