2009-09-06 1 views
1

Эй, я пишу основное приложение Rails, которое использует digg API. Я пытаюсь проанализировать данные xml, которые api digg предоставляет с помощью hpricot, но при тестировании страницы браузер зависает, пока я в конечном итоге не поймаю исключение Timeout :: Error.Ошибка таймаута с помощью Hpricot в контроллере Rails

Вот код для контроллера:

require 'rubygems' 
require 'hpricot' 
require 'open-uri' 

appkey = 'http://mportiz08.homeip.net/twigg' 
query = CGI::escape(params[:id].gsub('_', ' ').gsub('#', '')) 

@request = 'http://services.digg.com/search/stories?query=' + query + '&appkey=' + appkey 
@response = Hpricot(open(@request)) 

А вот трассировки стека:

/usr/lib/ruby/1.8/timeout.rb:60:in `rbuf_fill' 
/usr/lib/ruby/1.8/net/protocol.rb:134:in `rbuf_fill' 
/usr/lib/ruby/1.8/net/protocol.rb:116:in `readuntil' 
/usr/lib/ruby/1.8/net/protocol.rb:126:in `readline' 
/usr/lib/ruby/1.8/net/http.rb:2020:in `read_status_line' 
/usr/lib/ruby/1.8/net/http.rb:2009:in `read_new' 
/usr/lib/ruby/1.8/net/http.rb:1050:in `request' 
/usr/lib/ruby/1.8/open-uri.rb:248:in `open_http' 
/usr/lib/ruby/1.8/net/http.rb:543:in `start' 
/usr/lib/ruby/1.8/open-uri.rb:242:in `open_http' 
/usr/lib/ruby/1.8/open-uri.rb:616:in `buffer_open' 
/usr/lib/ruby/1.8/open-uri.rb:164:in `open_loop' 
/usr/lib/ruby/1.8/open-uri.rb:162:in `catch' 
/usr/lib/ruby/1.8/open-uri.rb:162:in `open_loop' 
/usr/lib/ruby/1.8/open-uri.rb:132:in `open_uri' 
/usr/lib/ruby/1.8/open-uri.rb:518:in `open' 
/usr/lib/ruby/1.8/open-uri.rb:30:in `open' 
/home/marcus/dev/ruby/twigg/app/controllers/stories_controller.rb:15:in `view' 
/var/lib/gems/1.8/gems/actionpack-2.3.3/lib/action_controller/base.rb:1327:in `send' 
/var/lib/gems/1.8/gems/actionpack-2.3.3/lib/action_controller/base.rb:1327:in `perform_action_without_filters' 
/var/lib/gems/1.8/gems/actionpack-2.3.3/lib/action_controller/filters.rb:617:in `call_filters' 
/var/lib/gems/1.8/gems/actionpack-2.3.3/lib/action_controller/filters.rb:610:in `perform_action_without_benchmark' 
/var/lib/gems/1.8/gems/actionpack-2.3.3/lib/action_controller/benchmarking.rb:68:in `perform_action_without_rescue' 
/var/lib/gems/1.8/gems/actionpack-2.3.3/lib/action_controller/benchmarking.rb:68:in `perform_action_without_rescue' 
/var/lib/gems/1.8/gems/actionpack-2.3.3/lib/action_controller/rescue.rb:160:in `perform_action_without_flash' 
/var/lib/gems/1.8/gems/actionpack-2.3.3/lib/action_controller/flash.rb:146:in `perform_action' 
/var/lib/gems/1.8/gems/actionpack-2.3.3/lib/action_controller/base.rb:527:in `send' 
/var/lib/gems/1.8/gems/actionpack-2.3.3/lib/action_controller/base.rb:527:in `process_without_filters' 
/var/lib/gems/1.8/gems/actionpack-2.3.3/lib/action_controller/filters.rb:606:in `process' 
/var/lib/gems/1.8/gems/actionpack-2.3.3/lib/action_controller/base.rb:391:in `process' 
/var/lib/gems/1.8/gems/actionpack-2.3.3/lib/action_controller/base.rb:386:in `call' 
/var/lib/gems/1.8/gems/actionpack-2.3.3/lib/action_controller/routing/route_set.rb:434:in `call' 

Я только учусь Rails, и я не могу понять, что происходит. Любые идеи относительно того, почему это происходит?

Update

Я попытался точно такой же процесс с локально сохраненным файлом XML, и она работала отлично - проблема может иметь что-то делать с открытым Ури удаленным XML

ответ

1

Mayb diggs принимают только веб-браузер?

Я думаю, что HPricot отправляет другой пользовательский заголовок? Было бы хорошо узнать, какие заголовки отправляются из hpricot?

+0

Я не думал об этом. Возможно, вы правы - мне придется заглянуть в это и заглянуть назад – mportiz08

+0

Добро пожаловать =) – Lichtamberg

0

Lichtamberg - вы были правы. Проблема заключалась в том, что требуется Digg заголовок агента пользователя для отправки с просьбой: see here

Я просто изменил открытый вызов метода так:

@response = Hpricot(open(@request, 'User-Agent' => 'twigg')) 

 Смежные вопросы

  • Нет связанных вопросов^_^