WordPress.org

Make WordPress Core

Ticket #4137: 4137-functions-new.patch

File 4137-functions-new.patch, 2.2 KB (added by pishmishy, 12 years ago)

patch improved with suggestions

  • functions.php

     
    692692        return $array;
    693693}
    694694
     695function wp_limited_curl($url) {
     696        /* This function is a wrapper for curl
     697         * that limits the amount of data we
     698         * fetch from a URI to avoid DOS problems
     699         * with wp_remote_fopen()
     700         */
     701
     702        $ch = curl_init($url);
     703        global $total;
     704        global $output;
     705        $total = 0;
     706        $output = "";
     707
     708        function read_body($ch, $string) {
     709                $length = strlen($string);
     710                global $total;
     711                global $output;
     712                $total += $length;
     713                $output .= $string;
     714                if ($total > 30720) return -1;
     715                return $length;
     716        }
     717
     718        curl_setopt($ch, CURLOPT_WRITEFUNCTION, 'read_body');
     719        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1);
     720        curl_setopt($ch, CURLOPT_TIMEOUT, 30);
     721        curl_setopt($ch, CURLOPT_BUFFERSIZE, 4096);
     722        curl_setopt($ch, CURLOPT_RANGE, "0-30720");
     723        curl_exec($ch);
     724        curl_close($ch);
     725
     726        return $output;
     727}
     728
    695729function wp_remote_fopen( $uri ) {
    696         $timeout = 10;
     730        $bytes_limit = 30720;  /* limit on size of source documen bytes, see
     731                                * Errata for pingback specification.
     732                                * http://www.hixie.ch/specs/pingback/pingback
     733                                */
     734        $timeout = 10;
    697735        $parsed_url = @parse_url($uri);
    698736
    699737        if ( !$parsed_url || !is_array($parsed_url) )
     
    709747
    710748                //stream_set_timeout($fp, $timeout); // Requires php 4.3
    711749                $linea = '';
    712                 while( $remote_read = fread($fp, 4096) )
     750                $bytes = 0;
     751                while( $remote_read = fread($fp, 4096) && $bytes < $bytes_limit )
     752                        $bytes = $bytes + 4096;
    713753                        $linea .= $remote_read;
    714754                fclose($fp);
    715755                return $linea;
    716756        } else if ( function_exists('curl_init') ) {
    717                 $handle = curl_init();
    718                 curl_setopt ($handle, CURLOPT_URL, $uri);
    719                 curl_setopt ($handle, CURLOPT_CONNECTTIMEOUT, 1);
    720                 curl_setopt ($handle, CURLOPT_RETURNTRANSFER, 1);
    721                 curl_setopt ($handle, CURLOPT_TIMEOUT, $timeout);
    722                 $buffer = curl_exec($handle);
    723                 curl_close($handle);
    724                 return $buffer;
     757                return wp_limited_curl($uri);
    725758        } else {
    726759                return false;
    727760        }