如何防止管道字符在Rails 3/Ruby 1.9.2中导致错误的URI错误?

chi*_*ior 12 ruby uri ruby-on-rails

在我的应用程序中实现OAuth2时,我需要处理以下URI:

HTTP://本地主机:3000 /会话/创建/码= LOREM |存有

不确定它是否是Rails 3或Ruby 1.9.2问题(可能是URI.parse),但无论如何,WEBrick会踢Error bad URI.

有人知道解决方法吗?谢谢.

tar*_*ate 15

我最近遇到了同样的要求(和问题).在Rails 3和Ruby 1.9.2上.

这不是我们的登台/制作环境(nginx)的问题,但我有兴趣了解WEBrick的问题.原来问题在于URI :: Parser.split方法,特别是它的模式匹配是如何用URI :: REGEXP :: PATTERN常量播种的.

您可以通过将以下内容添加到config/environments/development.rb来"修复"此问题(假设您只在开发中使用WEBrick ..或者您可以将其放在config/initializers文件中).

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

注意:那个设置:UNRESERVED =>" - _.!〜*'()a-zA-Z\d |"


小智 7

初始化程序工作,但我最终使用URI.escape,因为它看起来更干净,看起来它将处理更多的情况.

URI.join(origin_url, URI.escape(parsed_link)).to_s
Run Code Online (Sandbox Code Playgroud)

再加上这段代码似乎没有用

# 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
Run Code Online (Sandbox Code Playgroud)