Estamos executando um aplicativo bem grande com centenas de subcomponentes que usam Faraday até certo ponto. A maioria desses componentes espera configurar Faraday com as variáveis de ambiente http_proxy
e assim por diante; eles não passam uma configuração :proxy
explícita para os construtores de conexão.
Alguns componentes (2 ou 3 de cerca de 100) no entanto, devem usar uma conexão Faraday sem um proxy. Isso significa que não podemos usar Faraday.ignore_env_proxy = true
, caso contrário, os ~100 componentes restantes quebram.
O que eu gostaria de ter é uma forma para que esses poucos componentes possam criar um objeto de conexão Faraday que não use um proxy, nem do ambiente nem de outra forma.
Semelhante ao #752, isso gera um objeto faraday que usará as configurações de proxy do ambiente quando fizer conexões:
c = Faraday.new('https://www.google.com', proxy: nil)
Eu também tentei ser muito inteligente e passar um hash vazio como as opções de proxy, assim:
c = Faraday.new('https://www.google.com', proxy: {})
mas usando esses erros de conexão com:
NoMethodError: undefined method `hostname' for nil:NilClass
from vendor/bundle/ruby/2.4.0/gems/faraday-0.15.4/lib/faraday/adapter/net_http.rb:97:in `net_http_connection'
Acredito que ter isso (ou outra maneira de dizer "não use um proxy" por meio das configurações :proxy
) resolveria totalmente esse problema para mim.
@asf-stripe Eu nunca tentei fazer isso (geralmente é tudo ou nada), mas acho que você pode tentar definir o proxy para nil APÓS a inicialização da conexão com o setter (https://github.com/lostisland/faraday/blob /master/lib/faraday/connection.rb#L397)
c = Faraday.new('https://www.google.com')
c.proxy = nil
Isso deve definir o env @manual_proxy
true e forçar Faraday a ignorar o env para essa conexão específica.
Por favor, deixe-me saber se isso funciona 😄
OMG, isso é definitivamente uma solução alternativa. O que fizemos até agora foi um middleware como este (para nosso uso do Octokit):
# A Faraday middleware that throws out any configured proxy away
# from the request environment, to make connections to GHE work
# (those must not be proxied).
class ProxyDroppingMiddleware < Faraday::Middleware
def call(request_env)
request_env[:request][:proxy] = nil
@app.call(request_env)
end
end
E então, quando chegar a hora de inicializar o octokit:
stack = Faraday::RackBuilder.new do |builder|
builder.use ProxyDroppingMiddleware
# What follows is the default octokit middleware:
builder.use Faraday::Request::Retry, exceptions: [Octokit::ServerError]
builder.use Octokit::Middleware::FollowRedirects
builder.use Octokit::Response::RaiseError
builder.use Octokit::Response::FeedParser
builder.adapter Faraday.default_adapter
end
options[:middleware] = stack
Pelo que posso dizer, a solução de middleware funcionará melhor com o octokit, caso contrário, teríamos que fazer um wrapper do octokit para corrigir o objeto Faraday após a criação.
Ah sim, minha solução só funciona se você tiver acesso à conexão real (usando um wrapper ou coisas como instance_variable_get
). Eu assumi que era o caso olhando para as tentativas que você mencionou em seu primeiro post.
Fico feliz em saber que minha sugestão funciona e você ainda tem um middleware personalizado para outros casos.
Vou encerrar este problema, mas entre em contato se ainda precisar de ajuda 😄
Comentários muito úteis
OMG, isso é definitivamente uma solução alternativa. O que fizemos até agora foi um middleware como este (para nosso uso do Octokit):
E então, quando chegar a hora de inicializar o octokit:
Pelo que posso dizer, a solução de middleware funcionará melhor com o octokit, caso contrário, teríamos que fazer um wrapper do octokit para corrigir o objeto Faraday após a criação.