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

Я пытаюсь выяснить, что набор небезопасных символов по умолчанию для URI.escape в ruby ​​2.2.3. 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

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

Ответ 1

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

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

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

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

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

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

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

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

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

Мы думали, что наиболее предпочтительным случаем является создание экранированного URI из объединенного URI componets. Для этого людям следует использовать URI.join или URI.encode_www_form; вам следует избегать каждого компонента перед присоединением их.

Ответ 2

Оказывается, документы не совсем точны в отношении константы по умолчанию. Если мы посмотрим на

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