2010-06-09 2 views
10

Je cherche un moyen d'utiliser différentes adresses IP pour chaque requête GET avec la bibliothèque Net :: HTTP standard. Le serveur a 5 adresses IP et suppose que certaines API bloquent l'accès lorsque la limite de demande par IP est atteinte. Donc, seul moyen de le faire - utilisez un autre serveur. Je ne peux rien trouver à ce sujet dans docs ruby.Existe-t-il un moyen de joindre la requête Ruby Net :: HTTP à une adresse IP/une interface réseau spécifique?

Par exemple, curl vous permet de l'attacher à l'adresse IP spécifique (en PHP):

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

Est-il possible de le faire avec la bibliothèque Net :: HTTP? Comme alternative - CURB (liaison de rubis curl). Mais ce sera la dernière chose que j'essaierai.

Suggestions/Idées?

P.S. La solution avec TROTTOIR (avec des tests sales, ip`s remplacé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 

Répondre

2

ne ressemble pas, vous pouvez le faire avec Net: HTTP. Voici la source

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

ligne 644 est l'endroit où la connexion est ouverte

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

Les troisième et quatrième à TCPSocket.open sont local_address et local_port, et comme ils ne sont pas précisés, il est pas possible. On dirait que tu devras aller avec le trottoir.

+0

ouais, j'ai aussi creusé dans le fichier http.rb pour trouver quelque chose qui pourrait être remplacé. bien, ça craint parce que je dois réécrire ma bibliothèque de demande de base .. de toute façon merci pour un conseil :) –

+0

obtenu une solution de trottoir simple. va savoir si la performance est toujours la même. –

+4

FYI pour quiconque rencontre cette réponse maintenant - cela a été corrigé. Non testé mais il semble que vous pouvez faire 'x = Net :: HTTP.new ('google.com'); x.local_host = '10 .0.0.1''. – twooster

5

Il est en fait une façon de le faire si vous patch singe TCPSocket:

https://gist.github.com/800214

Curb est génial, mais ne fonctionnera pas avec JRuby je l'ai donc cherché des alternatives ...

+0

J'ai résolu cela il y a longtemps: http://blog.sosedoff.com/2010/06/13/handy-http-requests-with-curb-and-ruby/ –

6

Je sais que c'est vieux, mais j'espère que quelqu'un d'autre trouve cela utile, car j'en avais besoin aujourd'hui. Vous pouvez effectuer les opérations suivantes:

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

Notez que vous je ne crois pas que vous pouvez utiliser Net :: HTTP.start, car il n'accepte pas local_host en option.

Questions connexes