Подтвердить что ты не робот

Как предотвратить появление символа канала от ошибки Bad URI в Rails 3/Ruby 1.9.2?

При реализации OAuth2 в моем приложении мне нужно обрабатывать URI, например:

http://localhost:3000/sessions/create/?code=lorem|ipsum

Не уверен, что это проблема с Rails 3 или Ruby 1.9.2 (возможно, URI.parse), но в любом случае WEBrick пинает Error bad URI.

Кто-нибудь знает об обходном пути? Спасибо.

4b9b3361

Ответ 1

Недавно я столкнулся с тем же требованием (и проблемой). На Rails 3 и Ruby 1.9.2.

Это не проблема для нашей промежуточной/производственной среды (nginx), но мне было интересно узнать, в чем проблема с WEBrick. Оказывается, проблема не найдена в методе URI:: Parser.split, в частности, как это сопоставление шаблонов засевается константами URI:: REGEXP:: PATTERN.

Вы можете "исправить" это, добавив следующее в конфигурацию /environment/development.rb(предполагая, что вы используете только WEBrick в dev.. или можете поместить его в файл config/initializers).

# this allows WEBrick to handle pipe symbols in query parameters
URI::DEFAULT_PARSER = 
  URI::Parser.new(:UNRESERVED => URI::REGEXP::PATTERN::UNRESERVED + '|')

NB: этот параметр: UNRESERVED = > "-_.! ~ * '() a-zA-Z\d |"

Ответ 2

Инициализатор работал, но в итоге я использовал URI.escape, поскольку он казался более чистым и выглядел так, как будто он будет обрабатывать больше случаев.

URI.join(origin_url, URI.escape(parsed_link)).to_s

Плюс этот код просто не казался правильным

# I need this because URI.join in crawler.rb bombs with '|' symbols
old_verbose = $VERBOSE
$VERBOSE = nil
URI::DEFAULT_PARSER = URI::Parser.new(:UNRESERVED => URI::REGEXP::PATTERN::UNRESERVED + '|')
$VERBOSE = old_verbose

Ответ 3

В итоге я просто обменялся на Thin для WEBrick и не имел проблем.