Как предотвратить, чтобы символ канала вызывал ошибку Bad URI в Rails 3 / Ruby 1.9.2? - PullRequest
12 голосов
/ 20 сентября 2010

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

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

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

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

Ответы [ 3 ]

15 голосов
/ 13 марта 2011

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

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

Вы можете «исправить» это, добавив следующее в config / 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 + '|')

Примечание: это настройка: UNRESERVED => "-_.! ~ * '() A-zA-Z \ d |"

7 голосов
/ 24 октября 2012

Инициализатор работал, но я вместо этого использовал 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
1 голос
/ 20 января 2011

Я закончил тем, что просто поменял в Thin на WEBrick, и у меня не было проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...