Este programa simples trava porque, quando o logger é chamado, ainda não há cabeçalhos e corpo.
require 'faraday'
conn = Faraday.new(url: "http://google.com") {|config| config.response :logger}
conn.get "/"
/Users/synapse/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/faraday-0.8.8/lib/faraday/response/logger.rb:31:in `dump_headers': undefined method `map' for nil:NilClass (NoMethodError)
from /Users/synapse/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/faraday-0.8.8/lib/faraday/response/logger.rb:25:in `block in on_complete'
from /Users/synapse/.rbenv/versions/2.0.0-p247/lib/ruby/2.0.0/logger.rb:376:in `add'
from /Users/synapse/.rbenv/versions/2.0.0-p247/lib/ruby/2.0.0/logger.rb:404:in `debug'
from /Users/synapse/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/faraday-0.8.8/lib/faraday/response/logger.rb:25:in `on_complete'
from /Users/synapse/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/faraday-0.8.8/lib/faraday/response.rb:9:in `block in call'
from /Users/synapse/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/faraday-0.8.8/lib/faraday/response.rb:63:in `on_complete'
from /Users/synapse/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/faraday-0.8.8/lib/faraday/response.rb:8:in `call'
from /Users/synapse/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/faraday-0.8.8/lib/faraday/response/logger.rb:20:in `call'
from /Users/synapse/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/faraday-0.8.8/lib/faraday/connection.rb:253:in `run_request'
from /Users/synapse/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/faraday-0.8.8/lib/faraday/connection.rb:106:in `get'
from faraday_bug.rb:4:in `<main>'
Isso é esperado. Nenhum middleware pode funcionar sem que as solicitações HTTP sejam feitas, ou seja, sem um adaptador.
Faraday.new(url: "http://google.com") do |conn|
conn.response :logger
conn.adapter Faraday.default_adapter
end
@mislav embora este seja o comportamento esperado, a mensagem de erro resultante pode ser mais útil.
Concordo com @sethvargo , a mensagem poderia ser melhor.
No meu caso, passei de nenhum parâmetro para Faraday.new
e, em seguida, adicionei conn.response :logger
. Eu esperava que adapter
fosse default_adapter
por padrão, então fiquei razoavelmente confuso com o novo erro. Não ajudou em nada o fato de eu estar depurando outro erro, então pensei que isso pudesse ser outro sintoma do meu erro original.
Eu também tive esse problema. Eu diria que o comportamento esperado é que Faraday use o adaptador padrão se nenhum não for especificado.
Se você preferir não fazer isso, uma exceção 'adaptador não especificado' evitaria muitos problemas.
@mislav Eu ia dizer exatamente o que @bluefuton acabou de dizer. Quer dizer, é chamado de "default_adapter", o que sugere que é o padrão.
Oh, fui mordido pela mesma coisa. Mensagem de erro criptografada para o que provavelmente é um erro comum. (Eu removi a especificação do adaptador porque erroneamente assumi que não precisava ser explícita.)
@mislav Você aceitaria uma solicitação de pull para alterar o erro para algo como "Nenhum adaptador especificado"?
Ou (mas você parece não querer isso) assumir o "adaptador padrão" se nada for especificado explicitamente?
Oh, ei @pengwynn , percebi que você também faz parte desta organização. Já que Mislav não respondeu acima, alguma opinião sobre isso? Não pretendo pisar no pé de ninguém - se Mislav fizer essas ligações, não quero ignorá-lo :)
A mensagem deve ser melhor. Embora, como eu disse, nenhum middleware funcione realmente sem um adaptador. Portanto, melhorar a mensagem de erro especificamente para este middleware deixa outras falhas crípticas em outro middleware.
A solução adequada deve ser que Faraday aborta mais cedo quando um objeto Connection não inclui um adaptador na pilha. Assine um dos # 47, # 121, # 170
@mislav Aha, obrigado pelo esclarecimento!
Acho que tentarei fazer uma solicitação de pull apenas para melhorar a mensagem de erro do logger - parece que pode ser uma mudança bastante simples que melhoraria um problema comum. Espero que esteja tudo bem.
Posso procurar a solução adequada também, mas parece mais desafiador, então posso não ter tempo ou habilidade para fazer isso.
Comentários muito úteis
Isso é esperado. Nenhum middleware pode funcionar sem que as solicitações HTTP sejam feitas, ou seja, sem um adaptador.