Ticket #16057: 16057.htttp.diff
File 16057.htttp.diff, 3.4 KB (added by , 14 years ago) |
---|
-
wp-includes/class-http.php
681 681 if ( ! $stream_handle ) 682 682 return new WP_Error( 'http_request_failed', sprintf( __( 'Could not open handle for fopen() to %s' ), $r['filename'] ) ); 683 683 684 $bytes_written = 0; 685 684 686 while ( ! feof($handle) ) { 685 687 $block = fread( $handle, 4096 ); 686 688 if ( $bodyStarted ) { 687 fwrite( $stream_handle, $block );689 $bytes_written += fwrite( $stream_handle, $block ); 688 690 } else { 689 691 $strResponse .= $block; 690 692 if ( strpos( $strResponse, "\r\n\r\n" ) ) { 691 693 $process = WP_Http::processResponse( $strResponse ); 692 694 $bodyStarted = true; 693 fwrite( $stream_handle, $process['body'] );695 $bytes_written += fwrite( $stream_handle, $process['body'] ); 694 696 unset( $strResponse ); 695 697 $process['body'] = ''; 696 698 } … … 714 716 715 717 $arrHeaders = WP_Http::processHeaders( $process['headers'] ); 716 718 719 //Check the file was fully written to disk 720 if ( $r['stream'] && isset( $arrHeaders['headers']['content-length'] ) && (int)$arrHeaders['headers']['content-length'] > $bytes_written ) { 721 unlink($r['filename']); 722 return new WP_Error('http_request_failed', __('Failed to write full file to disk.') ); 723 } 724 717 725 // If location is found, then assume redirect and redirect to location. 718 726 if ( isset($arrHeaders['headers']['location']) && 0 !== $r['_redirection'] ) { 719 727 if ( $r['redirection']-- > 0 ) { … … 882 890 if ( ! $stream_handle ) 883 891 return new WP_Error( 'http_request_failed', sprintf( __( 'Could not open handle for fopen() to %s' ), $r['filename'] ) ); 884 892 885 stream_copy_to_stream( $handle, $stream_handle );893 $bytes_written = stream_copy_to_stream( $handle, $stream_handle ); 886 894 887 895 fclose( $stream_handle ); 888 896 $strResponse = ''; … … 900 908 else 901 909 $processedHeaders = WP_Http::processHeaders($meta['wrapper_data']); 902 910 911 //Check the file was fully written to disk 912 if ( $r['stream'] && isset( $processedHeaders['headers']['content-length'] ) ) { 913 if ( (int)$processedHeaders['headers']['content-length'] > $bytes_written && ! ( $bytes_written === 1 && 0 === (int)$processedHeaders['headers']['content-length'] ) ) { // PHP Bug: http://bugs.php.net/bug.php?id=47997 fixed in 5.2.10 914 unlink($r['filename']); 915 return new WP_Error('http_request_failed', __('Failed to write full file to disk.') ); 916 } 917 } 918 903 919 // Streams does not provide an error code which we can use to see why the request stream stoped. 904 920 // We can however test to see if a location header is present and return based on that. 905 921 if ( isset($processedHeaders['headers']['location']) && 0 !== $args['_redirection'] ) … … 1110 1126 1111 1127 curl_close( $handle ); 1112 1128 1113 if ( $r['stream'] ) 1129 if ( $r['stream'] ) { 1114 1130 fclose( $stream_handle ); 1131 // Check the file was fully written to disk 1132 if ( isset( $theHeaders['headers']['content-length'] ) && (int)$theHeaders['headers']['content-length'] > filesize( $r['filename'] ) ) { 1133 unlink($r['filename']); 1134 return new WP_Error( 'http_request_failed', __('Failed to write full file to disk.' ) ); 1135 } 1136 } 1115 1137 1116 1138 // See #11305 - When running under safe mode, redirection is disabled above. Handle it manually. 1117 1139 if ( ! empty( $theHeaders['headers']['location'] ) && ( ini_get( 'safe_mode' ) || ini_get( 'open_basedir' ) ) && 0 !== $r['_redirection'] ) {