From: Nobuyoshi Nakada Date: 2010-01-10T02:42:16+09:00 Subject: [ruby-dev:40005] Re: [Feature #2579] Net::HTTP.start("www.ruby-lang.org", use_ssl: true) で SSL 利用を可能に なかだです。 At Sat, 9 Jan 2010 20:34:23 +0900, Yui NARUSE wrote in [ruby-dev:40003]: > この提案では、Net::HTTP(addr, opt){..} という呼び出し方を追加します。 > opt はハッシュで、アクセサのある項目を設定する事が出来ます。 > > なお、折角の新 API なので、この API を使った場合、verify_mode のデフォルトが VERIFY_PEER になっています。 > つまり、この API を用いた場合デフォルトで SSL 署名の有効性を検査するため、 > 期限切れやオレオレ証明書の場合例外が出ます。 verify_modeの指定が面倒なので、こうしてはどうでしょうか。 > これにより、さっきのは以下のように書けます。 > Net::HTTP.start("www.ruby-lang.org", use_ssl: true){|h| } Net::HTTP.start("www.ruby-lang.org", use_ssl: true, verify_mode: "none"){|h| } Index: lib/net/http.rb =================================================================== --- lib/net/http.rb (revision 26256) +++ lib/net/http.rb (working copy) @@ -451,6 +451,23 @@ module Net #:nodoc: # return value of this method is the newly created Net::HTTP object # itself, and the caller is responsible for closing it upon completion. - def HTTP.start(address, port = nil, p_addr = nil, p_port = nil, p_user = nil, p_pass = nil, &block) # :yield: +http+ - new(address, port, p_addr, p_port, p_user, p_pass).start(&block) + def HTTP.start(address, *arg, &block) # :yield: +http+ + arg.pop if opt = Hash.try_convert(arg.last) + port, p_addr, p_port, p_user, p_pass = *arg + port = https_default_port if opt[:use_ssl] && !port + http = new(address, port, p_addr, p_port, p_user, p_pass) + + case verify_mode = opt[:verify_mode] + when Symbol, String + opt = opt.merge(verify_mode: OpenSSL::SSL.const_get("VERIFY_#{verify_mode.to_s.upcase}")) + when nil + opt = opt.merge(verify_mode: OpenSSL::SSL::VERIFY_PEER) + end + http.methods.grep(/\A(\w+)=\z/) do |meth| + key = $1.to_sym + opt.key?(key) or next + http.__send__(meth, opt[key]) + end + + http.start(&block) end -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦