Почему Ури.escape () помечен как устаревший и где эта константа REGEXP::UNSAFE?

Я пытаюсь выяснить, какой набор небезопасных символов по умолчанию для URI.побег в ruby 2.2.3. The docs говорят:

по умолчанию использует REGEXP:: UNSAFE

но я не могу найти эту константу нигде в модуле URI.

кроме того, код (фрагмент ниже) имеет методы 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

являются ли документы просто неправильно / устарело?

2 ответов


Я вижу, вы ответили на свой вопрос re:UNSAFE. Что касается этого вопроса:

кроме того, код имеет методы escape / unescape, помеченные как "устаревшие" с 2009 года. Почему они устарели?

в этом декабре есть некоторый фон. Вопрос 2010: https://bugs.ruby-lang.org/issues/4167 в этом потоке Юи Нарусэ пишет:

URI lib говорит, что он ссылается на RFC2396, поэтому текущее поведение правильно в свой спекуляция.

Да, я знаю, что текущее поведение не то, что вы ожидаете. Поэтому мы планируем измените lib для ссылки на RFC3986.

кроме того текущий URI.кодировать простая gsub. Но я думаю, что это должно разделите URI на компоненты, затем выделите все компоненты и, наконец, присоединиться к ним.

so текущий URI.кодирование считается вредным и устаревшим. Эта воля удалить или радикально изменить поведение.

что такое замена в это время?

Как я сказал выше, текущий URI.кодирование неверно на уровне спецификации. Так мы не обеспечит точную замену. Замена поменяет своим вариант использования.

мы думали, что большинство вариантов использования-генерировать экранированный URI из присоединенного URI компоненты. Для этого люди должны использовать 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;\/?:@&=+$,\[\]]/

EDIT: кажется, вы можете получить его просто:

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