【问题标题】:Error in function 'add_to_curl' when trying to make HTTP-request using curl-multi gem尝试使用 curl-multi gem 发出 HTTP 请求时函数“add_to_curl”出错
【发布时间】:2013-11-17 21:08:04
【问题描述】:

我正在尝试测试“curl-multi”gem 以发出 http 请求:


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
}

但是有一个奇怪的错误:


/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

我该如何解决?

【问题讨论】:

    标签: ruby curl httpclient libcurl curl-multi


    【解决方案1】:

    tl;dr:curl-multi RubyGem 现在非常陈旧且无人维护:v0.2(最新版本)已于 2008 年 6 月 3 日发布。它与 Ruby 1.9 不兼容。

    您绝对应该考虑以下替代方案:

    两者都支持libcurl's multi interface。


    这里的问题是您使用的是 Ruby 1.9,而 curl-multi 是为 Ruby 1.8 设计的。

    与此同时,Ruby C API 发生了变化,例如错误 'struct RString' has no member named 'len' 来自于在 Ruby 1.8 中您拥有的事实(参见 ruby.h):

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

    在 Ruby 1.9 中,您有:

    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;
    };
    

    换句话说,与不再分配堆的short strings相比,事情已经得到优化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-25
      • 2016-05-18
      • 2015-12-08
      • 1970-01-01
      • 2021-11-15
      • 2017-05-08
      • 2021-04-06
      相关资源
      最近更新 更多