Как предотвратить появление символа канала от ошибки 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
.
Кто-нибудь знает об обходном пути? Спасибо.
Ответы
Ответ 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 и не имел проблем.