Faraday: Proxy Faraday et chaussettes avec prise en charge de l'authentification

Créé le 11 avr. 2018  ·  9Commentaires  ·  Source: lostisland/faraday

Informations de base

  • Version Faraday : 0.14, adaptateur Net :: HTTP
  • Version rubis : 2.3.1

    Description du problème

L'utilisation du proxy socks avec auth conduit à Faraday :: ConnectionFailed : fin de fichier atteinte

Étapes à reproduire

Initialiser Faraday

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

et faire toute demande

feature v1.0

Commentaire le plus utile

j'utilise la gemme '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

Tous les 9 commentaires

J'ai pu le réparer en corrigeant Faraday::Adapter::NetHttp, mais je ne suis pas sûr que ce soit la meilleure décision

Salut @yarafan , merci pour le signalement.
Puis-je vous demander comment vous avez patché Faraday::Adapter::NetHttp ?

j'utilise la gemme '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 Je vois, donc fondamentalement Net::HTTP ne prend pas en charge le proxy chaussettes prêt à l'emploi .
Dans ce cas, je ne classerais pas cela comme un bogue, mais plutôt comme une demande de fonctionnalité pour prendre en charge les proxies chaussettes.
Comme toute autre demande de fonctionnalité, cela devrait être résolu pour tous les adaptateurs de la branche 0.x actuelle, mais pour la branche v1.0, nous déplaçons tous les adaptateurs de faraday et ne conservons que Net :: HTTP.
Ce sera le bon moment pour le présenter 👍

Je vais mettre à jour le titre et étiqueter le problème, si quelqu'un a besoin d'utiliser des proxies de chaussettes avant cela, il peut utiliser votre patch de singe

Ajouter la prise en charge de l'authentification à Net :: HTTP.SOCKSProxy
https://github.com/astro/socksify-ruby/pull/24/files

Je cherche à faire exactement ça

Bon travail @yarafan

Salut. Où en est cette fonctionnalité ? Est-il encore en développement ?
Je serais très intéressé de ne pas avoir à utiliser un patch de singe pour le faire

@gcolson oui @technoweenie a déjà fait la plupart du travail 🎉
Malheureusement, cependant, nous attendons actuellement la fusion d'un PR dépendant, voir mon commentaire : https://github.com/lostisland/faraday/pull/992#issuecomment -508437342

Cette page vous a été utile?
0 / 5 - 0 notes