読者です 読者をやめる 読者になる 読者になる

scramble cadenza

技術ネタのガラクタ置き場

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 ください。