Ruby URI#open выдает ошибку на одном компьютере, но не на другом

Я пишу приложение Rails с простым веб-сканером, который находит все ссылки в домене и останавливается всякий раз, когда находит ссылку, ведущую за пределы домена. Как обычно для разработчиков Rails, я разработал и протестировал код в основном на своей локальной машине, а затем просто развернул его на промежуточном сервере, чтобы испытать его в реальной жизни.

Когда сканер проверяет URL, который перенаправляет на другой домен, на моем локальном компьютере #open Метод возвращает пустой объект Tempfile, представляющий перенаправление. Он не следует за редиректом, он просто указывает на то, что он произошел. Я использую эту информацию, чтобы решить, какое сообщение передать пользователю.

Однако на сервере это одно и то же #open метод генерирует RuntimeError, Я использую одинаковые версии Ruby (2.0.0 p576) и Rails (4.0.3) в обеих средах. Я предполагал, что данный фрагмент кода Ruby для той же версии Ruby + Rails и той же среды Rails будет иметь точно такое же поведение. Довольно неприятно видеть, что один и тот же код и внешняя среда могут иметь такие разные результаты.

Есть идеи, почему этот код работает по-разному на разных машинах? Какие файлы или настройки я должен посмотреть, или какие команды я должен выполнить, чтобы попытаться определить, откуда происходит это другое поведение? Я выделил проблему для следующего образца.

Заранее спасибо!

В среде разработки:

Loading production environment (Rails 4.0.3)
2.0.0-p576 :001 > require 'uri'
 => false 
2.0.0-p576 :003 > open 'http://www.ruby-doc.org/' # loads fine
 => #<Tempfile:/var/folders/hz/czmbmhds46s37t_pz8j198g40000gn/T/open-uri20141029-42188-51i9ls> 
2.0.0-p576 :002 > open 'http://ndic.com'          # loads fine
 => #<Tempfile:/var/folders/hz/czmbmhds46s37t_pz8j198g40000gn/T/open-uri20141029-42188-12kbadl> 

В производственной среде:

Loading production environment (Rails 4.0.3)
2.0.0-p576 :001 > require 'uri'
 => false 
2.0.0-p576 :004 > open 'http://www.ruby-doc.org/' # loads fine
 => #<Tempfile:/tmp/open-uri20141029-11034-1sq9rtm> 
2.0.0-p576 :002 > open 'http://ndic.com'          # error!?
RuntimeError: redirection forbidden: http://ndic.com -> https://ndic.com/
  from /usr/local/rvm/rubies/ruby-2.0.0-p576/lib/ruby/2.0.0/open-uri.rb:223:in `open_loop'
  from /usr/local/rvm/rubies/ruby-2.0.0-p576/lib/ruby/2.0.0/open-uri.rb:149:in `open_uri'
  from /usr/local/rvm/rubies/ruby-2.0.0-p576/lib/ruby/2.0.0/open-uri.rb:689:in `open'
  from /usr/local/rvm/rubies/ruby-2.0.0-p576/lib/ruby/2.0.0/open-uri.rb:34:in `open'
  from (irb):2
  from /usr/local/rvm/gems/ruby-2.0.0-p576/gems/railties-4.0.3/lib/rails/commands/console.rb:90:in `start'
  from /usr/local/rvm/gems/ruby-2.0.0-p576/gems/railties-4.0.3/lib/rails/commands/console.rb:9:in `start'
  from /usr/local/rvm/gems/ruby-2.0.0-p576/gems/railties-4.0.3/lib/rails/commands.rb:62:in `<top (required)>'
  from bin/rails:4:in `require'
  from bin/rails:4:in `<main>'

РЕДАКТИРОВАТЬ:

Один комментатор спросил, может ли быть проблема в том, что во второй среде (последняя версия CentOS) отсутствуют пакеты для выполнения HTTPS-запросов. Я понимаю библиотеку OpenURI, что это не должно иметь значения; если запрос http:// будет перенаправлен на https://, начальный #open call должен просто вернуть объект, объясняющий перенаправление (аналог HTTP-ответа). Я пытался напрямую загрузить URL-адрес HTTPS, например https://ndic.com/, и в обоих случаях это не удается с OpenSSL::SSL::SSLError ошибка. Поэтому я все еще застрял в вопросе о том, почему запрос http:// (redirectable) получает ошибку только в одной среде.

0 ответов

Другие вопросы по тегам