如何防止管道字符在Rails 3 / Ruby 1.9.2中导致错误的URI错误?
在我的应用程序中实现OAuth2时,我需要处理以下URI:
HTTP://本地主机:3000 /会话/创建/码= LOREM |存有
不确定它是否是Rails 3或Ruby 1.9.2问题(可能是URI.parse),但无论如何,WEBrick会启动Error bad URI
。
有人知道解决方法吗? 谢谢。
我最近遇到了同样的要求(和问题)。 在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 + '|')
注意:那个设置:UNRESERVED =>“ – _。!〜*’()a-zA-Z \ d |”
初始化程序工作,但我最终使用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
我最后只是换了Thin for WEBrick并没有遇到问题。