Faraday: Faraday y proxy de calcetines con soporte de autenticación

Creado en 11 abr. 2018  ·  9Comentarios  ·  Fuente: lostisland/faraday

Información básica

  • Faraday Versión: 0.14, adaptador Net::HTTP
  • Versión Rubí: 2.3.1

    Descripcion del problema

El uso de proxy de calcetines con autenticación conduce a Faraday::ConnectionFailed: se alcanzó el final del archivo

pasos para reproducir

Inicializar Faraday

    Faraday.new do |connection|
      connection.proxy = "socks://user:pass<strong i="14">@host</strong>:port"
      connection.adapter Faraday.default_adapter
    end

y hacer cualquier pedido

feature v1.0

Comentario más útil

yo uso la gema 'socksify'

require "socksify/http"

class Faraday::Adapter::NetHttp
  def net_http_connection(env)
    if (proxy = env[:request][:proxy])
      proxy_class(proxy)
    else
      Net::HTTP
    end.new(env[:url].hostname, env[:url].port || (env[:url].scheme == "https" ? 443 : 80))
  end

  def proxy_class(proxy)
    if proxy.uri.scheme == "socks"
      TCPSocket.socks_username = proxy[:user] if proxy[:user]
      TCPSocket.socks_password = proxy[:password] if proxy[:password]
      Net::HTTP::SOCKSProxy(proxy[:uri].host, proxy[:uri].port)
    else
      Net::HTTP::Proxy(proxy[:uri].host, proxy[:uri].port, proxy[:uri].user, proxy[:uri].password)
    end
  end
end

Todos 9 comentarios

Pude arreglarlo parcheando Faraday::Adapter::NetHttp, pero no estoy seguro de que haya sido la mejor decisión.

Hola @yarafan , gracias por informar.
¿Puedo preguntarte cómo reparaste Faraday::Adapter::NetHttp ?

yo uso la gema 'socksify'

require "socksify/http"

class Faraday::Adapter::NetHttp
  def net_http_connection(env)
    if (proxy = env[:request][:proxy])
      proxy_class(proxy)
    else
      Net::HTTP
    end.new(env[:url].hostname, env[:url].port || (env[:url].scheme == "https" ? 443 : 80))
  end

  def proxy_class(proxy)
    if proxy.uri.scheme == "socks"
      TCPSocket.socks_username = proxy[:user] if proxy[:user]
      TCPSocket.socks_password = proxy[:password] if proxy[:password]
      Net::HTTP::SOCKSProxy(proxy[:uri].host, proxy[:uri].port)
    else
      Net::HTTP::Proxy(proxy[:uri].host, proxy[:uri].port, proxy[:uri].user, proxy[:uri].password)
    end
  end
end

@yarafan Ya veo, así que básicamente Net::HTTP no es compatible con el proxy de calcetines listo para usar.
En este caso, no clasificaría esto como un error, sino más bien como una solicitud de función para admitir proxies de calcetines.
Como cualquier otra solicitud de función, esto debería resolverse para todos los adaptadores en la rama 0.x actual; sin embargo, para la rama v1.0 estamos sacando todos los adaptadores de faraday y manteniendo solo Net::HTTP.
Ese será un buen momento para presentar esto 👍

Actualizaré el título y etiquetaré el problema, si alguien necesita usar proxies de calcetines antes de eso, puede usar su parche de mono

Agregar soporte de autenticación a Net::HTTP.SOCKSProxy
https://github.com/astro/socksify-ruby/pull/24/files

Estoy buscando hacer exactamente esto

Buen trabajo @yarafan

Hola. ¿Cuál es el estado de esta función? ¿Todavía está en desarrollo?
Me interesaría mucho no tener que usar un parche de mono para hacer esto.

@gcolson@technoweenie ya hizo la mayor parte del trabajo 🎉
Desafortunadamente, sin embargo, actualmente estamos esperando que se fusione un PR dependiente, vea mi comentario: https://github.com/lostisland/faraday/pull/992#issuecomment -508437342

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

Temas relacionados

mokolabs picture mokolabs  ·  3Comentarios

jeffb-stell picture jeffb-stell  ·  5Comentarios

iMacTia picture iMacTia  ·  3Comentarios

mattmill30 picture mattmill30  ·  4Comentarios

jordansissel picture jordansissel  ·  5Comentarios