特定のIPアドレス/ネットワークインターフェイスにRubyのネット:: HTTPリクエストを添付する方法はありますか?
-
26-09-2019 - |
質問
イム標準ネット:: HTTPライブラリと各GETリクエストに対して異なるIPアドレスを使用する方法を探しています。サーバーは5つのIPアドレスとIPあたりの要求の上限に達したときに、いくつかのAPI`sがアクセスをブロックしていると仮定しています。だから、それを行うための唯一の方法 - 別のサーバを使用しています。私はルビーのドキュメントでそれについて何かを見つける傾けます。
たとえば、カールは、あなたが(PHPで)特定のIPアドレスに添付することができます:
$req = curl_init($url)
curl_setopt($req, CURLOPT_INTERFACE, 'ip.address.goes.here';
$result = curl_exec($req);
ネット:: HTTPライブラリでそれを行う方法はありますか?別の方法として - CURB(ルビーカール結合します)。しかし、それは最後のことはしようとi`llになります。
提案/アイデア?
P.S。 CURB有する溶液(汚れた試験とは、置換され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
解決
は見えません。ここでは、ソースの
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であり、それらが指定されていないことから、それは不可能です。あなたのように見えるが縁石に行く必要があります。
他のヒント
私は、これは古いですけど、今日はこれを必要に応じて、うまくいけば他の誰かが、これは重宝します。あなたは、次の操作を行うことができます:
をhttp = Net::HTTP.new(uri.host, uri.port)
http.local_host = ip
response = http.request(request)
あなたは私はあなたがネットを使うことができると信じていないこと:: HTTP.start、それはオプションとして0.0この例でlocal_host受け付けないようです。 注意
は、実際にこれを行う方法があればお猿のパッチTCPSocketます:
https://gist.github.com/800214 の
縁石は素晴らしいですが、JRubyの持つだろうではない仕事、私は選択肢に探していたので...
することができます。私は以下のように行った:
# remote_host can be IP or hostname
uri = URI.parse( "http://" + remote_host )
http = Net::HTTP.new( uri.host, uri.port )
request = Net::HTTP::Get.new(uri.request_uri)
request.initialize_http_header( { "Host" => domain })
response = http.request( request )