Net::HTTP.start
の使い方を調べていると下記のように、第三引数にHashを指定しているケースが散見されます。
Net::HTTP.start(uri.host, uri.port,:use_ssl=>true) do |http|
response = http.get("/index.html")
puts response.body
end
response = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https') do |http|
http.get('/')
end
しかし公式のドキュメントを見ても第三引数は proxy_addr
という文字列を渡すべきで、Hashを渡すような記述はありません。
start(address, port = 80, proxy_addr = :ENV, proxy_port = nil, proxy_user=nil, proxy_pass=nil) -> Net::HTTP[permalink][rdoc][edit]
start(address, port = 80, proxy_addr = :ENV, proxy_port = nil, proxy_user=nil, proxy_pass=nil) {|http| .... } -> object
[PARAM] proxy_addr:
プロクシのホスト名もしくはアドレスを文字列で指定します。:ENV を指定すると環境変数 http_proxy を利用してプロクシの設定をします。省略した場合には直接接続します。
それでもネット上の記述にこういうのがあるということは、これで問題なく動いているはず。なぜ?と思ったのでソースを見てみました。
https://github.com/ruby/net-http/blob/v0.3.2/lib/net/http.rb#L668-L685
def HTTP.start(address, *arg, &block) # :yield: +http+
arg.pop if opt = Hash.try_convert(arg[-1])
可変長引数を使って第二引数以降は arg
の中に格納され、 arg
の末尾がHashに変換し、 opt
に格納しています。
そしてその opt
はその後Net::HTTPのインスタンスメソッドをイテレートし、 opt
のキーに該当するメソッドがあるかをチェックします。
http.methods.grep(/\A(\w+)=\z/) do |meth|
key = $1.to_sym
opt.key?(key) or next
http.__send__(meth, opt[key])
end
該当するメソッドがあればそれを呼び出す…ということで前述の {use_ssl: true}
の記述は
http = Net::HTTP.new(host, port)
http.use_ssl = true
と同じことをやっているというものでした。
他のライブラリでも似たような実装を見たことがあるので結構常套手段なのかな、と思いつつ、そんなことドキュメントには書いてないじゃない! という気持ちになりました。