Мы запускаем довольно большое приложение с сотнями подкомпонентов, которые в той или иной степени используют Фарадея. Большинство этих компонентов предполагают настройку 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
) полностью решила бы эту проблему для меня.
@ 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
). Я предположил, что это так, глядя на попытки, которые вы упомянули в своем первом сообщении.
Рад слышать, что мое предложение работает, и у вас даже есть специальное промежуточное ПО для других случаев.
Я закрою эту тему, но, пожалуйста, обращайтесь, если вам все еще нужна помощь 😄
Самый полезный комментарий
OMG, это определенно обходной путь. То, что мы сделали до сих пор, было промежуточным программным обеспечением, подобным этому (для нашего использования Octokit):
И затем, когда приходит время инициализировать octokit:
Из того, что я могу сказать, обходной путь промежуточного программного обеспечения будет лучше работать с octokit, в противном случае нам пришлось бы делать обертку octokit для исправления объекта Фарадея после создания.