неверный URI - Как предотвратить ошибки URI :: InvalidURIError? - PullRequest
5 голосов
/ 19 января 2011

Я получил следующее от 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 работает в моем браузере) для ошибки и уничтожения delayed_job в rails 3?

Спасибо!

1 Ответ

1 голос
/ 19 января 2011

В Ruby есть (как минимум) два модуля для работы с URI.

URI является частью стандартной библиотеки.

Addressable :: URI , является отдельным гемом и более полным и претендует на соответствие спецификации.

Анализирует URL-адрес с любым из них, изменяет любые параметрыиспользуя методы драгоценного камня, затем преобразуйте его, используя to_s, прежде чем передавать его, и вам будет хорошо.())) 'но эта ошибка с 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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...