Ticket #16236: 16236.5.diff
| File 16236.5.diff, 9.2 KB (added by , 15 years ago) |
|---|
-
wp-includes/class-http.php
227 227 'body' => null, 228 228 'compress' => false, 229 229 'decompress' => true, 230 'sslverify' => true 230 'sslverify' => true, 231 'stream' => false, 232 'filename' => null 231 233 ); 232 234 233 235 $r = wp_parse_args( $args, $defaults ); … … 255 257 $r['local'] = $homeURL['host'] == $arrURL['host'] || 'localhost' == $arrURL['host']; 256 258 unset( $homeURL ); 257 259 260 if ( $r['stream'] && ! $r['filename'] ) 261 $r['filename'] = get_temp_dir() . basename( $url ); 262 263 if ( $r['stream'] ) { 264 $r['blocking'] = true; 265 if ( ! is_dir( dirname( $r['filename'] ) ) || ! is_writable( dirname( $r['filename'] ) ) ) 266 return new WP_Error( 'http_request_failed', __( 'Destination directory for file streaming does not exist or is not writable.' ) ); 267 } 268 258 269 if ( is_null( $r['headers'] ) ) 259 270 $r['headers'] = array(); 260 271 … … 748 759 } 749 760 750 761 $strResponse = ''; 751 while ( ! feof($handle) )752 $strResponse .= fread($handle, 4096);762 $theHeaders = ''; 763 $bodyStarted = false; 753 764 765 if ( $r['stream'] ) 766 $stream_handle = fopen( $r['filename'], 'w+' ); 767 768 while ( ! feof($handle) ) { 769 if ( $r['stream'] ) { 770 $block = fread( $handle, 4096 ); 771 if ( $bodyStarted ) { 772 fwrite( $stream_handle, $block ); 773 } else { 774 if ( strpos( $block, "\r\n\r\n" ) ) { 775 $res = explode("\r\n\r\n", $block, 2); 776 $bodyStarted = true; 777 $theHeaders .= $res[0]; 778 fwrite( $stream_handle, $res[1] ); 779 } else { 780 $theHeaders .= $block; 781 } 782 } 783 } else { 784 $strResponse .= fread($handle, 4096); 785 } 786 } 787 754 788 fclose($handle); 755 789 756 790 if ( true === $secure_transport ) 757 791 error_reporting($error_reporting); 758 792 759 $process = WP_Http::processResponse($strResponse); 760 $arrHeaders = WP_Http::processHeaders($process['headers']); 793 if ( $r['stream'] ) { 794 $process = array( 795 'body' => '', 796 'headers' => $theHeaders 797 ); 798 $arrHeaders = WP_Http::processHeaders( $process['headers'] ); 799 } else { 800 $process = WP_Http::processResponse($strResponse); 801 $arrHeaders = WP_Http::processHeaders($process['headers']); 802 } 761 803 762 804 // Is the response code within the 400 range? 763 805 if ( (int) $arrHeaders['response']['code'] >= 400 && (int) $arrHeaders['response']['code'] < 500 ) … … 779 821 if ( true === $r['decompress'] && true === WP_Http_Encoding::should_decode($arrHeaders['headers']) ) 780 822 $process['body'] = WP_Http_Encoding::decompress( $process['body'] ); 781 823 782 return array('headers' => $arrHeaders['headers'], 'body' => $process['body'], 'response' => $arrHeaders['response'], 'cookies' => $arrHeaders['cookies'] );824 return array('headers' => $arrHeaders['headers'], 'body' => $process['body'], 'response' => $arrHeaders['response'], 'cookies' => $arrHeaders['cookies'], 'filename' => $r['filename']); 783 825 } 784 826 785 827 /** … … 1075 1117 return array( 'headers' => array(), 'body' => '', 'response' => array('code' => false, 'message' => false), 'cookies' => array() ); 1076 1118 } 1077 1119 1078 $strResponse = stream_get_contents($handle); 1120 if ( $r['stream'] ) { 1121 $stream_handle = fopen( $r['filename'], 'w+' ); 1122 stream_copy_to_stream( $handle, $stream_handle ); 1123 $strResponse = ''; 1124 } else { 1125 $strResponse = stream_get_contents($handle); 1126 } 1079 1127 $meta = stream_get_meta_data($handle); 1080 1128 1081 1129 fclose($handle); … … 1092 1140 if ( true === $r['decompress'] && true === WP_Http_Encoding::should_decode($processedHeaders['headers']) ) 1093 1141 $strResponse = WP_Http_Encoding::decompress( $strResponse ); 1094 1142 1095 return array('headers' => $processedHeaders['headers'], 'body' => $strResponse, 'response' => $processedHeaders['response'], 'cookies' => $processedHeaders['cookies'] );1143 return array('headers' => $processedHeaders['headers'], 'body' => $strResponse, 'response' => $processedHeaders['response'], 'cookies' => $processedHeaders['cookies'], 'filename' => $r['filename']); 1096 1144 } 1097 1145 1098 1146 /** … … 1291 1339 */ 1292 1340 class WP_Http_Curl { 1293 1341 1342 private $headers; 1343 1294 1344 /** 1295 1345 * Send a HTTP request to a URI using cURL extension. 1296 1346 * … … 1387 1437 else 1388 1438 curl_setopt( $handle, CURLOPT_HEADER, false ); 1389 1439 1440 if ( $r['stream'] ) { 1441 $stream_handle = fopen( $r['filename'], 'w+' ); 1442 curl_setopt( $handle, CURLOPT_FILE, $stream_handle ); 1443 curl_setopt( $handle, CURLOPT_HEADERFUNCTION, array( &$this, 'stream_headers' ) ); 1444 } 1445 1390 1446 // The option doesn't work with safe mode or when open_basedir is set. 1391 1447 // Disable HEAD when making HEAD requests. 1392 1448 if ( !ini_get('safe_mode') && !ini_get('open_basedir') && 'HEAD' != $r['method'] ) … … 1420 1476 $theResponse = curl_exec( $handle ); 1421 1477 1422 1478 if ( !empty($theResponse) ) { 1423 $headerLength = curl_getinfo($handle, CURLINFO_HEADER_SIZE); 1424 $theHeaders = trim( substr($theResponse, 0, $headerLength) ); 1425 if ( strlen($theResponse) > $headerLength ) 1426 $theBody = substr( $theResponse, $headerLength ); 1427 else 1479 if ( ! empty( $this->headers ) ) { 1480 $theHeaders = $this->headers; 1428 1481 $theBody = ''; 1429 if ( false !== strpos($theHeaders, "\r\n\r\n") ) { 1430 $headerParts = explode("\r\n\r\n", $theHeaders); 1431 $theHeaders = $headerParts[ count($headerParts) -1 ]; 1482 } else { 1483 $headerLength = curl_getinfo($handle, CURLINFO_HEADER_SIZE); 1484 $theHeaders = trim( substr($theResponse, 0, $headerLength) ); 1485 if ( strlen($theResponse) > $headerLength ) 1486 $theBody = substr( $theResponse, $headerLength ); 1487 else 1488 $theBody = ''; 1489 if ( false !== strpos($theHeaders, "\r\n\r\n") ) { 1490 $headerParts = explode("\r\n\r\n", $theHeaders); 1491 $theHeaders = $headerParts[ count($headerParts) - 1 ]; 1492 } 1432 1493 } 1433 1494 $theHeaders = WP_Http::processHeaders($theHeaders); 1434 1495 } else { … … 1459 1520 if ( true === $r['decompress'] && true === WP_Http_Encoding::should_decode($theHeaders['headers']) ) 1460 1521 $theBody = WP_Http_Encoding::decompress( $theBody ); 1461 1522 1462 return array('headers' => $theHeaders['headers'], 'body' => $theBody, 'response' => $response, 'cookies' => $theHeaders['cookies'] );1523 return array('headers' => $theHeaders['headers'], 'body' => $theBody, 'response' => $response, 'cookies' => $theHeaders['cookies'], 'filename' => $r['filename']); 1463 1524 } 1464 1525 1526 function stream_headers( $handle, $headers ) { 1527 $this->headers .= $headers; 1528 return strlen($headers); 1529 } 1530 1465 1531 /** 1466 1532 * Whether this class can be used for retrieving an URL. 1467 1533 * -
wp-includes/functions.php
2111 2111 } 2112 2112 2113 2113 /** 2114 * Determines a writable directory for temporary files. 2115 * Function's preference is to WP_CONTENT_DIR followed by the return value of <code>sys_get_temp_dir()</code>, before finally defaulting to /tmp/ 2116 * 2117 * In the event that this function does not find a writable location, It may be overridden by the <code>WP_TEMP_DIR</code> constant in your <code>wp-config.php</code> file. 2118 * 2119 * @since 2.5.0 2120 * 2121 * @return string Writable temporary directory 2122 */ 2123 function get_temp_dir() { 2124 static $temp; 2125 if ( defined('WP_TEMP_DIR') ) 2126 return trailingslashit(WP_TEMP_DIR); 2127 2128 if ( $temp ) 2129 return trailingslashit($temp); 2130 2131 $temp = WP_CONTENT_DIR . '/'; 2132 if ( is_dir($temp) && @is_writable($temp) ) 2133 return $temp; 2134 2135 if ( function_exists('sys_get_temp_dir') ) { 2136 $temp = sys_get_temp_dir(); 2137 if ( @is_writable($temp) ) 2138 return trailingslashit($temp); 2139 } 2140 2141 $temp = ini_get('upload_tmp_dir'); 2142 if ( is_dir($temp) && @is_writable($temp) ) 2143 return trailingslashit($temp); 2144 2145 $temp = '/tmp/'; 2146 return $temp; 2147 } 2148 2149 /** 2114 2150 * Get an array containing the current upload directory's path and url. 2115 2151 * 2116 2152 * Checks the 'upload_path' option, which should be from the web root folder, -
wp-admin/includes/file.php
153 153 } 154 154 155 155 /** 156 * Determines a writable directory for temporary files.157 * Function's preference is to WP_CONTENT_DIR followed by the return value of <code>sys_get_temp_dir()</code>, before finally defaulting to /tmp/158 *159 * In the event that this function does not find a writable location, It may be overridden by the <code>WP_TEMP_DIR</code> constant in your <code>wp-config.php</code> file.160 *161 * @since 2.5.0162 *163 * @return string Writable temporary directory164 */165 function get_temp_dir() {166 static $temp;167 if ( defined('WP_TEMP_DIR') )168 return trailingslashit(WP_TEMP_DIR);169 170 if ( $temp )171 return trailingslashit($temp);172 173 $temp = WP_CONTENT_DIR . '/';174 if ( is_dir($temp) && @is_writable($temp) )175 return $temp;176 177 if ( function_exists('sys_get_temp_dir') ) {178 $temp = sys_get_temp_dir();179 if ( @is_writable($temp) )180 return trailingslashit($temp);181 }182 183 $temp = ini_get('upload_tmp_dir');184 if ( is_dir($temp) && @is_writable($temp) )185 return trailingslashit($temp);186 187 $temp = '/tmp/';188 return $temp;189 }190 191 /**192 156 * Returns a filename of a Temporary unique file. 193 157 * Please note that the calling function must unlink() this itself. 194 158 *