2009-09-06 5 views
1

Hey - J'écris une application Rails basique qui utilise l'API digg. J'essaie d'analyser les données XML que l'API de digg fournit avec hpricot, mais lors du test de la page, le navigateur se bloque jusqu'à ce que j'attrape l'exception Timeout :: Error.Erreur de temporisation avec le contrôleur Hpricot dans Rails

Voici le code pour le contrôleur:

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)) 

Et voici la trace de la pile:

/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' 

Je suis en train d'apprendre Rails, et je ne peux pas comprendre ce qui se passe. Des idées sur la raison pour laquelle cela se produit?

Mise à jour

J'ai essayé le même processus avec un fichier xml enregistré localement, et cela a fonctionné parfaitement - le problème pourrait avoir quelque chose à voir avec open-uri et xml à distance

Répondre

1

Mayb Diggs n'accepte que les webbrowser?

Je pense que HPricot envoie un autre en-tête utilisateur? Serait-il bon de savoir quels en-têtes sont envoyés par hpricot?

+0

Je ne l'avais pas pensé à cela. Vous pourriez avoir raison - je vais devoir vérifier cela et revenir en arrière – mportiz08

+0

Vous êtes les bienvenus =) – Lichtamberg

0

Lichtamberg - vous aviez raison. Le problème était que digg nécessaire un en-tête de l'agent utilisateur à envoyer à la demande: see here

Je viens de modifier l'appel de méthode ouverte comme ceci:

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