【问题标题】:Ruby 2 Upgrade Breaks Nokogiri and/or open-uri Encoding?Ruby 2 升级会破坏 Nokogiri 和/或 open-uri 编码?
【发布时间】:2014-05-14 20:13:45
【问题描述】:

在将我们的 Rails3.2 Ruby 1.9 应用程序升级到 Rails3.2 Ruby 2.1.2 应用程序时,我有一个谜要解决。 Nokogiri 似乎崩溃了,因为它使用 open-uri 改变了它的行为。没有 gem 版本被改变,只有 ruby​​ 版本(这都是在 OSX Mavericks 上,使用 brew、gcc4 等)。

重现步骤:

$ ruby -v
ruby 1.9.3p484 (2013-11-22 revision 43786) [x86_64-darwin13.1.0]

$ rails console
Connecting to database specified by database.yml
Loading development environment (Rails 3.2.18)

> feed = Nokogiri::XML(open(URI.encode("http://anyblog.wordpress.org/feed/")))
=> #(Document:0x3fcb82f08448 {
  name = "document",
  children = [
  ..

> feed.xpath("//item").count
=> 10

一切都好!接下来,在将 rvm 更改为 Ruby 2.1.2 并进行捆绑安装之后..

$ ruby -v
ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-darwin13.0]

$ rails console
Connecting to database specified by database.yml
Loading development environment (Rails 3.2.18)

> feed = Nokogiri::XML(open(URI.encode("http://anyblog.wordpress.org/feed/")))
=> 

> feed.inspect
=> "#<Nokogiri::XML::Document:0x86a1f21c name=\"document\">"

> feed.xpath("//item").count
=> 0

所以看起来“开放”编码已经改变,因为 gzip http 流没有被正确地馈送到 nokogiri?我用 nokogiri -v 进行了检查,它使用的是打包的 xml 库而不是系统库。这是一个开放 uri Ruby 2.1.2 问题吗?

另一种理论是,其中一个 gem 对 open-uri 进行了猴子补丁以修复 1.9 中的某些问题,而这会破坏 2.1?请帮助或想法!

编辑:这里有更多不使用 Nokogiri 的信息,即认为这更像是 Ruby 2.1.2 上的一个开放 uri 问题:

> open(url) {|f|
*   f.each_line {|line| p line}
*   p f.content_type
*   p f.charset
*   p f.content_encoding
* }  
"\u001F\x8B\b\u0000\u0000\u0000\u0000\u0000\u0000\u0003\xED\x9D\xDBr\eW\xB2\xA6\xAF\xED\xA7\xA8\xCD\u001E\xB7/$\u0010..
(snip)
3\xF3\xA79\xA7\xFAɗ\xFF\u000F\xEAo\x9C\u0014k\xE8\u0000\u0000"
"text/xml"
"utf-8"
["gzip"]
=> ["gzip"]

.. 1.9 版本是可读的,即 gzip 已经应用了。

如果我进入一个干净的 ruby​​ irb 它工作正常,所以它一定是我的 rails gem 中的某些东西正在改变 open-uri open 的行为以不放气/gzip。我引用了很多宝石.. :(

【问题讨论】:

    标签: ruby-on-rails ruby nokogiri open-uri


    【解决方案1】:

    好的,这是一个答案,也许是答案。 Ruby 2 改变了它在 HTTP 请求和压缩/放气中使用标头的方式,但在某些时候他们改变了主意,并把它变成了 1.9 的工作方式。在此期间,一些 Rails gem 维护者猴子修补了 HTTP:Net,以使他们的 gem 在 1.9 和 2.0 上都可以工作。那些猴子补丁仍然存在于旧版本的 gems 中,并导致我看到从 1.9 升级到 2.1 的问题

    这里对问题和解决方案进行总结:

    http://avi.io/blog/2013/12/17/do-not-upgrade-your-rails-project-to-ruby-2-before-you-read-this/

    我们使用 gem right_aws,关于 ruby​​ 版本的问题的详细信息在这里:

    https://github.com/sferik/twitter/issues/473

    解决方案是在我们的 Gemfile 中使用它作为 gem 引用来撤消猴子补丁:

    gem 'right_http_connection', git: 'git://github.com/rightscale/right_http_connection.git', ref: '3359524d81'
    

    背景阅读和更多信息:

    https://github.com/rightscale/right_aws/issues/167

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-01
      • 2014-02-18
      • 2011-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多