Faraday: 法拉第和袜子代理与身份验证支持

创建于 2018-04-11  ·  9评论  ·  资料来源: lostisland/faraday

基础信息

  • Faraday 版本:0.14,适配器 Net::HTTP
  • 红宝石版本:2.3.1

    问题描述

使用带有身份验证的 socks 代理会导致 Faraday::ConnectionFailed: end of file

重现步骤

初始化法拉第

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

并提出任何要求

feature v1.0

最有用的评论

我使用宝石'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

所有9条评论

我可以通过猴子修补 Faraday::Adapter::NetHttp 来修复它,但我不确定这是最好的决定

@yarafan ,感谢您的报告。
我能问一下你是如何给Faraday::Adapter::NetHttp打猴子补丁的吗?

我使用宝石'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我明白了,所以基本上Net::HTTP不支持开箱即用的 socks 代理。
在这种情况下,我不会将其归类为错误,而是更多地作为支持 socks 代理的功能请求。
与任何其他功能请求一样,应该为当前 0.x 分支中的所有适配器解决此问题,但是对于 v1.0 分支,我们将所有适配器移出法拉第并仅保留 Net::HTTP 。
这将是介绍这个的好时机👍

我将更新标题并标记问题,如果有人在此之前需要使用 socks 代理,他们可以使用你的猴子补丁

向 Net::HTTP.SOCKSProxy 添加身份验证支持
https://github.com/astro/socksify-ruby/pull/24/files

我正在寻找这样做

干得好@yarafan

你好呀。 此功能的状态如何? 它还在开发中吗?
我很感兴趣不必使用猴子补丁来做到这一点

@gcolson是的@technoweenie已经完成了大部分工作🎉
然而不幸的是,我们目前正在等待合并依赖 PR,请参阅我的评论: https ://github.com/lostisland/faraday/pull/992#issuecomment -508437342

此页面是否有帮助?
0 / 5 - 0 等级