Faraday: 単一接続の環境プロキシ設定を無視する機能

作成日 2019年08月22日  ·  3コメント  ·  ソース: lostisland/faraday

基本情報

  • ファラデーバージョン:0.15.4
  • Rubyバージョン:2.4.3

問題の説明

ファラデーをある程度使用する何百ものサブコンポーネントを備えたかなり大きなアプリを実行しています。 これらのコンポーネントのほとんどは、環境変数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設定を介して「プロキシを使用しない」という別の言い方)がサポートされていれば、この問題は完全に解決されると思います。

info

最も参考になるコメント

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ラッパーを作成する必要があります。

全てのコメント3件

@ 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などを使用)。 あなたが最初の投稿で言及した試みを見て、それが事実だと思いました。

私の提案がうまくいくのを聞いてうれしいです、そしてあなたは他の場合のためのカスタムミドルウェアさえ持っています。
この問題を解決しますが、それでもサポートが必要な場合はご連絡ください😄

このページは役に立ちましたか?
0 / 5 - 0 評価