2010-09-20 1 views
12

При осуществлении oauth2 в мое приложение, мне нужно обрабатывать URI, как:Как предотвратить символ трубы из-за неправильной ошибки URI в Rails 3/Ruby 1.9.2?

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

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

Кто-нибудь знает об обходном пути? Благодарю.

+1

Вы можете исправить опечатку в заголовке ... – hurikhan77

+0

есть вы поставите '# кодирования: UTF-8' в верхней части вашего файлы? 1.9+ очень грустно относится к персонажам. – oma

ответ

15

Недавно я столкнулся с тем же требованием (и проблемой). На 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: это установка: незарезервированная => "! -_ ~ * '() A-Za-Z \ d |"

+1

'URI :: Parser' ==>' NameError: uninitialized constant URI :: Parser'. Есть идеи? Это Ruby 1.8.7 – Matthias

+1

да, URI в 1.8 очень отличается, и намного сложнее заплатить, не переписывая большие куски модуля URI. ЕСЛИ у вас есть эта проблема, лучшим курсом является обновление до 1.9 или использование чего-то другого, кроме WEBrick – tardate

+0

Это действительно отличное решение. Одна из проблем, с которыми я столкнулась, заключалась в том, что даже если вы избежите URL-адреса, некоторые сайты (например, yahoo) перенаправят вас на URL с неограниченными символами (!), А OpenURI будет терпеть крах. Благодаря! – idrinkpabst

1

Я закончил тем, что перешел в Тонкий для WEBrick и не имел проблем.

7

Инициализатор работал, но в итоге я использовал 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 
Смежные вопросы