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

发布于 2024-09-24 06:29:43 字数 325 浏览 4 评论 0原文

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

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

不确定这是 Rails 3 还是 Ruby 1.9.2 问题(可能是 URI.parse),但无论如何,WEBrick 会踢 Error bad URI< /代码>。

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

In implementing OAuth2 in my app, I need to handle URIs like:

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

Not sure if it's a Rails 3 or Ruby 1.9.2 problem (maybe URI.parse), but in any event, WEBrick kicks Error bad URI.

Anyone know of a workaround? Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

心作怪 2024-10-01 06:29:43

我最近遇到了同样的要求(和问题)。在 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 + '|')

注意:这就是设置: 未保留 => “-_.!~*'()a-zA-Z\d|”

I ran into the same requirement (and problem) recently. On Rails 3 and Ruby 1.9.2.

It is not a problem for our staging/production environment (nginx), but I was interested to find out what the problem was with WEBrick. Turns out the issue is down in the URI::Parser.split method, specifically how it's pattern matching is seeded with the URI::REGEXP::PATTERN constants.

You can "fix" this by adding the following to a config/environments/development.rb (assuming you'd only be using WEBrick in dev .. or you could put it in a config/initializers file)..

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

NB: that's setting :UNRESERVED => "-_.!~*'()a-zA-Z\d|"

泅渡 2024-10-01 06:29:43

初始化器有效,但我最终使用 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

The initializer worked, but I ended up using URI.escape instead as it seemed cleaner and looks like it will handle more cases.

URI.join(origin_url, URI.escape(parsed_link)).to_s

Plus this code just didnt seem right

# 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
找个人就嫁了吧 2024-10-01 06:29:43

我最终只是将 Thin 换成了 WEBrick,并没有遇到任何问题。

I ended up just swapping in Thin for WEBrick and haven't had issues.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文