I am writing a script to download warcraft 3 replays for me. It got a
few (which work) then had an error:
URI::InvalidURIError: bad URI(is not URI?): http://ftp.replays.net/
w3g/060607/060606_mYm]Lucifer(UD)_vs_mTw-LasH(Hum)_TwistedMeadows_RN.w3g
The URL works in Safari, so I’m not sure what’s going on. My wild
guess is that Safari accepts technically invalid URLs. Hopefully
someone knowledgeable can tell me what the issue is. Here’s my code:
urls.each do |url|
filename = url.sub(%r-http://ftp.replays.net/w3g/\d*/-, “”)
if not files.include?(filename)
open(url) do |remote_file|
File.open(path + filename, “w”) do |local_file|
local_file.write remote_file.read
count += 1
end
end
end
end
urls.each do |url|
filename = url.sub(%r-http://ftp.replays.net/w3g/\d*/-, “”)
url = URI.escape(url)
if not files.include?(filename)
puts “Count is #{count}. Getting #{url}”
open(url) do |remote_file|
File.open(path + filename, “w”) do |local_file|
local_file.write remote_file.read
count += 1
end
end
end
end
oops. that didn’t work for URLS with [] in them. now i’ve added this
code:
begin
get_replay url, filename
rescue URI::InvalidURIError
url = url.scan(%r-http://ftp.replays.net/w3g/\d*/-)[0] +
CGI.escape(filename)
begin
get_replay url, filename
rescue URI::InvalidURIError
STDERR.puts $!
end
end
the CGI.escape changes [] but isn’t safe to do on the entire URL (it
changes slashes as well). observe:
irb(main):013:0> x = CGI.escape “http://www.google.com”
=> “http%3A%2F%2Fwww.google.com”
irb(main):014:0> open(x)
Errno::ENOENT: No such file or directory - http%3A%2F%2Fwww.google.com
from /usr/local/lib/ruby/1.8/open-uri.rb:88:in initialize' from /usr/local/lib/ruby/1.8/open-uri.rb:88:in open’
from (irb):14
irb(main):015:0> open “http://www.google.com”
=> #StringIO:0x585b74
I don’t know if I’m doing this the correct way, but it’s working so
far (got about 60 files).
Elliot
This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.