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

时间:2011-01-19 00:51:17

标签: ruby-on-rails ruby-on-rails-3

我从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中出错并杀死delayed_job?

谢谢!

1 个答案:

答案 0 :(得分:1)

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

URI是标准库的一部分。

Addressable::URI,是一个独立的宝石,更全面,并声称符合规范。

使用其中任何一个解析URL,使用gem的方法修改任何参数,然后在传递之前使用to_s进行转换,你应该很高兴。

  

我试过'open(URI.parse(URI.encode(a.authenticated_url()))'但是那个错误的OpenURI :: HTTPError:403 Forbidden

如果您通过浏览器导航到该页面并且成功,那么之后无法通过代码直接进入该页面,可能会缺少cookie或会话状态。您可能需要使用类似Mechanize的内容,它将保持该状态,同时允许您浏览网站。


编辑:

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"