Faraday: Возможность игнорировать настройки прокси-сервера env для одного соединения

Созданный на 22 авг. 2019  ·  3Комментарии  ·  Источник: lostisland/faraday

Основная информация

  • Версия Фарадея: 0.15.4
  • Рубиновая версия: 2.4.3

Описание проблемы

Мы запускаем довольно большое приложение с сотнями подкомпонентов, которые в той или иной степени используют Фарадея. Большинство этих компонентов предполагают настройку Faraday с переменными окружения http_proxy и т. д.; они не передают явную настройку :proxy в конструкторы соединения.

Однако некоторые компоненты (2 или 3 из примерно 100) должны использовать соединение Фарадея без прокси. Это означает, что мы не можем использовать 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 для исправления объекта Фарадея после создания.

Все 3 Комментарий

@ asf-stripe Я никогда не пробовал это делать (обычно все или ничего), но я думаю, вы можете попробовать установить для прокси значение nil ПОСЛЕ инициализации соединения с помощью установщика (https://github.com/lostisland/faraday/blob /master/lib/faraday/connection.rb#L397)

c = Faraday.new('https://www.google.com')
c.proxy = nil

Это должно установить env @manual_proxy в 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, в противном случае нам пришлось бы делать обертку octokit для исправления объекта Фарадея после создания.

Ах да, мое решение работает только в том случае, если у вас есть доступ к фактическому соединению (либо с помощью оболочки, либо с помощью таких вещей, как instance_variable_get ). Я предположил, что это так, глядя на попытки, которые вы упомянули в своем первом сообщении.

Рад слышать, что мое предложение работает, и у вас даже есть специальное промежуточное ПО для других случаев.
Я закрою эту тему, но, пожалуйста, обращайтесь, если вам все еще нужна помощь 😄

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

QuinnWilton picture QuinnWilton  ·  4Комментарии

subvertallchris picture subvertallchris  ·  5Комментарии

aleksb86 picture aleksb86  ·  3Комментарии

Lewiscowles1986 picture Lewiscowles1986  ·  4Комментарии

JasonBarnabe picture JasonBarnabe  ·  4Комментарии