Проблема с сетью Ruby в Windows

#ruby

Вопрос:

Я использую Windows XP с ruby 1.8.6 патч-уровнем 111. Я использую HTTP для подключения к удаленному серверу, и он работает нормально. Внезапно он начал проходить через исключение, указанное ниже (я не менял код с момента последнего успешного запуска). Кто-нибудь знает, что происходит?

c:/ruby/lib/ruby/1.8/timeout.rb:54:in `rbuf_fill': срок выполнения истек (Время ожидания::E
rror) 
 от c:/ruby/lib/ruby/1.8/timeout.rb:56:in `тайм-аут "
от c:/ruby/lib/ruby/1.8/timeout.rb:76:in `тайм-аут "
от c:/ruby/lib/ruby/1.8/net/protocol.rb:132:in `rbuf_fill'
из c:/ruby/lib/ruby/1.8/net/protocol.rb:116:in `readuntil"
из c:/ruby/lib/ruby/1.8/net/protocol.rb:126:in `
прочитанная строка "из c:/ruby/lib/ruby/1.8/net/http.rb:2029:in `read_status_line"
из c:/ruby/lib/ruby/1.8/net/http.rb:2018:in `читать заново" 
 от c:/ruby/lib/ruby/1.8/net/http.rb:1059:in `просьба" 
 ... 19 уровней... 
 от c:/ruby/lib/ruby/1.8/test/unit/autorunner.rb:216:in `убежать"
от c:/ruby/lib/ruby/1.8/test/unit/autorunner.rb:12:in `убежать"
от c:/ruby/lib/ruby/1.8/test/unit.rb:278
от c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader
.rb:5
рейк прерван! 
Команда не выполнена со статусом (3): [c:/ruby/bin/ruby -Ilib;тест "c:/ruby/lib/r...]

Ответ №1:

Может быть, удаленный хост не работает? Или между вашей машиной и удаленным хостом был установлен новый брандмауэр?

«Тайм-аут::Ошибка» обычно указывает в этом направлении.

Комментарии:

1. 1. Эта ошибка возникает только тогда, когда сеть отключена или засорена, и получение ответа занимает слишком много времени. Я считаю, что тайм-аут по умолчанию составляет 5 секунд, что немного мало

Ответ №2:

помимо очевидного (брандмауэр, вы попали в черный список за плохой пользовательский агент или игнорирование robots.txt), вы можете попробовать завить

http://curl.haxx.se/libcurl/ruby/

ИЛИ увеличьте тайм-аут сети/http, скажем, на 30 секунд

http://groups.google.com/group/rubyonrails-talk/msg/cc89e8ae6703d6fb

Ответ №3:

Это может быть связано с этой известной ошибкой Ruby, когда Timeout::Error не является исключением подкласса. (исправлено в 1.9.2, я полагаю)

http://lindsaar.net/2007/12/9/rbuf_filltimeout-error

Это можно исправить, спасая от тайм-аута::Ошибка, например rescue Timeout::Error => e