WordPress.org

Make WordPress Core

Ticket #13513: 13513.patch

File 13513.patch, 3.2 KB (added by hakre, 4 years ago)

Concating values as List; response header overwrite protection; diverse formattings

  • wp-includes/class-http.php

    ### Eclipse Workspace Patch 1.0
    #P wordpress-trunk
     
    409409         * @return array Processed string headers. If duplicate headers are encountered, 
    410410         *                                      Then a numbered array is returned as the value of that header-key. 
    411411         */ 
    412         function processHeaders($headers) { 
     412        function processHeaders( $headers ) { 
    413413                // split headers, one per array element 
    414                 if ( is_string($headers) ) { 
     414                if ( is_string( $headers ) ) { 
    415415                        // tolerate line terminator: CRLF = LF (RFC 2616 19.3) 
    416                         $headers = str_replace("\r\n", "\n", $headers); 
     416                        $headers = str_replace( "\r\n", "\n", $headers ); 
    417417                        // unfold folded header fields. LWS = [CRLF] 1*( SP | HT ) <US-ASCII SP, space (32)>, <US-ASCII HT, horizontal-tab (9)> (RFC 2616 2.2) 
    418                         $headers = preg_replace('/\n[ \t]/', ' ', $headers); 
     418                        $headers = preg_replace( '/\n[ \t]/', ' ', $headers ); 
    419419                        // create the headers array 
    420                         $headers = explode("\n", $headers); 
     420                        $headers = explode( "\n", $headers ); 
    421421                } 
    422422 
    423                 $response = array('code' => 0, 'message' => ''); 
    424  
    425423                // If a redirection has taken place, The headers for each page request may have been passed. 
    426424                // In this case, determine the final HTTP header and parse from there. 
    427                 for ( $i = count($headers)-1; $i >= 0; $i-- ) { 
    428                         if ( !empty($headers[$i]) && false === strpos($headers[$i], ':') ) { 
     425                for ( $i = count( $headers )-1; $i >= 0; $i-- ) { 
     426                        if ( !empty( $headers[$i] ) && false === strpos($headers[$i], ':') ) { 
    429427                                $headers = array_splice($headers, $i); 
    430428                                break; 
    431429                        } 
    432430                } 
    433431 
    434                 $cookies = array(); 
     432                $response   = array( 'code' => 0, 'message' => '', 'toset' => true );            
    435433                $newheaders = array(); 
     434                $cookies    = array();           
     435 
    436436                foreach ( $headers as $tempheader ) { 
    437                         if ( empty($tempheader) ) 
     437                        if ( empty( $tempheader ) ) 
    438438                                continue; 
    439439 
    440                         if ( false === strpos($tempheader, ':') ) { 
    441                                 list( , $response['code'], $response['message']) = explode(' ', $tempheader, 3); 
     440                        if ( false === strpos( $tempheader, ':' ) ) { 
     441                                if ( $response['toset'] ) { 
     442                                        list( , $response['code'], $response['message'] ) = explode( ' ', $tempheader, 3 ); 
     443                                        $response['toset']                                = false; 
     444                                } 
    442445                                continue; 
    443446                        } 
    444447 
    445                         list($key, $value) = explode(':', $tempheader, 2); 
     448                        list( $key, $value ) = explode( ':', $tempheader, 2 ); 
    446449 
    447                         if ( !empty( $value ) ) { 
    448                                 $key = strtolower( $key ); 
    449                                 if ( isset( $newheaders[$key] ) ) { 
    450                                         if ( !is_array($newheaders[$key]) ) 
    451                                                 $newheaders[$key] = array($newheaders[$key]); 
    452                                         $newheaders[$key][] = trim( $value ); 
    453                                 } else { 
    454                                         $newheaders[$key] = trim( $value ); 
    455                                 } 
    456                                 if ( 'set-cookie' == strtolower( $key ) ) 
    457                                         $cookies[] = new WP_Http_Cookie( $value ); 
    458                         } 
     450                        if ( empty( $value ) ) 
     451                                continue; 
     452                         
     453                        $key = strtolower( $key ); 
     454                         
     455                        if ( isset( $newheaders[$key] ) ) 
     456                                $newheaders[$key] .= ','; 
     457                        else 
     458                                $newheaders[$key] = ''; 
     459                        $newheaders[$key] .= trim( $value ); 
     460                         
     461                        if ( 'set-cookie' == $key ) 
     462                                $cookies[] = new WP_Http_Cookie( $value ); 
    459463                } 
    460464 
    461465                return array('response' => $response, 'headers' => $newheaders, 'cookies' => $cookies);