Estamos ejecutando una aplicación bastante grande con cientos de subcomponentes que usan Faraday hasta cierto punto. La mayoría de estos componentes esperan configurar Faraday con las variables de entorno http_proxy
y así sucesivamente; no pasan una configuración :proxy
explícita a los constructores de conexión.
Sin embargo, algunos componentes (2 o 3 de aproximadamente 100) deben usar una conexión Faraday sin un proxy. Eso significa que no podemos usar Faraday.ignore_env_proxy = true
, de lo contrario, los ~100 componentes restantes se romperán.
Lo que me gustaría tener es una forma para que esos pocos componentes puedan crear un objeto de conexión de Faraday que no use un proxy, ni del entorno ni de otro tipo.
Similar al #752, esto produce un objeto Faraday que utilizará la configuración de proxy del entorno cuando realice conexiones:
c = Faraday.new('https://www.google.com', proxy: nil)
También intenté ser muy inteligente y pasar un hash vacío como Opciones de proxy, así:
c = Faraday.new('https://www.google.com', proxy: {})
pero usando estos errores de conexión con:
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'
Creo que tener esto (u otra forma de decir "no use un proxy" a través de la configuración :proxy
) sería compatible para resolver este problema por completo.
@asf-stripe Nunca he intentado hacer esto (generalmente es todo o nada), pero creo que puede intentar configurar el proxy en cero DESPUÉS de la inicialización de la conexión con el setter (https://github.com/lostisland/faraday/blob /maestro/lib/faraday/conexión.rb#L397)
c = Faraday.new('https://www.google.com')
c.proxy = nil
Esto debería establecer el @manual_proxy
en verdadero y obligar a Faraday a ignorar el entorno para esa conexión en particular.
Por favor, hágamelo saber si eso funciona 😄
Dios mío, definitivamente es una solución. Lo que hicimos hasta ahora fue un middleware como este (para nuestro uso de 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
Y luego, cuando llegue el momento de inicializar 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
Por lo que puedo decir, la solución alternativa de middleware funcionará mejor con octokit, de lo contrario, tendríamos que hacer un envoltorio de octokit para parchear el objeto de Faraday después de la creación.
Ah, sí, mi solución solo funciona si tiene acceso a la conexión real (ya sea usando un contenedor o cosas como instance_variable_get
). Supuse que ese era el caso mirando los intentos que mencionaste en tu primera publicación.
Me alegra saber que mi sugerencia funciona e incluso tiene un middleware personalizado para otros casos.
Cerraré este problema, pero comuníquese si aún necesita ayuda 😄
Comentario más útil
Dios mío, definitivamente es una solución. Lo que hicimos hasta ahora fue un middleware como este (para nuestro uso de Octokit):
Y luego, cuando llegue el momento de inicializar octokit:
Por lo que puedo decir, la solución alternativa de middleware funcionará mejor con octokit, de lo contrario, tendríamos que hacer un envoltorio de octokit para parchear el objeto de Faraday después de la creación.