Make WordPress Core

Ticket #4779: 4779.r8529.diff

File 4779.r8529.diff, 6.1 KB (added by jacobsantos, 15 years ago)

Cycle through available transports trying each one. Based off of r8529

  • http.php

     
    8888                static $working_transport;
    8989
    9090                if ( is_null($working_transport) ) {
    91                         if ( true === WP_Http_ExtHttp::test() )
    92                                 $working_transport = new WP_Http_ExtHttp();
    93                         else if ( true === WP_Http_Curl::test() )
    94                                 $working_transport = new WP_Http_Curl();
    95                         else if ( true === WP_Http_Streams::test() )
    96                                 $working_transport = new WP_Http_Streams();
    97                         else if ( true === WP_Http_Fopen::test() )
    98                                 $working_transport = new WP_Http_Fopen();
    99                         else if ( true === WP_Http_Fsockopen::test() )
    100                                 $working_transport = new WP_Http_Fsockopen();
     91                        if ( true === WP_Http_ExtHttp::test() && apply_filters('use_http_extension_transport', true) )
     92                                $working_transport[] = new WP_Http_ExtHttp();
     93                        else if ( true === WP_Http_Curl::test() && apply_filters('use_curl_transport', true) )
     94                                $working_transport[] = new WP_Http_Curl();
     95                        else if ( true === WP_Http_Streams::test() && apply_filters('use_streams_transport', true) )
     96                                $working_transport[] = new WP_Http_Streams();
     97                        else if ( true === WP_Http_Fopen::test() && apply_filters('use_fopen_transport', true) )
     98                                $working_transport[] = new WP_Http_Fopen();
     99                        else if ( true === WP_Http_Fsockopen::test() && apply_filters('use_fsockopen_transport', true) )
     100                                $working_transport[] = new WP_Http_Fsockopen();
    101101                }
    102102
    103103                return $working_transport;
     
    121121                static $working_transport;
    122122
    123123                if ( is_null($working_transport) ) {
    124                         if ( true === WP_Http_ExtHttp::test() )
    125                                 $working_transport = new WP_Http_ExtHttp();
    126                         else if ( true === WP_Http_Streams::test() )
    127                                 $working_transport = new WP_Http_Streams();
    128                         else if ( true === WP_Http_Fsockopen::test() )
    129                                 $working_transport = new WP_Http_Fsockopen();
     124                        if ( true === WP_Http_ExtHttp::test() && apply_filters('use_http_extension_transport', true) )
     125                                $working_transport[] = new WP_Http_ExtHttp();
     126                        else if ( true === WP_Http_Streams::test() && apply_filters('use_streams_transport', true) )
     127                                $working_transport[] = new WP_Http_Streams();
     128                        else if ( true === WP_Http_Fsockopen::test() && apply_filters('use_fsockopen_transport', true) )
     129                                $working_transport[] = new WP_Http_Fsockopen();
    130130                }
    131131
    132132                return $working_transport;
     
    170170         * @param string $url URI resource.
    171171         * @param str|array $args Optional. Override the defaults.
    172172         * @param string|array $headers Optional. Either the header string or array of Header name and value pairs. Expects sanitized.
    173          * @param string $body Optional. The body that should be sent. Expected to be already processed.
     173         * @param string $body Optional. The body that should be sent. Will be automatically escaped and processed.
    174174         * @return boolean
    175175         */
    176176        function request($url, $args = array(), $headers = null, $body = null) {
    177177                global $wp_version;
    178178
    179179                $defaults = array(
    180                         'method' => 'GET', 'timeout' => 3,
     180                        'method' => 'GET', 'timeout' => apply_filters('http_request_timeout', 3),
    181181                        'redirection' => 5, 'httpversion' => '1.0',
    182182                        'user-agent' => apply_filters('http_headers_useragent', 'WordPress/' . $wp_version ),
    183183                        'blocking' => true
     
    195195                if ( ! isset($headers['user-agent']) || ! isset($headers['User-Agent']) )
    196196                        $headers['user-agent'] = $r['user-agent'];
    197197
    198                 if ( is_null($body) )
    199                         $transport = WP_Http::_getTransport();
    200                 else
    201                         $transport = WP_Http::_postTransport();
     198                if ( is_null($body) ) {
     199                        if ( ! is_string($body) )
     200                                $body = http_build_query($body);
    202201
    203                 return $transport->request($url, $r, $headers, $body);
     202                        $transports = WP_Http::_getTransport();
     203                } else
     204                        $transports = WP_Http::_postTransport();
     205
     206                $response = array( 'headers' => array(), 'body' => '', 'response' => array('code', 'message') );
     207                foreach( (array) $transports as $transport ) {
     208                        $response = $transport->request($url, $r, $headers, $body);
     209
     210                        if( !is_wp_error($response) )
     211                                break;
     212                }
     213
     214                return $response;
    204215        }
    205216
    206217        /**
     
    414425                if ( true === $secure_transport )
    415426                        $error_reporting = error_reporting(0);
    416427
    417                 $handle = fsockopen($arrURL['host'], $arrURL['port'], $iError, $strError, apply_filters('http_request_timeout', absint($r['timeout']) ) );
     428                $handle = fsockopen($arrURL['host'], $arrURL['port'], $iError, $strError, $r['timeout'] );
    418429
    419430                if ( false === $handle )
    420431                        return new WP_Error('http_request_failed', $iError . ': ' . $strError);
     
    538549                        return new WP_Error('http_request_failed', sprintf(__('Could not open handle for fopen() to %s'), $url));
    539550
    540551                if ( function_exists('stream_set_timeout') )
    541                         stream_set_timeout($handle, apply_filters('http_request_timeout', $r['timeout']) );
     552                        stream_set_timeout($handle, $r['timeout'] );
    542553
    543554                if ( ! $r['blocking'] ) {
    544555                        fclose($handle);
     
    612623
    613624                $r = wp_parse_args( $args, $defaults );
    614625
     626                if ( isset($headers['User-Agent']) ) {
     627                        $r['user-agent'] = $headers['User-Agent'];
     628                        unset($headers['User-Agent']);
     629                } else if( isset($headers['user-agent']) ) {
     630                        $r['user-agent'] = $headers['user-agent'];
     631                        unset($headers['user-agent']);
     632                } else {
     633                        $r['user-agent'] = apply_filters('http_headers_useragent', 'WordPress/' . $wp_version );
     634                }
     635
    615636                $arrURL = parse_url($url);
    616637
    617638                if ( 'http' != $arrURL['scheme'] || 'https' != $arrURL['scheme'] )
     
    620641                $arrContext = array('http' =>
    621642                        array(
    622643                                'method' => strtoupper($r['method']),
    623                                 'user-agent' => $headers['User-Agent'],
     644                                'user-agent' => $r['user-agent'],
    624645                                'max_redirects' => $r['redirection'],
    625646                                'protocol_version' => (float) $r['httpversion'],
    626647                                'header' => $headers,
     
    628649                        )
    629650                );
    630651
     652                var_dump($arrContext);
    631653                if ( ! is_null($body) )
    632654                        $arrContext['http']['content'] = $body;
    633655
     
    638660                if ( ! $handle)
    639661                        return new WP_Error('http_request_failed', sprintf(__('Could not open handle for fopen() to %s'), $url));
    640662
    641                 stream_set_timeout($handle, apply_filters('http_request_stream_timeout', $r['timeout']) );
     663                stream_set_timeout($handle, $r['timeout'] );
    642664
    643665                if ( ! $r['blocking'] ) {
    644666                        fclose($handle);