WordPress.org

Make WordPress Core

Ticket #21182: 21182.2.diff

File 21182.2.diff, 5.9 KB (added by dd32, 9 months ago)
  • wp-includes/class-http.php

     
    158158                        $r['headers'] = array(); 
    159159 
    160160                if ( ! is_array( $r['headers'] ) ) { 
    161                         $processedHeaders = WP_Http::processHeaders( $r['headers'] ); 
     161                        $processedHeaders = WP_Http::processHeaders( $r['headers'], $url ); 
    162162                        $r['headers'] = $processedHeaders['headers']; 
    163163                } 
    164164 
     
    195195                                $r['headers']['Content-Length'] = strlen( $r['body'] ); 
    196196                } 
    197197 
    198                 return $this->_dispatch_request($url, $r); 
     198                $response = $this->_dispatch_request( $url, $r ); 
     199 
     200                if ( ! empty( $r['cookies'] ) ) { 
     201                        // Append cookies that were used in this request to the response 
     202                        $cookies_set = wp_list_pluck( $response['cookies'], 'name' ); 
     203                        foreach ( $r['cookies'] as $cookie ) { 
     204                                if ( ! in_array( $cookie->name, $cookies_set ) && $cookie->test( $url ) ) { 
     205                                        $response['cookies'][] = $cookie; 
     206                                } 
     207                        } 
     208                } 
     209 
     210                return $response; 
    199211        } 
    200212 
    201213        /** 
     
    349361         * @since 2.7.0 
    350362         * 
    351363         * @param string|array $headers 
     364         * @param string $url The URL that was requested 
    352365         * @return array Processed string headers. If duplicate headers are encountered, 
    353366         *                                      Then a numbered array is returned as the value of that header-key. 
    354367         */ 
    355         public static function processHeaders($headers) { 
     368        public static function processHeaders( $headers, $url ) { 
    356369                // split headers, one per array element 
    357370                if ( is_string($headers) ) { 
    358371                        // tolerate line terminator: CRLF = LF (RFC 2616 19.3) 
     
    399412                        } else { 
    400413                                $newheaders[ $key ] = $value; 
    401414                        } 
    402                         if ( 'set-cookie' == $key ) 
    403                                 $cookies[] = new WP_Http_Cookie( $value ); 
     415                        if ( 'set-cookie' == $key || 'set-cookie2' == $key ) 
     416                                $cookies[] = new WP_Http_Cookie( $value, $url ); 
    404417                } 
    405418 
    406419                return array('response' => $response, 'headers' => $newheaders, 'cookies' => $cookies); 
     
    420433         * @param array $r Full array of args passed into ::request() 
    421434         */ 
    422435        public static function buildCookieHeader( &$r ) { 
    423                 if ( ! empty($r['cookies']) ) { 
     436                if ( ! empty( $r['cookies'] ) ) { 
    424437                        $cookies_header = ''; 
    425438                        foreach ( (array) $r['cookies'] as $cookie ) { 
    426439                                $cookies_header .= $cookie->getHeaderValue() . '; '; 
     
    631644                                $args['method'] = 'GET'; 
    632645                } 
    633646 
     647                // Include valid cookies in the redirect process 
     648                if ( ! empty( $response['cookies'] ) ) { 
     649                        foreach ( $response['cookies'] as $cookie ) { 
     650                                if ( $cookie->test( $redirect_location ) ) 
     651                                        $args['cookies'][] = $cookie; 
     652                        } 
     653                } 
     654 
    634655                return wp_remote_request( $redirect_location, $args );   
    635656        } 
    636657} 
     
    12941315                } 
    12951316 
    12961317                $theResponse = curl_exec( $handle ); 
    1297                 $theHeaders = WP_Http::processHeaders( $this->headers ); 
     1318                $theHeaders = WP_Http::processHeaders( $this->headers, $url ); 
    12981319                $theBody = $this->body; 
    12991320 
    13001321                $this->headers = ''; 
     
    16131634         * @since 2.8.0 
    16141635         * @var string 
    16151636         */ 
    1616         var $name; 
     1637        var $name = ''; 
    16171638 
    16181639        /** 
    16191640         * Cookie value. 
     
    16211642         * @since 2.8.0 
    16221643         * @var string 
    16231644         */ 
    1624         var $value; 
     1645        var $value = ''; 
    16251646 
    16261647        /** 
    16271648         * When the cookie expires. 
     
    16291650         * @since 2.8.0 
    16301651         * @var string 
    16311652         */ 
    1632         var $expires; 
     1653        var $expires = null; 
    16331654 
    16341655        /** 
    16351656         * Cookie URL path. 
     
    16371658         * @since 2.8.0 
    16381659         * @var string 
    16391660         */ 
    1640         var $path; 
     1661        var $path = null; 
    16411662 
    16421663        /** 
    16431664         * Cookie Domain. 
     
    16451666         * @since 2.8.0 
    16461667         * @var string 
    16471668         */ 
    1648         var $domain; 
     1669        var $domain = null; 
    16491670 
    16501671        /** 
    16511672         * Sets up this cookie object. 
     
    16671688         * 
    16681689         * @param string|array $data Raw cookie data. 
    16691690         */ 
    1670         function __construct( $data ) { 
     1691        function __construct( $data, $requested_url = '' ) { 
     1692                $arrURL = parse_url( $requested_url ); 
     1693                $this->domain = $arrURL['host']; 
     1694                $this->path = isset( $arrURL['path'] ) ? $arrURL['path'] : '/'; 
     1695                if ( '/' != substr( $this->path, -1 ) ) 
     1696                        $this->path = dirname( $this->path ) . '/'; 
     1697 
    16711698                if ( is_string( $data ) ) { 
    16721699                        // Assume it's a header string direct from a previous request 
    16731700                        $pairs = explode( ';', $data ); 
     
    16961723                                return false; 
    16971724 
    16981725                        // Set properties based directly on parameters 
    1699                         $this->name   = $data['name']; 
    1700                         $this->value  = isset( $data['value'] ) ? $data['value'] : ''; 
    1701                         $this->path   = isset( $data['path'] ) ? $data['path'] : ''; 
    1702                         $this->domain = isset( $data['domain'] ) ? $data['domain'] : ''; 
     1726                        foreach ( array( 'name', 'value', 'path', 'domain' ) as $field ) { 
     1727                                if ( isset( $data[ $field ] ) ) 
     1728                                        $this->$field = $data[ $field ]; 
     1729                        } 
    17031730 
    17041731                        if ( isset( $data['expires'] ) ) 
    17051732                                $this->expires = is_int( $data['expires'] ) ? $data['expires'] : strtotime( $data['expires'] ); 
     
    17201747         * @return boolean true if allowed, false otherwise. 
    17211748         */ 
    17221749        function test( $url ) { 
     1750                if ( empty( $this->name ) ) 
     1751                        return false; 
     1752 
    17231753                // Expires - if expired then nothing else matters 
    17241754                if ( isset( $this->expires ) && time() > $this->expires ) 
    17251755                        return false; 
    17261756 
    17271757                // Get details on the URL we're thinking about sending to 
    17281758                $url = parse_url( $url ); 
    1729                 $url['port'] = isset( $url['port'] ) ? $url['port'] : 80; 
     1759                $url['port'] = isset( $url['port'] ) ? $url['port'] : ( 'https' == $url['scheme'] ? 443 : 80 ); 
    17301760                $url['path'] = isset( $url['path'] ) ? $url['path'] : '/'; 
    17311761 
    17321762                // Values to use for comparison against the URL 
    17331763                $path   = isset( $this->path )   ? $this->path   : '/'; 
    1734                 $port   = isset( $this->port )   ? $this->port   : 80; 
     1764                $port   = isset( $this->port )   ? $this->port   : null; 
    17351765                $domain = isset( $this->domain ) ? strtolower( $this->domain ) : strtolower( $url['host'] ); 
    17361766                if ( false === stripos( $domain, '.' ) ) 
    17371767                        $domain .= '.local'; 
     
    17421772                        return false; 
    17431773 
    17441774                // Port - supports "port-lists" in the format: "80,8000,8080" 
    1745                 if ( !in_array( $url['port'], explode( ',', $port) ) ) 
     1775                if ( !empty( $port ) && !in_array( $url['port'], explode( ',', $port) ) ) 
    17461776                        return false; 
    17471777 
    17481778                // Path - request path must start with path restriction