ファラデーをある程度使用する何百ものサブコンポーネントを備えたかなり大きなアプリを実行しています。 これらのコンポーネントのほとんどは、環境変数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私はこれを試したことがありません(通常はすべてまたはまったくありません)が、セッター(https://github.com/lostisland/faraday/blob)との接続の初期化後にプロキシをnilに設定してみることができると思います/master/lib/faraday/connection.rb#L397)
c = Faraday.new('https://www.google.com')
c.proxy = nil
これにより、 @manual_proxy
envがtrueに設定され、Faradayがその特定の接続のenvを無視するように強制されます。
それがうまくいくかどうか教えてください😄
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でより適切に機能します。そうでない場合は、作成後にFaradayオブジェクトにパッチを適用するためにoctokitラッパーを作成する必要があります。
はい、私のソリューションは、実際の接続にアクセスできる場合にのみ機能します(ラッパーまたはinstance_variable_get
などを使用)。 あなたが最初の投稿で言及した試みを見て、それが事実だと思いました。
私の提案がうまくいくのを聞いてうれしいです、そしてあなたは他の場合のためのカスタムミドルウェアさえ持っています。
この問題を解決しますが、それでもサポートが必要な場合はご連絡ください😄
最も参考になるコメント
OMG、それは間違いなく回避策です。 これまでに行ったことは、次のようなミドルウェアでした(Octokitを使用するため)。
そして、octokitを初期化するときが来たら:
私の知る限り、ミドルウェアの回避策はoctokitでより適切に機能します。そうでない場合は、作成後にFaradayオブジェクトにパッチを適用するためにoctokitラッパーを作成する必要があります。