【问题标题】:Why is URI.escape() marked as obsolete and where is this REGEXP::UNSAFE constant?为什么 URI.escape() 被标记为过时,这个 REGEXP::UNSAFE 常量在哪里?
【发布时间】:2015-12-14 19:14:44
【问题描述】:

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

默认使用 REGEXP::UNSAFE

但我在 URI 模块的任何地方都找不到该常量。

此外,this code(下面的 sn-p)自 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

文档是错误的/过时的吗?

【问题讨论】:

  • 不要说“此代码”并提供链接。相反,只提取与您的讨论相关的代码并将其放入您的问题中。请阅读“How to Ask”和“minimal reproducible example”。以这种方式考虑:链接失效,当链接失效时,您的问题对于寻求相同答案的其他人来说是否有意义?

标签: ruby


【解决方案1】:

还有一个替代方案,因此如果您使用 addressable gem,您可以使用其 URI 模块以及常规 URI 的 ::escape 方法。

Addressable::URI.escape(value)

【讨论】:

    【解决方案2】:

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

    此外,this code 自 2009 年以来将 escape / unescape 方法标记为“已过时”。为什么它们已过时?

    在 2010 年 12 月的这个问题中有一些背景:https://bugs.ruby-lang.org/issues/4167 在那个线程中 Yui Naruse 写道:

    URI lib 表示它引用 RFC2396,因此当前行为在其 规格。

    是的,我知道当前的行为不是您所期望的。所以我们计划 更改库以引用 RFC3986。

    此外,当前的 URI.encode 是简单的 gsub。但我认为应该 将 URI 拆分为组件,然后转义每个组件,最后 加入他们。

    因此,当前的 URI.encode 被认为是有害的并已弃用。这将 被删除或彻底改变行为。

    此时的替代品是什么?

    正如我上面所说,当前的 URI.encode 在规范级别上是错误的。所以我们 不会提供确切的替换。更换会因它而异 用例。

    我们认为大多数用例是从加入的 URI 生成转义的 URI 组件。为此,人们应该使用 URI.join 或 URI.encode_www_form;您应该在加入之前转义每个组件 他们。

    【讨论】:

    • 正如报价所说,URI.encode_www_form 是安全的。它也很容易使用。 Addressable::URI 是一个非常有价值的宝石,如果我必须使用大量 URI 做任何事情,我更喜欢它。
    【解决方案3】:

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

    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;\/?:@&=+$,\[\]]/
    

    【讨论】:

    猜你喜欢
    • 2018-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多