Faraday: Capacidade de ignorar as configurações de proxy de ambiente para uma única conexão

Criado em 22 ago. 2019  ·  3Comentários  ·  Fonte: lostisland/faraday

Informação básica

  • Versão Faraday: 0.15.4
  • Versão do Ruby: 2.4.3

Descrição do problema

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.

Passos para reproduzir

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.

info

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

    # 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.

Todos 3 comentários

@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 😄

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

QuinnWilton picture QuinnWilton  ·  4Comentários

mattmill30 picture mattmill30  ·  4Comentários

iMacTia picture iMacTia  ·  3Comentários

yusefu picture yusefu  ·  3Comentários

t3hk0d3 picture t3hk0d3  ·  3Comentários