Faraday: Capacidad para ignorar la configuración del proxy env para una sola conexión

Creado en 22 ago. 2019  ·  3Comentarios  ·  Fuente: lostisland/faraday

Información básica

  • Versión de Faraday: 0.15.4
  • Versión Rubí: 2.4.3

Descripcion del problema

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.

pasos para reproducir

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.

info

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):

    # 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.

Todos 3 comentarios

@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 😄

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

JasonBarnabe picture JasonBarnabe  ·  4Comentarios

aleksb86 picture aleksb86  ·  3Comentarios

QuinnWilton picture QuinnWilton  ·  4Comentarios

luizkowalski picture luizkowalski  ·  3Comentarios

olleolleolle picture olleolleolle  ·  5Comentarios