Есть ли способ подключить Ruby Net:: HTTP-запрос к определенному IP-адресу/сетевому интерфейсу?

Im ищет способ использовать разные IP-адреса для каждого запроса GET со стандартной библиотекой Net:: HTTP. Сервер имеет 5 IP-адресов и предполагает, что некоторые API-интерфейсы блокируют доступ, когда достигается ограничение на доступ к IP-адресу. Таким образом, единственный способ сделать это - использовать другой сервер. Я не могу найти что-нибудь об этом в рубиновых документах.

Например, curl позволяет присоединить его к определенному IP-адресу (в PHP):

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

Есть ли способ сделать это с помощью библиотеки Net:: HTTP? В качестве альтернативы - CURB (связывание рубинового рулона). Но это будет последнее, что я попробую.

Предложения/идеи?

P.S. Решение с 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

Ответ 1

Не похоже, что вы можете сделать это с помощью 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

Я знаю, что это старо, но, надеюсь, кто-то еще считает это полезным, поскольку мне это нужно сегодня. Вы можете сделать следующее:

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

Обратите внимание, что вы не считаете, что можете использовать Net:: HTTP.start, так как он не принимает local_host как вариант.

Ответ 3

На самом деле есть способ сделать это, если вы установили патч обезьяны TCPSocket:

https://gist.github.com/800214

Curb - это потрясающе, но не будет работать с Jruby, поэтому я искал альтернативы...