问题 有没有办法将Ruby Net :: HTTP请求附加到特定的IP地址/网络接口?


我正在寻找一种方法,使用标准Net :: HTTP库为每个GET请求使用不同的IP地址。服务器有5个IP地址,并假设某些API在达到每个IP的请求限制时阻止访问。所以,只有这样做 - 使用另一台服务器。我在ruby docs中找不到任何关于它的东西。

例如,curl允许您将其附加到特定的IP地址(在PHP中):

$req = curl_init($url)
curl_setopt($req, CURLOPT_INTERFACE, 'ip.address.goes.here';
$result = curl_exec($req);

有没有办法用Net :: HTTP库做到这一点?作为替代 - CURB(红宝石卷曲绑定)。但这将是我将尝试的最后一件事。

建议/想法?

附:使用CURB的解决方案(带有脏测试,ip被替换):

require 'rubygems'
require 'curb'

ip_addresses = [
  '1.1.1.1',
  '2.2.2.2',
  '3.3.3.3',
  '4.4.4.4',
  '5.5.5.5'
]

ip_addresses.each do |address|
  url = 'http://www.ip-adress.com/'
  c = Curl::Easy.new(url)
  c.interface = address
  c.perform
  ip = c.body_str.scan(/<h2>My IP address is: ([\d\.]{1,})<\/h2>/).first
  puts "for #{address} got response: #{ip}"
end

6145
2018-06-09 23:24


起源



答案:


看起来你不能用Net:HTTP做到这一点。这是来源

http://github.com/ruby/ruby/blob/trunk/lib/net/http.rb

第644行是连接打开的位置

  s = timeout(@open_timeout) { TCPSocket.open(conn_address(), conn_port()) }

TCPSocket.open的第三个和第四个参数是local_address和local_port,因为它们没有指定,所以不可能。看起来你必须要用路边石。


2
2018-06-09 23:46



是的,我也挖到http.rb文件找到有可能被覆盖的东西。好吧,这很糟糕,因为我必须重写我的核心请求库..无论如何,谢谢你的建议:) - Dan Sosedoff
有一个简单的路边解决方案。会发现表现是否仍然相同。 - Dan Sosedoff
对于现在遇到这个答案的人来说,仅供参考 - 这个问题已得到修复。未经测试但看起来你可以做到 x = Net::HTTP.new('google.com'); x.local_host = '10.0.0.1'。 - twooster


答案:


看起来你不能用Net:HTTP做到这一点。这是来源

http://github.com/ruby/ruby/blob/trunk/lib/net/http.rb

第644行是连接打开的位置

  s = timeout(@open_timeout) { TCPSocket.open(conn_address(), conn_port()) }

TCPSocket.open的第三个和第四个参数是local_address和local_port,因为它们没有指定,所以不可能。看起来你必须要用路边石。


2
2018-06-09 23:46



是的,我也挖到http.rb文件找到有可能被覆盖的东西。好吧,这很糟糕,因为我必须重写我的核心请求库..无论如何,谢谢你的建议:) - Dan Sosedoff
有一个简单的路边解决方案。会发现表现是否仍然相同。 - Dan Sosedoff
对于现在遇到这个答案的人来说,仅供参考 - 这个问题已得到修复。未经测试但看起来你可以做到 x = Net::HTTP.new('google.com'); x.local_host = '10.0.0.1'。 - twooster


我知道这是旧的,但希望其他人发现这很有用,因为我今天需要它。您可以执行以下操作:

http = Net::HTTP.new(uri.host, uri.port)
http.local_host = ip
response = http.request(request)

请注意,我不相信您可以使用Net :: HTTP.start,因为它不接受local_host作为选项。


6
2017-07-22 19:26





事实上有一种方法可以做到这一点,如果你猴子补丁TCPSocket:

https://gist.github.com/800214

遏制很棒,但不适用于Jruby,所以我一直在研究替代方案......


5
2018-01-28 16:31