Faraday: 能够忽略单个连接的 env 代理设置

创建于 2019-08-22  ·  3评论  ·  资料来源: lostisland/faraday

基础信息

  • 法拉第版本:0.15.4
  • 红宝石版本: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设置说“不使用代理”的另一种方式)将为我完全解决这个问题。

最有用的评论

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 对象。

所有3条评论

@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之类的东西)。 我认为这就是您在第一篇文章中提到的尝试的情况。

很高兴听到我的建议有效,您甚至有一个用于其他情况的自定义中间件。
我将关闭此问题,但如果您仍需要任何帮助,请联系😄

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

QuinnWilton picture QuinnWilton  ·  4评论

mokolabs picture mokolabs  ·  3评论

jedeleh picture jedeleh  ·  3评论

aleksb86 picture aleksb86  ·  3评论

mvastola picture mvastola  ·  4评论