Ruby 2升级打破了Nokogiri和/或open-uri编码?

时间:2014-05-14 20:13:46

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

将Rails3.2 Ruby 1.9应用程序升级到Rails3.2 Ruby 2.1.2时,我有一个谜。 Nokogiri似乎打破了,因为它改变了使用open-uri的行为。没有宝石版本被更改,只有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和bundle install ..

之后
$ 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

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

另一个理论是,其中一颗宝石已经修补了开放式的用于修复1.9中的某些内容并打破了2.1的内容?请帮助或想法!

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

> 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 gems中的某些东西正在改变open-uri打开的行为而不是deflate / gzip。我引用了很多宝石.. :(

1 个答案:

答案 0 :(得分:2)

好的,这是一个答案,也许是答案。 Ruby 2改变了它在HTTP请求和压缩/缩小中使用标头的方式,但在某些时候,他们改变了主意,并将其视为1.9的工作原理。在过渡期间,一些Rails gem维护者猴子修补HTTP:Net使他们的宝石在1.9和2.0上工作。那些猴子补丁仍然存在于旧版本的宝石中,导致我看到从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