括弧 [ と ] を含む URI を解析しようとしています。これを URI.parse で直接解析しようとしましたが、括弧が原因で失敗します。したがって、括弧を処理する CGI::escape で URI をエンコードしようとしましたが、このエンコードされた URI を URI.parse で解析しようとすると、URI として認識されず、URI 全体がパスに入れられます。物体。
irb セッションでデモンストレーションを行う。
irb(main):001:0> require 'uri'
=> true
irb(main):002:0> require 'cgi'
=> true
irb(main):003:0> name = "http://www.website.com/dir1/dir[2]/file.txt"
=> "http://www.website.com/dir1/dir[2]/file.txt"
irb(main):004:0> encoded_name = CGI::escape(name)
=> "http%3A%2F%2Fwww.website.com%2Fdir1%2Fdir%5B2%5D%2Ffile.txt"
irb(main):005:0> parsed_name = URI.parse(encoded_name)
=> #<URI::Generic:0x00000001e8f520 URL:http%3A%2F%2Fwww.website.com%2Fdir1%2Fdir%5B2%5D%2Ffile.txt>
irb(main):006:0> parsed_name.scheme
=> nil
irb(main):007:0> parsed_name.host
=> nil
irb(main):008:0> parsed_name.path
=> "http%3A%2F%2Fwww.website.com%2Fdir1%2Fdir%5B2%5D%2Ffile.txt"
irb(main):009:0> URI.split(encoded_name)
=> [nil, nil, nil, nil, nil, "http%3A%2F%2Fwww.website.com%2Fdir1%2Fdir%5B2%5D%2Ffile.txt", nil, nil, nil]
とにかく、現時点での私の回避策は、次の醜いが効果的なハックです
encoded_name = name.gsub(/\[/,"%5B").gsub(/\]/,"%5D")
これを URI.parse で解析すると、望ましい結果が得られますが、他の奇妙な文字が URI に侵入した場合は対処できません。だから私の質問は、これを行う確実な方法はありますか?