2010-06-09 37 views
10

我正在寻找一种方式来为每个GET请求使用不同的IP地址与标准的Net :: HTTP库。服务器有5个IP地址,并假设某些API在达到每个IP的请求限制时阻止访问。所以,只有这样做 - 使用另一台服务器。我无法在ruby文档中找到任何有关它的信息。有没有办法将Ruby Net :: HTTP请求附加到特定的IP地址/网络接口?

例如,卷曲允许您将它连接到指定的IP地址(PHP):

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

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

建议/想法?

P.S.与遏制溶液(用肮脏的测试,ip`s被取代):

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 

回答

2

看起来不像你可以用网做到这一点: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,由于没有指定他们,这是不可能。看起来你必须走路边走。

+0

是的,我也挖到http.rb文件找到有什么可能被重写。 好吧,这很糟糕,因为我不得不重写我的核心请求库。 无论如何感谢您的意见:) – 2010-06-09 23:49:18

+0

得到了一个简单的路边解决方案。会发现性能是否仍然相同。 – 2010-06-10 00:46:13

+4

仅供参考,现在有人遇到这个问题 - 这个问题已经解决。未经测试,但它看起来像你可以做'x = Net :: HTTP.new('google.com'); x.local_host = '10 .0.0.1''。 – twooster 2014-03-18 21:57:57

5

其实也有一个方式,如果做到这一点,你猴子补丁的TCPSocket:

https://gist.github.com/800214

路沿石是真棒,但不会使用JRuby工作,所以我一直在寻找到替代品......

+0

很久以前我已经解决了这个问题:http://blog.sosedoff.com/2010/06/13/handy-http-requests-with-curb-and-ruby/ – 2011-01-28 19:52:47

6

我知道这是旧的,但希望别人认为这有用,因为我今天需要这个。你可以做到以下几点:

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

需要注意的是你,我不相信你可以使用Net :: HTTP.start,因为它不接受local_host作为一个选项。

相关问题