2010-06-09 7 views
10

Sto cercando un modo per utilizzare indirizzi IP diversi per ogni richiesta GET con la libreria Net :: HTTP standard. Il server ha 5 indirizzi IP e presuppone che alcune API stiano bloccando l'accesso quando viene raggiunto il limite di richieste per IP. Quindi, l'unico modo per farlo - usa un altro server. Non riesco a trovare nulla in ruby ​​docs.C'è un modo per allegare la richiesta Ruby Net :: HTTP a uno specifico indirizzo IP/interfaccia di rete?

Per esempio, l'arricciatura consente di collegarlo a specifici indirizzi IP (in PHP):

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

Esiste un modo per farlo con la biblioteca :: HTTP Net? In alternativa: CURB (rilegatura a ricciolo rosso rubino). Ma sarà l'ultima cosa che proverò.

Suggerimenti/idee?

P.S. La soluzione con CURB (con i test sporchi, ip`s essere sostituito):

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 

risposta

2

non sembra si può fare con Net: HTTP. Ecco la fonte

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

linea 644 è dove la connessione è aperta

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

Il terzo e il quarto argomento a TCPSocket.open sono local_address e porta_locale, e dal momento che non sono specificati, è non possibile. Sembra che dovrai andare con il marciapiede.

+0

sì, ho anche scavato nel file http.rb per trovare c'è qualcosa che potrebbe essere annullato. beh, questo fa schifo perché devo riscrivere la mia libreria di richieste di base .. comunque grazie per un consiglio :) –

+0

ha ottenuto una soluzione semplice. scopriremo se la performance è sempre la stessa. –

+4

FYI per chiunque incontri questa risposta ora - questo è stato risolto. Non testato, ma sembra che tu possa fare 'x = Net :: HTTP.new ('google.com'); x.local_host = '10 .0.0.1''. – twooster

5

V'è infatti un modo per fare questo se patch di scimmia TCPSocket:

https://gist.github.com/800214

Curb è impressionante, ma non funziona con JRuby così ho cercato in alternative ...

+0

Ho risolto questo molto tempo fa: http://blog.sosedoff.com/2010/06/13/handy-http-requests-with-curb-and-ruby/ –

6

So che questo è vecchio, ma speriamo che qualcun altro lo trovi utile, poiché ne avevo bisogno oggi. È possibile effettuare le seguenti operazioni:

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

nota che io non credo che si possa utilizzare Net :: HTTP.start, in quanto non accetta local_host come opzione.

Problemi correlati