0

我正在完成 Hard Way 练习,在尝试运行 ex12 的课程代码时遇到了运行时错误。

有什么建议么?提前致谢!

说明 http://ruby.learncodethehardway.org/book/ex12.html

我的输入

require 'open-uri'

open("http://www.ruby-lang.org/en") do |f|
    f.each_line {|line| p line}
    puts f.base_uri     # <URI::HTTP:0x40e6ef2 URL:http://www.ruby-lang.org/en/>
    puts f.content_type # "text/html"
    puts f.charset      # "iso-8859-1"
    puts f.content_encoding # []
    puts f.last_modified    # Thu Dec 05 02:45:02 UTC 2002
end

输出 =>

$ ruby ex12.rb
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:174:in `open_loop': redirection forbidden: http://www.ruby-lang.org/en -> https://www.ruby-lang.org/en (RuntimeError)
from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:132:in `open_uri'
from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:518:in `open'
from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:30:in `open'
from ex12.rb:3
4

2 回答 2

2

这是与 SSL 相关的重定向问题

堆栈跟踪给出了这个错误:

`open_loop':禁止重定向:http ://www.ruby-lang.org/en -> https://www.ruby-lang.org/en (RuntimeError)

无论出于何种原因,当从 http 方案重定向到 https 时,open-uri 都会检测到循环。修复它所需要做的就是在调用Kernel#open方法时在 URI 中使用正确的方案。例如:

open('https://www.ruby-lang.org/en')

一旦进行了更改,脚本就可以正常工作。

于 2013-10-25T00:16:18.213 回答
0

在同样的练习中,将 http 更正为 https 后,我得到了这个:

/Users/FDS/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/net/http.rb:918:in `connect': SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (OpenSSL::SSL::SSLError)

    from /Users/FDS/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/net/http.rb:918:in `block in connect'
    from /Users/FDS/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/timeout.rb:52:in `timeout'   
    from /Users/FDS/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/net/http.rb:918:in `connect'     
    from /Users/FDS/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/net/http.rb:862:in `do_start'    
    from /Users/FDS/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/net/http.rb:851:in `start'
    from /Users/FDS/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/open-uri.rb:313:in `open_http'
    from /Users/FDS/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/open-uri.rb:708:in `buffer_open'
    from /Users/FDS/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/open-uri.rb:210:in `block in open_loop'
    from /Users/FDS/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/open-uri.rb:208:in `catch'   
    from /Users/FDS/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/open-uri.rb:208:in `open_loop'
    from /Users/FDS/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/open-uri.rb:149:in `open_uri'
    from /Users/FDS/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/open-uri.rb:688:in `open'          
    from /Users/FDS/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/open-uri.rb:34:in `open'
    from openuri.rb:2:in `<main>'
于 2013-11-08T15:08:15.080 回答