我们正在运行一个相当大的应用程序,其中包含数百个在某种程度上使用法拉第的子组件。 这些组件中的大多数都希望使用环境变量http_proxy
等来配置 Faraday; 他们没有将明确的:proxy
设置传递给连接构造函数。
但是,某些组件(大约 100 个中的 2 个或 3 个)必须使用没有代理的法拉第连接。 这意味着我们不能使用Faraday.ignore_env_proxy = true
,否则剩余的约 100 个组件会损坏。
我想要的是一种方法,让这几个组件能够创建一个不使用代理的法拉第连接对象,无论是来自环境还是其他方式。
与 #752 类似,这会产生一个法拉第对象,该对象在建立连接时将使用环境中的代理设置:
c = Faraday.new('https://www.google.com', proxy: nil)
我还尝试变得非常聪明,并将空哈希作为代理选项传递,如下所示:
c = Faraday.new('https://www.google.com', proxy: {})
但使用此连接错误:
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'
我相信支持这个(或通过:proxy
设置说“不使用代理”的另一种方式)将为我完全解决这个问题。
@asf-stripe 我从未尝试过这样做(通常是全部或全部),但我认为您可以尝试在使用 setter 初始化连接后将代理设置为 nil(https://github.com/lostisland/faraday/blob /master/lib/faraday/connection.rb#L397)
c = Faraday.new('https://www.google.com')
c.proxy = nil
这应该将@manual_proxy
环境设置为 true 并强制法拉第忽略该特定连接的环境。
请让我知道这是否有效😄
OMG,这绝对是一种解决方法。 到目前为止,我们所做的是这样的中间件(用于 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
然后,当需要初始化 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
据我所知,中间件变通方案将与 octokit 一起更好地工作,否则我们必须制作一个 octokit 包装器来在创建后修补 Faraday 对象。
啊,是的,我的解决方案只有在您可以访问实际连接时才有效(使用包装器或instance_variable_get
之类的东西)。 我认为这就是您在第一篇文章中提到的尝试的情况。
很高兴听到我的建议有效,您甚至有一个用于其他情况的自定义中间件。
我将关闭此问题,但如果您仍需要任何帮助,请联系😄
最有用的评论
OMG,这绝对是一种解决方法。 到目前为止,我们所做的是这样的中间件(用于 Octokit):
然后,当需要初始化 octokit 时:
据我所知,中间件变通方案将与 octokit 一起更好地工作,否则我们必须制作一个 octokit 包装器来在创建后修补 Faraday 对象。