0

I'm trying to test 'curl-multi' gem to make http-requests:


puts Benchmark.measure {
  require 'curl-multi'
  # make multiple GET requests
  easy_options = {:follow_location => true}
  multi_options = {:pipeline => true}

  Curl::Multi.get("http://www.google.com/","http://www.google.com/","http://www.google.com/", easy_options, multi_options) do|easy|
    # do something interesting with the easy response
    puts easy.last_effective_url
  end
}

But have a starange error:


/Users/bmalets/.rvm/gems/ruby-1.9.3-p448/gems/curl-multi-0.2/lib/curl-multi.rb: In function ‘add_to_curl’:
/Users/bmalets/.rvm/gems/ruby-1.9.3-p448/gems/curl-multi-0.2/lib/curl-multi.rb:238: warning: ISO C90 forbids mixed declarations and code
/Users/bmalets/.rvm/gems/ruby-1.9.3-p448/gems/curl-multi-0.2/lib/curl-multi.rb:243: error: ‘struct RString’ has no member named ‘len’
/Users/bmalets/.rvm/gems/ruby-1.9.3-p448/gems/curl-multi-0.2/lib/curl-multi.rb: In function ‘c_select’:
/Users/bmalets/.rvm/gems/ruby-1.9.3-p448/gems/curl-multi-0.2/lib/curl-multi.rb:287: error: ‘struct RArray’ has no member named ‘len’
/Users/bmalets/.rvm/gems/ruby-1.9.3-p448/gems/curl-multi-0.2/lib/curl-multi.rb:288: error: ‘struct RArray’ has no member named ‘ptr’
/Users/bmalets/.rvm/gems/ruby-1.9.3-p448/gems/curl-multi-0.2/lib/curl-multi.rb:292: error: ‘struct RArray’ has no member named ‘len’
/Users/bmalets/.rvm/gems/ruby-1.9.3-p448/gems/curl-multi-0.2/lib/curl-multi.rb:293: error: ‘struct RArray’ has no member named ‘ptr’
/Users/bmalets/.rvm/gems/ruby-1.9.3-p448/gems/curl-multi-0.2/lib/curl-multi.rb:302: warning: implicit conversion shortens 64-bit value into a 32-bit value

How can I fix it?

bmalets
  • 3,207
  • 7
  • 35
  • 64

1 Answers1

2

tl;dr: curl-multi RubyGem is now very old and unmaintained: the v0.2 (last release) has been released on June 3, 2008. It is not compatible with Ruby 1.9.

You should definitely consider alternatives such as:

Both provide support for libcurl's multi interface.


The problem here is that you work with Ruby 1.9 and curl-multi has been designed for Ruby 1.8.

In the meanwhile the Ruby C API has changed, e.g the error 'struct RString' has no member named 'len' comes from the fact that in Ruby 1.8 you have (see ruby.h):

struct RString {
    struct RBasic basic;
    long len;
    char *ptr;
    union {
        long capa;
        VALUE shared;
    } aux;
};

While in Ruby 1.9 you have:

struct RString {
    struct RBasic basic;
    union {
        struct {
            long len;
            char *ptr;
            union {
                long capa;
                VALUE shared;
            } aux;
        } heap;
        char ary[RSTRING_EMBED_LEN_MAX + 1];
    } as;
};

In other words things have been optimized vs short strings which are no more heap allocated.

deltheil
  • 15,496
  • 2
  • 44
  • 64