Make WordPress Core

Ticket #13513: 13513.patch

File 13513.patch, 3.2 KB (added by hakre, 15 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);