2012-01-13 17 views
2

ルビ1.9.2-p290の使用。私は、次のようなURIを解析しようとしている問題に出くわした:中括弧を含むURIの解析URI :: InvalidURIError:不正なURI(URIではない?)

require 'uri' 
my_uri = "http://www.anyserver.com/getdata?anyparameter={330C-B5A2}" 
the_uri = URI.parse(my_uri) 

次のエラー発行:

URI::InvalidURIError: bad URI(is not URI?) 

を私はこのようなたびに中括弧をコードするよりも別のソリューションが必要です。

new_uri = URI.encode("http://www.anyserver.com/getdata?anyparameter={330C-B5A2}") 
=> "http://www.anyserver.com/getdata?anyparameter=%7B330C-B5A2%7D" 

私はいつものようにnew_uriを解析できますが、必要なたびにこれを行う必要がありました。これを毎回やることなくこれを達成する最も簡単な方法は何ですか?

私は私がそれを解決したときにこれを正確に見たことがないので、自分の解決策を投稿します。


# Accepts URIs when they contain curly braces 
# This overrides the DEFAULT_PARSER with the UNRESERVED key, including '{' and '}' 
module URI 
    def self.parse(uri) 
    URI::Parser.new(:UNRESERVED => URI::REGEXP::PATTERN::UNRESERVED + "\{\}").parse(uri) 
    end 
end 

今私は中括弧を含むURIを持つURI.parse(URI)を使用することができますし、エラーがスローされません。

+0

なぜそれをURIで解析する必要がありますか? URIを持つURLの他の操作をしていますか、または他のパラメータをエンコードする必要がありますか? –

+0

はい、基本的に私は広範囲に使用する宝石を修正していましたが、そのコードをすべて置き換えるのは本当にいいとは言えませんでした。したがって、URI#パースの動作を1か所で変更することをお勧めします:) –

答えて

5
# Need to not fail when uri contains curly braces 
# This overrides the DEFAULT_PARSER with the UNRESERVED key, including '{' and '}' 
# DEFAULT_PARSER is used everywhere, so its better to override it once 
module URI 
    remove_const :DEFAULT_PARSER 
    unreserved = REGEXP::PATTERN::UNRESERVED 
    DEFAULT_PARSER = Parser.new(:UNRESERVED => unreserved + "\{\}") 
end 

をエンコードしなければならないのその優れたが、それは完全のためだけのinsted代用することを意味しますURI#解析メソッド。さらにこれは、毎回新しいParserオブジェクトのインスタンス化のためにメモリを割り当てることを回避する。

+0

あなたはあなたの答えを受け入れるべきです。それは動作します、ありがとう! – mydoghasworms

2

RFC 1738からhttp://www.faqs.org/rfcs/rfc1738.htmlはDEFAULT_PARSERはどこにでも使用されているので、あなたは、同じ問題のフォローアップ中括弧

Thus, only alphanumerics, the special characters "$-_.+!*'(),", and 
reserved characters used for their reserved purposes may be used 
unencoded within a URL. 
+0

ありがとう! uriはRFCに正確に従わなかった外部サービスによって提供されているので、中括弧はとにかく使用されています。 –