2015-12-14 8 views
11

私は、安全でない文字のデフォルトセットがruby 2.2.3のURI.escapeのものであるかどうかを調べようとしています。 docsは言う:デフォルトでURI.escape()が不要とマークされ、なぜこのREGEXP :: UNSAFE定数はどこにありますか?

はREGEXP :: UNSAFE

を使用しています。しかし、私はどこでもURIモジュールでその定数を見つけることができません。

さらに、this code(以下の抜粋)には、2009年から「廃止」とマークされているエスケープ/エネケープ処理方法があります。なぜ廃止されたのですか?

lib/uri/common.rb:97 

def escape(*arg) 
    warn "#{caller(1)[0]}: warning: URI.escape is obsolete" if $VERBOSE 
    DEFAULT_PARSER.escape(*arg) 
end 

ドキュメントは間違っているか期限が切れていますか?

+2

「このコード」とはリンクしないでください。代わりに、あなたの議論に関連するコードだけを抽出し、それをあなたの質問に入れてください。 "[ask]"と "[mcve]"をお読みください。このように考えてみましょう。リンクが腐ってしまったとき、あなたの質問が同じ答えを探している他の人にとっては、どんな意味がありますか? –

答えて

4

:あなたは、単にでそれを得ることができます表示されます。この質問に関して:

さらに、this codeはエスケープ/エスケープ解除方法は、彼らが廃止され、なぜ2009年から「時代遅れ」としてマークされていますか?この2010年12月号のいくつかの背景があります

URI libには、それはRFC2396を参照すると言うので、現在の行動は、その 仕様で正しいです:https://bugs.ruby-lang.org/issues/4167そのスレッドゆい成瀬には書いています。

はい、現在の動作は期待したものではありません。だから我々は にRFC3986を参照するようにlibを変更する予定です。

さらに、現在のURI.encodeは単純なgsubです。しかし、私はそれが URIをコンポーネントに分割し、各コンポーネントをエスケープし、最後に に参加する必要があると思います。

現在のURI.encodeは有害なものとみなされ、推奨されなくなりました。これは を削除するか、または動作を大幅に変更します。

この時点での交換は何ですか?

上記のとおり、現在のURI.encodeはスペックレベルで間違っています。したがって、我々は は正確な交換を提供しません。置き換えは、 ユースケースによって異なります。

ほとんどの使用例は、結合されたURI componetsからエスケープされたURIを生成すると考えられました。このため、URI.joinまたは URI.encode_www_formを使用する必要があります。 に参加する前に各コンポーネントをエスケープする必要があります。

+1

引用文に「URI.encode_www_form」と表示されているので安全です。使い方も簡単です。 [Addressable :: URI](https://github.com/sporkmonger/addressable)は、たくさんのURIを使って何かをしなければならない場合、私が好む非常に価値のある宝石です。 –

4

デフォルトの定数に関しては、ドキュメントがかなり正確ではないことが判明しました。我々は

https://github.com/ruby/ruby/blame/trunk/lib/uri/rfc2396_parser.rb#L299

を見れば、それはもはや一定ませんが、ハッシュのメンバー。

> URI::DEFAULT_PARSER.regexp[:UNSAFE] 
=> /[^\-_.!~*'()a-zA-Z\d;\/?:@&=+$,\[\]]/ 

EDIT::だからデフォルトでは本当にこのように調べることができUNSAFE:私はあなたの質問の再に答え参照

> URI::UNSAFE 
=> /[^\-_.!~*'()a-zA-Z\d;\/?:@&=+$,\[\]]/ 
+0

実際の正規表現はここにあります:https://github.com/ruby/ruby/blob/832c74f428db6c5bd6e575e1f6ea7fe0891c84d2/lib/uri/rfc2396_parser.rb#L514 –

関連する問題