Faraday: Possibilité d'ignorer les paramètres de proxy env pour une seule connexion

Créé le 22 août 2019  ·  3Commentaires  ·  Source: lostisland/faraday

Informations de base

  • Version de Faraday : 0.15.4
  • Version rubis : 2.4.3

Description du problème

Nous exécutons une application assez volumineuse avec des centaines de sous-composants qui utilisent Faraday dans une certaine mesure. La plupart de ces composants s'attendent à configurer Faraday avec les variables d'environnement http_proxy et ainsi de suite ; ils ne transmettent pas de paramètre :proxy explicite aux constructeurs de connexion.

Certains composants (2 ou 3 sur environ 100) doivent cependant utiliser une connexion Faraday sans proxy. Cela signifie que nous ne pouvons pas utiliser Faraday.ignore_env_proxy = true , sinon les ~100 composants restants cassent.

Ce que j'aimerais avoir, c'est un moyen pour ces quelques composants de pouvoir créer un objet de connexion Faraday qui n'utilise pas de proxy, ni de l'environnement ni autrement.

Étapes à reproduire

Semblable à # 752, cela donne un objet faraday qui utilisera les paramètres de proxy de l'environnement lorsqu'il établira des connexions :

c = Faraday.new('https://www.google.com', proxy: nil)

J'ai aussi essayé d'être très intelligent et de passer un hachage vide comme options de proxy à la place, comme ceci :

c = Faraday.new('https://www.google.com', proxy: {})

mais en utilisant cette connexion erreurs avec:

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'

Je pense que cela (ou une autre façon de dire "n'utilisez pas de proxy" via les paramètres :proxy ) serait pris en charge résoudrait complètement ce problème pour moi.

info

Commentaire le plus utile

OMG, c'est définitivement une solution de contournement. Ce que nous avons fait jusqu'à présent était un middleware comme celui-ci (pour notre utilisation d'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

Et puis, quand vient le temps d'initialiser 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

D'après ce que je peux dire, la solution de contournement du middleware fonctionnera mieux avec octokit, sinon nous devrons créer un wrapper octokit pour corriger l'objet Faraday après sa création.

Tous les 3 commentaires

@asf-stripe Je n'ai jamais essayé de faire cela (c'est généralement tout ou rien), mais je pense que vous pouvez essayer de définir le proxy sur nil APRÈS l'initialisation de la connexion avec le setter (https://github.com/lostisland/faraday/blob /master/lib/faraday/connection.rb#L397)

c = Faraday.new('https://www.google.com')
c.proxy = nil

Cela devrait définir l'env @manual_proxy sur true et forcer Faraday à ignorer l'env pour cette connexion particulière.
Merci de me dire si cela fonctionne 😄

OMG, c'est définitivement une solution de contournement. Ce que nous avons fait jusqu'à présent était un middleware comme celui-ci (pour notre utilisation d'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

Et puis, quand vient le temps d'initialiser 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

D'après ce que je peux dire, la solution de contournement du middleware fonctionnera mieux avec octokit, sinon nous devrons créer un wrapper octokit pour corriger l'objet Faraday après sa création.

Ah oui, ma solution ne fonctionne que si vous avez accès à la connexion réelle (soit en utilisant un wrapper ou des choses comme instance_variable_get ). J'ai supposé que c'était le cas en regardant les tentatives que vous avez mentionnées dans votre premier message.

Heureux d'entendre ma suggestion fonctionner et vous avez même un middleware personnalisé pour d'autres cas.
Je vais fermer ce problème mais n'hésitez pas à me contacter si vous avez encore besoin d'aide 😄

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

JohnBat26 picture JohnBat26  ·  11Commentaires

jasnow picture jasnow  ·  9Commentaires

gjtorikian picture gjtorikian  ·  18Commentaires

PavelPenkov picture PavelPenkov  ·  9Commentaires

minad picture minad  ·  17Commentaires