dangerous_open_uri という gem を作った
イントロ
gem にした。名前は結構気に入ってる。
仕事でこういうことをしたかった、というのが背景としてある。
さらに会社の先輩に冗談で「作っちゃえよ、需要あるっしょ」と言われて、それもそうかと一晩で作った。
mgi166/dangerous_open_uri · GitHub
詳細
mgi166/dangerous_open_uri の README.md に大体書いてある。
これを使うと basic 認証がかかっているページを open-uri
で開くことができる。
open-uri の場合
require 'open-uri' open("http://user:pass@www.example.com/secret/page.html").read #=> ArgumentError: userinfo not supported. [RFC3986] #=> from /Users/user/.rbenv/versions/2.1.2/lib/ruby/2.1.0/open-uri.rb:261:in `open_http'
ArgumentError となる。しかも RFC3986
という文字も付いてきて、不穏な雰囲気。
じゃあどうやるのかというと Baisc 認証の場合は以下のようにするのが普通。
第二引数の option として http_basic_authentication
に配列で user名、password を渡す。
require 'open-uri' open("http://www.example.com/secret/page.html", http_basic_authentication: ["user", "pass"]).read #=> "hello, world!"
dangerous_open_uri の場合
option 指定しなくてよくなる。たったこれだけ。
require 'dangerous_open_uri' open("http://user:pass@www.example.com/secret/page.html").read #=> "hello, world!"
dangerous の理由
https://www.ruby-forum.com/topic/95983
open-uri('http://user:pass@www.host.de/') does not work as expected. According to RFC3986, supporting userinfo in URI is dangerous, so that open-uri will not support it. matz. Report post Edit Delete Reply with quote
RFC3986 で dangerous
とされているため、open-uri
ではサポートしないよ、と仰ってます。
本当に dangerous?
内部的には
userinfo
がある場合はhttp_basic_authentication
に user と password 入れるuserinfo
を空にするOpenURI.open_http
を呼ぶ
ということやってるだけなので、ほとんど open-uri
です。
したがって open-uri
の安全精度とほぼ変わらないはず。(と筆者は考えている)
まとめ
一晩で作れるような代物だったので、フットワーク軽く作れたと思う。重かったらこうはならない。
重くてもサラッと作れるようになっていきたい。
名前は dangerous だけど、dangerous じゃなく作ったつもりです。
マジで危ない作りになっていたら PR ください。