无效 URI - 如何防止 URI::InvalidURIError 错误?

2024-02-17

我从delayed_job 得到以下信息:

[Worker(XXXXXX pid:3720)] Class#XXXXXXX failed with URI::InvalidURIError: bad URI(is not URI?): https://s3.amazonaws.com/cline-local-dev/2/attachments/542/original/mac-os-x[1].jpeg?AWSAccessKeyId=xxxxxxxx&Expires=1295403309&Signature=xxxxxxx%3D - 3 failed attempts

这个 URI 在我的应用程序中的来源方式是。

在我的 user_mailer 中我这样做:

  @comment.attachments.each do |a|
    attachments[a.attachment_file_name] = open(a.authenticated_url()) {|f| f.read }
  end

然后在我的附件模型中:

  def authenticated_url(style = nil, expires_in = 90.minutes)
    AWS::S3::S3Object.url_for(attachment.path(style || attachment.default_style), attachment.bucket_name, :expires_in => expires_in, :use_ssl => attachment.s3_protocol == 'https')
  end

话虽这么说,我是否可以执行某种类型的 URI.encode 或解析来防止有效的 URI(因为我在浏览器中检查了 URL 是否有效)在 Rails 3 中出错并杀死了elasted_job?

谢谢你!


Ruby 有(至少)两个处理 URI 的模块。

URI http://rubydoc.info/stdlib/uri/1.9.2/frames是标准库的一部分。

可寻址::URI http://rubydoc.info/gems/addressable/2.2.2/frames,是一个单独的 gem,并且更全面,并且声称符合规范。

使用其中之一解析 URL,使用 gem 的方法修改任何参数,然后使用to_s在传递它之前,你应该可以走了。

我尝试了 ' open( URI.parse(URI.encode( a.authenticated_url() )) ' 但出现 OpenURI::HTTPError: 403 Forbidden 错误

如果您通过浏览器导航到该页面并且成功,然后通过代码直接访问该页面失败,则可能缺少 cookie 或会话状态。你可能需要使用类似的东西机械化 http://rubydoc.info/gems/mechanize/1.0.0/frames,这将保持该状态,同时允许您浏览网站。


EDIT:

require 'addressable/uri'

url = 'http://www.example.com'

uri = Addressable::URI.parse(url)
uri.query_values = {
  :foo => :bar,
  :q   => '"one two"'
}

uri.to_s # => "http://www.example.com?foo=bar&q=%22one%20two%22"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无效 URI - 如何防止 URI::InvalidURIError 错误? 的相关文章

随机推荐