Faraday: Faraday e proxy de meias com suporte de autenticação

Criado em 11 abr. 2018  ·  9Comentários  ·  Fonte: lostisland/faraday

Informação básica

  • Versão Faraday: 0.14, adaptador Net::HTTP
  • Versão do Ruby: 2.3.1

    Descrição do problema

Usar o proxy socks com autenticação leva a Faraday::ConnectionFailed: fim do arquivo atingido

Passos para reproduzir

Inicializar Faraday

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

e faça qualquer pedido

feature v1.0

Comentários muito úteis

eu uso gem '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 comentários

Consegui consertá-lo fazendo um patch de macaco Faraday::Adapter::NetHttp, mas não tenho certeza de que foi a melhor decisão

Oi @yarafan , obrigado por relatar.
Posso te perguntar como você remendou Faraday::Adapter::NetHttp ?

eu uso gem '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 Entendo, então basicamente Net::HTTP não suporta o proxy de meias pronto para uso.
Nesse caso, eu não classificaria isso como um bug, mas mais como uma solicitação de recurso para suportar proxies de meias.
Como qualquer outra solicitação de recurso, isso deve ser resolvido para todos os adaptadores na ramificação 0.x atual, no entanto, para a ramificação v1.0, estamos removendo todos os adaptadores de faraday e mantendo apenas Net::HTTP.
Essa será uma boa hora para apresentar isso 👍

Vou atualizar o título e rotular o problema, se alguém precisar usar proxies de meias antes disso, pode usar seu remendo de macaco

Adicionar suporte de autenticação a Net::HTTP.SOCKSProxy
https://github.com/astro/socksify-ruby/pull/24/files

procuro fazer exatamente isso

Bom trabalho @yarafan

Olá. Qual é o status sobre esse recurso? Ainda está em desenvolvimento?
Eu estaria muito interessado em não ter que usar um patch de macaco para fazer isso

@gcolson sim @technoweenie já fez a maior parte do trabalho 🎉
Infelizmente, no entanto, estamos aguardando a fusão de um PR dependente, veja meu comentário: https://github.com/lostisland/faraday/pull/992#issuecomment -508437342

Esta página foi útil?
0 / 5 - 0 avaliações