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.
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.
@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 😄
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) :
Et puis, quand vient le temps d'initialiser octokit :
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.