2017-09-19 3 views
0

Je travaille sur une application rails qui utilise Koala gem (v2.2) et Faraday (0.9.2). Il semble que beaucoup de demandes de Facebook sont en erreur avec l'exécution requise et je ne sais pas pourquoi. Voici une trace de pile. Je vous serais reconnaissant de l'aide sur la façon de résoudre ce problème,Rails - Exécution des gemmes Koala/Faraday Erreur expirée

Voici l'extrait de code, soit il échoue sur oauth.get_app_access_token ou app_graph.debug_token

oauth = Koala::Facebook::OAuth.new(Rails.application.config.facebook_app_id, 
            Rails.application.config.facebook_app_secret, 
            nil) 

app_access_token = oauth.get_app_access_token # fails here 
app_graph = Koala::Facebook::API.new(app_access_token) 
token_info = app_graph.debug_token(atoken) # or fails here 

Voici l'erreur:

ERROR: execution expired 
/usr/lib/ruby/1.9.2/net/http.rb:644:in `initialize' 
/usr/lib/ruby/1.9.2/net/http.rb:644:in `open' 
/usr/lib/ruby/1.9.2/net/http.rb:644:in `block in connect' 
/usr/lib/ruby/1.9.2/net/http.rb:644:in `connect' 
/usr/lib/ruby/1.9.2/net/http.rb:637:in `do_start' 
/usr/lib/ruby/1.9.2/net/http.rb:626:in `start' 
/usr/lib/ruby/1.9.2/net/http.rb:1168:in `request' 
/usr/lib/ruby/gems/1.9.2/gems/faraday-0.9.2/lib/faraday/adapter/net_http.rb:82:in `perform_request' 
/usr/lib/ruby/gems/1.9.2/gems/faraday-0.9.2/lib/faraday/adapter/net_http.rb:40:in `block in call' 
/usr/lib/ruby/gems/1.9.2/gems/faraday-0.9.2/lib/faraday/adapter/net_http.rb:87:in `with_net_http_connection' 
/usr/lib/ruby/gems/1.9.2/gems/faraday-0.9.2/lib/faraday/adapter/net_http.rb:32:in `call' 
/usr/lib/ruby/gems/1.9.2/gems/faraday-0.9.2/lib/faraday/request/url_encoded.rb:15:in `call' 
/usr/lib/ruby/gems/1.9.2/gems/faraday-0.9.2/lib/faraday/request/multipart.rb:14:in `call' 
/usr/lib/ruby/gems/1.9.2/gems/faraday-0.9.2/lib/faraday/rack_builder.rb:139:in `build_response' 
/usr/lib/ruby/gems/1.9.2/gems/faraday-0.9.2/lib/faraday/connection.rb:377:in `run_request' 
/usr/lib/ruby/gems/1.9.2/gems/faraday-0.9.2/lib/faraday/connection.rb:177:in `post' 
/usr/lib/ruby/gems/1.9.2/gems/koala-2.2.0/lib/koala/http_service.rb:113:in `make_request' 
/usr/lib/ruby/gems/1.9.2/gems/koala-2.2.0/lib/koala.rb:64:in `make_request' 
/usr/lib/ruby/gems/1.9.2/gems/koala-2.2.0/lib/koala/oauth.rb:306:in `fetch_token_string' 
/usr/lib/ruby/gems/1.9.2/gems/koala-2.2.0/lib/koala/oauth.rb:258:in `get_token_from_server' 
/usr/lib/ruby/gems/1.9.2/gems/koala-2.2.0/lib/koala/oauth.rb:189:in `get_app_access_token_info' 
/usr/lib/ruby/gems/1.9.2/gems/koala-2.2.0/lib/koala/oauth.rb:199:in `get_app_access_token' 
+0

Votre appel http net expire ... le site auquel vous accédez prend plus de 5 secondes pour répondre. Qu'est-ce que vous essayez de http? – SteveTurczyn

+0

J'essaie d'obtenir un jeton d'accès de facebook avec oauth: oauth = Koala :: Facebook :: OAuth.new (Rails.application.config.facebook_app_id, Rails.application.config.facebook_app_secret, nul) – Heisenberg

+0

J'ai édité le code pour inclure l'extrait de code, timeout est soit obtenir jeton d'accès ou un jeton de débogage, semble avoir commencé 16h PDT le 13 septembre, également enregistré problème avec facebook mais se demande s'il y a aussi problème avec les gemmes – Heisenberg

Répondre

1

C'est /lib/faraday/adapter/net_http.rb:82:in 'perform_request' method où l'exécution est expiré

def perform_request(http, env) 
    if :get == env[:method] and !env[:body] 
     # prefer `get` to `request` because the former handles gzip (ruby 1.9) 
     http.get env[:url].request_uri, env[:request_headers] 
    else 
     # In your case you execture http.request 
     http.request create_request(env) 
    end 
    end 

Ceci est la documentation Ruby méthode Net::HTTP.request, je souligne

Returns an HTTPResponse object.

qui est le res dans la méthode et sera basée sur le Net::HTTPResponse ruby class

Aussi je me concentrerais sur la façon dont l'request est fait, parce que je crois certains paramètres sont mal transmis et c'est la raison pour laquelle la réponse prend tant de temps. Nous devrions donc nous concentrer sur le corps de la requête, l'en-tête et toutes les autres informations.

# File net/http.rb, line 1421 
def request(req, body = nil, &block) # :yield: +response+ 
    unless started? 
    start { 
     req['connection'] ||= 'close' 
     return request(req, body, &block) 
    } 
    end 
    if proxy_user() 
    req.proxy_basic_auth proxy_user(), proxy_pass() unless use_ssl? 
    end 
    req.set_body_internal body 
    res = transport_request(req, &block) 
    if sspi_auth?(res) 
    sspi_auth(req) 
    res = transport_request(req, &block) 
    end 
    res 
end 

Alors, que sur l'impression des informations du journal supplémentaire dans votre journal du serveur de production, vous pouvez ouvrir ces fichiers /usr/lib/ruby/1.9.2/net/http.rb:1168:in 'request' et /usr/lib/ruby/gems/1.9.2/gems/faraday-0.9.2/lib/faraday/adapter/net_http.rb:82:in 'perform_request', d'écrire quelques puts déclarations sur une variable qui doit générer dans votre journal de production.

Vous devez également vous assurer que le journal des applications du rail est configuré pour les imprimer.