3

I'm getting the error WP HTTP Error: cURL error 28: Operation timed out after 1001 milliseconds with 0 bytes received using the fetch_feed() method in my Wordpress Plugin.

This is for trying to fetch a larger RSS feed and I need to increase the Curl Timeout. Not sure why it is set to 1 second instead of 5 also?

The WP Documentation on this is not very detailed WP_Feed_Cache notably that SimplePie_Cache class documentation is not present.

Any help would be appreciated, not sure if I'm able to hook into SimplePie to increase the Curl Timeout. Also, I tried rewriting my own fetch_feed() method with no success below:

    public function fetchFeed( $url ) {
    if( ! class_exists('\SimplePie', false) ) {
        require_once( ABSPATH . WPINC . '/class-simplepie.php' );
    }

    require_once( ABSPATH . WPINC . '/class-wp-feed-cache.php' );
    require_once( ABSPATH . WPINC . '/class-wp-feed-cache-transient.php' );
    require_once( ABSPATH . WPINC . '/class-wp-simplepie-file.php' );
    require_once( ABSPATH . WPINC . '/class-wp-simplepie-sanitize-kses.php' );

    $feed = new \SimplePie();

    $feed->set_sanitize_class( 'WP_SimplePie_Sanitize_KSES' );
    // We must manually overwrite $feed->sanitize because SimplePie's
    // constructor sets it before we have a chance to set the sanitization class
    $feed->sanitize = new \WP_SimplePie_Sanitize_KSES();


    /* Customize sanitization */
    $feed->sanitize->enable_cache = false;
    $feed->sanitize->timeout = 60;
    $feed->sanitize->useragent = "Custom Testing Feed Reader";

    $feed->set_cache_class( 'WP_Feed_Cache' );
    $feed->set_file_class( 'WP_SimplePie_File' );

    $feed->set_feed_url( $url );
    $feed->set_timeout( 30 );
    /** This filter is documented in wp-includes/class-wp-feed-cache-transient.php */
    $feed->set_cache_duration( apply_filters( 'wp_feed_cache_transient_lifetime', 60, $url ) ); //changing cache time to 60 seconds (instead of 12 hours)
    /**
     * Fires just before processing the SimplePie feed object.
     *
     * @since 3.0.0
     *
     * @param object $feed SimplePie feed object (passed by reference).
     * @param mixed  $url  URL of feed to retrieve. If an array of URLs, the feeds are merged.
     */
    do_action_ref_array( 'wp_feed_options', array( &$feed, $url ) );
    $feed->init();
    // $feed->set_output_encoding( get_option( 'blog_charset' ) );
    $feed->set_output_encoding( "UTF-8" ); //set statically to UTF-8

    if ( $feed->error() )
        return new \WP_Error( 'simplepie-error', $feed->error() );

    return $feed;
}
ant-C
  • 85
  • 7

1 Answers1

4

I was able to increase the Curl Timeout by using the following code:

//Set HTTP Request Timeout
add_filter('http_request_args', 'my_http_request_args', 100, 1);
function my_http_request_args( $r ) {
    $r['timeout'] = 30;
    return $r;
}

//Setting WP HTTP API Timeout
add_action('http_api_curl', 'my_http_api_curl', 100, 1);
function my_http_api_curl( $handle ) {
    curl_setopt( $handle, CURLOPT_CONNECTTIMEOUT, 30);
    curl_setopt( $handle, CURLOPT_TIMEOUT, 30 );
}

// Setting custom timeout for the HTTP request
add_filter('http_request_timeout', 'my_custom_http_request_timeout', 101 );
function my_custom_http_request_timeout( $timeLimit ) {
    return 30;
}
ant-C
  • 85
  • 7
  • Thanks for this. Very annoying that there's no built-in filter that would just change the global timeout! For anyone else wondering, you need to copy all of this to make it work, it seems there are multiple timeouts in WP and if you don't filter them all, you end up with one of them taking over and limiting to 15S. – jerclarke Apr 28 '23 at 22:33
  • Also note that this will increase the timeout on ALL HTTP REQUESTS, not just SimplePie. That means any plugin checking for an update could make your site a LOT slower, so be careful! No one should actually use this on production! I needed it for some acceptance tests that were timing out sometimes. – jerclarke Apr 28 '23 at 22:37