为什么URI.escape()标记为过时,这个REGEXP :: UNSAFE常量在哪里?

时间:2015-12-14 19:14:44

标签: ruby

我试图弄清楚ruby 2.2.3中URI.escape的默认不安全字符集是什么。 docs说:

  

默认情况下使用REGEXP :: UNSAFE

但我无法在URI模块中的任何位置找到该常量。

此外,this code(下面的代码段)将escape / unescape方法标记为'已废弃'自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

文档是错误/过时了吗?

3 个答案:

答案 0 :(得分:4)

事实证明,关于默认常量,文档并不十分准确。如果我们看一下

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

它不再是常量,而是散列的成员。因此可以像这样检查默认值:

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

编辑:看起来你可以简单地得到它:

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

答案 1 :(得分:4)

我看到你回答了问题:UNSAFE。至于这个问题:

  

此外,this code自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;你应该在加入之前逃避每个组件   它们。

答案 2 :(得分:1)

还有另一种选择,因此,如果您使用的是可寻址宝石,则可以使用其URI模块以及常规URI的::escape方法。

Addressable::URI.escape(value)