WordPress.org

Make WordPress Core

Ticket #4779: 4779.r8630.diff

File 4779.r8630.diff, 3.5 KB (added by santosj, 10 years ago)

Add @since to chunked decoding, return actual body when chunked. Based off of r8630

  • http.php

     
    351351         * difficult to support it though.
    352352         *
    353353         * @todo Add support for footer chunked headers.
    354          *
     354         * @access public
     355         * @since 2.7
    355356         * @static
     357         *
    356358         * @param string $body Body content
    357359         * @return bool|string|WP_Error False if not chunked encoded. WP_Error on failure. Chunked decoded body on success.
    358360         */
     
    362364                if ( ! preg_match( '/^[0-9a-f]+(\s|\n)+/mi', trim($body) ) )
    363365                        return false;
    364366
    365                 $hex = '';
    366                 $dec = 0;
    367367                $parsedBody = '';
    368                 $parsedHeaders = array();
     368                //$parsedHeaders = array(); Unsupported
    369369
    370370                $done = false;
    371371
     
    380380                                $length = hexdec( $match[1] );
    381381                                $chunkLength = strlen( $match[0] );
    382382
    383                                 if( $body{$length+$chunkLength} == "\n" )
    384                                         $length++;
    385 
    386383                                $strBody = substr($body, strlen( $match[0] ), $length);
    387384                                $parsedBody .= $strBody;
    388                                 $body = str_replace(array($match[0], $strBody), '', $body);
    389385
    390                                 if( "0" == $body ) {
     386                                $body = ltrim(str_replace(array($match[0], $strBody), '', $body), "\n");
     387
     388                                if( "0" == trim($body) ) {
    391389                                        $done = true;
    392390                                        return $parsedBody; // Ignore footer headers.
    393391                                        break;
     
    511509                $process = WP_Http::processResponse($strResponse);
    512510                $arrHeaders = WP_Http::processHeaders($process['headers']);
    513511
    514                 if ( WP_Http_Fsockopen::is400Response($arrHeaders['response']['code']) )
     512                // Is the response code within the 400 range?
     513                if ( (int) $arrHeaders['response']['code'] >= 400 && (int) $arrHeaders['response']['code'] < 500 )
    515514                        return new WP_Error('http_request_failed', $arrHeaders['response']['code'] . ': ' . $arrHeaders['response']['message']);
    516515
     516                // If the body was chunk encoded, then decode it.
     517                if ( ! empty( $process['body'] ) && isset( $arrHeaders['headers']['transfer-encoding'] ) && 'chunked' == $arrHeaders['headers']['transfer-encoding'] )
     518                        $process['body'] = WP_Http::chunkTransferDecode($process['body']);
     519
    517520                // If location is found, then assume redirect and redirect to location.
    518521                if ( isset($arrHeaders['headers']['location']) ) {
    519522                        if ( $r['redirection']-- > 0 ) {
     
    539542
    540543                return false;
    541544        }
    542 
    543         /**
    544          * Whether response code is in the 400 range.
    545          *
    546          * @access public
    547          * @static
    548          * @since 2.7
    549          *
    550          * @param string $response Response code.
    551          * @return bool True if 40x Response, false if something else.
    552          */
    553         function is400Response($response) {
    554                 if ( is_numeric($response) && (int) substr($response, 0, 1) == 4 )
    555                         return true;
    556                 return false;
    557         }
    558545}
    559546
    560547/**
     
    639626                $processedHeaders = WP_Http::processHeaders($theHeaders);
    640627
    641628                if ( ! empty( $strResponse ) && isset( $processedHeaders['headers']['transfer-encoding'] ) && 'chunked' == $processedHeaders['headers']['transfer-encoding'] )
    642                         $theBody = WP_Http::chunkTransferDecode($strResponse);
     629                        $strResponse = WP_Http::chunkTransferDecode($strResponse);
    643630
    644631                return array('headers' => $processedHeaders['headers'], 'body' => $strResponse, 'response' => $processedHeaders['response']);
    645632        }
     
    751738                $processedHeaders = WP_Http::processHeaders($meta['wrapper_data']);
    752739
    753740                if ( ! empty( $strResponse ) && isset( $processedHeaders['headers']['transfer-encoding'] ) && 'chunked' == $processedHeaders['headers']['transfer-encoding'] )
    754                         $theBody = WP_Http::chunkTransferDecode($strResponse);
     741                        $strResponse = WP_Http::chunkTransferDecode($strResponse);
    755742
    756743                fclose($handle);
    757744