Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

No such file or directory @ rb_sysopen for external URL / Rails 6.11 / Ruby 3

Tags:

ruby

This was working fine in Rails 6 but now upgrading Rails and Ruby to 6.11 and 3, it's triggering this "classic" error. Basically, to be short, for example this external URL direct to Firefox logo, using the Rails console:

require 'open-uri'
open("https://brandemia.org/sites/default/files/inline/images/firefox_logo.jpg")
Traceback (most recent call last):
        4: from (irb):1:in `<main>'
        3: from (irb):2:in `rescue in <main>'
        2: from (irb):2:in `open'
        1: from (irb):2:in `initialize'
Errno::ENOENT (No such file or directory @ rb_sysopen - https://brandemia.org/sites/default/files/inline/images/firefox_logo.jpg)

In the app same error. Before the Rails and Ruby upgrade (with Ruby 2.5.8 and Rails 6.0.3.1) this was working perfectly fine.

like image 757
Dario Avatar asked Jan 28 '21 13:01

Dario


2 Answers

open-uri used to (before Ruby 3.0) overwrite Kernel#open with its own version which also supports reading from external URLs rather than simply opening local files or running commands.

Mixing those two use-cases was quite dangerous and had the potential for serious vulnerabilities if the passed URL was not ensured to be safe everywhere (including third-party code using Kernel#open).

As such, this behavior to overwrite Kernel#open was deprecated in Ruby 2.7 and finally removed in Ruby 3.0. To open an external URL, you can use the following code instead:

URI.open("https://brandemia.org/sites/default/files/inline/images/firefox_logo.jpg")
like image 180
Holger Just Avatar answered Nov 15 '22 23:11

Holger Just


I am not exactly sure where the change comes from, but

require 'open-uri'

uri = 'https://brandemia.org/sites/default/files/inline/images/firefox_logo.jpg'
URI.open(uri) # ! instead of open without URI

should work.

Update open-uri did declare Kernel#open until the 3.0 release. Apparently that was deprecated in 2.7. From now on, you need to call URI.open . See the commit here: https://github.com/ruby/open-uri/commit/53862fa35887a34a8060aebf2241874240c2986a .

like image 32
Felix Avatar answered Nov 15 '22 21:11

Felix