我试图弄清楚ruby 2.2.3中URI.escape的默认不安全字符集是什么.该文件说:
默认情况下使用REGEXP :: UNSAFE
但我无法在URI模块中找到任何常量.
此外,此代码(下面的代码段)自2009年以来标记为"过时"的escape/unescape方法.为什么它们已经过时了?
lib/uri/common.rb:97
def escape(*arg)
warn "#{caller(1)[0]}: warning: URI.escape is obsolete" if $VERBOSE
DEFAULT_PARSER.escape(*arg)
end
Run Code Online (Sandbox Code Playgroud)
文档是错误/过时了吗?
我看到你回答了你的问题:UNSAFE
。关于这个问题:
此外,自 2009 年以来,此代码将 escape / unescape 方法标记为“过时”。为什么它们已过时?
这个 2010 年 12 月的问题有一些背景:https : //bugs.ruby-lang.org/issues/4167在那个线程中 Yui Naruse 写道:
URI lib 说它引用了 RFC2396,因此当前行为在其规范中是正确的。
是的,我知道当前的行为不是您所期望的。所以我们计划更改 lib 以引用 RFC3986。
此外,当前的 URI.encode 是简单的 gsub。但我认为它应该将 URI 拆分为组件,然后对每个组件进行转义,最后加入它们。
所以当前的 URI.encode 被认为是有害的并且已被弃用。这将被删除或彻底改变行为。
这个时候换什么?
正如我上面所说,当前的 URI.encode 在规范级别是错误的。所以我们不会提供确切的替代品。替换将根据其用例而有所不同。
我们认为大多数用例是从连接的 URI 组件生成转义的 URI。为此,人们应该使用 URI.join 或 URI.encode_www_form;您应该在加入每个组件之前转义它们。
事实证明,文档对于默认常量并不十分准确。如果我们看
https://github.com/ruby/ruby/blame/trunk/lib/uri/rfc2396_parser.rb#L299
它不再是一个常量,而是散列的成员。所以默认值真的可以这样检查:
> URI::DEFAULT_PARSER.regexp[:UNSAFE]
=> /[^\-_.!~*'()a-zA-Z\d;\/?:@&=+$,\[\]]/
Run Code Online (Sandbox Code Playgroud)
编辑:看来你可以简单地得到它:
> URI::UNSAFE
=> /[^\-_.!~*'()a-zA-Z\d;\/?:@&=+$,\[\]]/
Run Code Online (Sandbox Code Playgroud)
还有一种替代方法,因此如果您使用可寻址gem,则可以使用其 URI 模块以及常规 URI 的::escape方法。
Addressable::URI.escape(value)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3075 次 |
最近记录: |