ruby on railsで開発したアプリケーションにrubocopを導入し、offencesの排除を行っています。
security/open
を排除するためにコードの書き換えを行っているのですが、うまくいきません。
ruby
1// 変更前 2 open( 3 'https://xxx/xxx.zip', 4 http_basic_authentication: ['username', 'password'] 5 ) {|f| 6 p f.read 7 } 8 9//変更後 10 URI.parse('https://xxx/xxx.zip').open( 11 http_basic_authentication: ['username', 'password'] 12 ) {|f2| 13 p f2.read 14 }
これらを実行した結果、それぞれで違う結果が出力されてしまいます。
内容として同じことをやっていると思っていたのですが、違うのでしょうか?
どう違うのでしょうか?
URI.open('~~', http_basic_authentication: ['username', 'password'])
だとどうですか?
まず`p f`した時には`#<Tempfile:/tmp/xxxx>`となり、`p f2`したときには`#<File:/xxx/xxx.zip>`となります。
それぞれreadした場合は、ASCIIの文字コードが変更前では20行ほど出力されるのに対し、変更後のコードでは数え切れないほどの行数で出力されます。
URI.openを使った場合も変更後のコードと同じ挙動になります。
zipが展開されてしまっているなどなのでしょうか?
他の部分も変えていて、違うファイルを取得しているという可能性は無いでしょうか?
他は全く一緒で、openと書いているところをURI.openに書き換えただけで違いますか?
はい、URI.openでも`p f`した時には`#<Tempfile:/tmp/xxxx>`となります。
「他は全く一緒で、」が質問ポイントなのですが、間違いないですか?
「はい。URI. の4文字以外は全く同じです」というのが期待していた回答です。↑のコメントは、2つ前のコメントで知ってますので。
と思ったけど、違うこと書いてますね。
> まず`p f`した時には`#<Tempfile:/tmp/xxxx>`となり、`p f2`したときには`#<File:/xxx/xxx.zip>`となります。
> URI.openを使った場合も変更後のコードと同じ挙動になります。
と
> URI.openでも`p f`した時には`#<Tempfile:/tmp/xxxx>`となります。
は、どちらが正しいのでしょうか?
あと、Rubyのバージョンはいくつでしょうか?
はい。URI. の4文字以外は全く同じです。
2.7.5です
2.7.5ということは、
warning: calling URI.open via Kernel#open is deprecated, call URI.open directly or use URI#open
の警告は出てますか?
1. openのみ
2. URI.parse().open
3. URI.open
のどれとどれが同じなんでしょう?
警告はwarning: URI.escape is obsoleteのみでURI.openには出ていません。
2と3が同じです。
2.7.5で警告が出ないとすると、require "open-uri"以外のライブラリの open が動いているような気がします。
openの直前に、p method(:open).source_location を書いてみて、その出力はどうでしょうか?
心当たりはないですね...
少し調査を続けてみます
あ、上のコメント書き直しました。
あ、rspec-mocksでした
解決したのなら、自己回答を記入してクローズしてください。
あなたの回答
tips
プレビュー