LoginSignup
3
0

More than 1 year has passed since last update.

公式ドキュメントには書いていないNet::HTTP.startの使い方

Last updated at Posted at 2023-05-16

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

と同じことをやっているというものでした。

他のライブラリでも似たような実装を見たことがあるので結構常套手段なのかな、と思いつつ、そんなことドキュメントには書いてないじゃない! :anger: という気持ちになりました。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0