2010-06-09 9 views
10

Szukam sposobu na użycie różnych adresów IP dla każdego żądania GET przy użyciu standardowej biblioteki Net :: HTTP. Serwer ma 5 adresów IP i zakłada, że ​​niektóre interfejsy API blokują dostęp, gdy zostanie osiągnięty limit żądań na IP. Tak więc, jedyny sposób, aby to zrobić - użyj innego serwera. Nie mogę znaleźć niczego na ten temat w rubinowych dokumentach.Czy istnieje sposób dołączenia żądania Ruby Net :: HTTP do określonego adresu IP/interfejsu sieciowego?

Na przykład, curl pozwala na przymocowanie go do konkretnego adresu IP (w PHP):

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

Czy istnieje jakiś sposób, aby to zrobić z biblioteki Net :: HTTP? Jako alternatywa - CURB (wiązanie ruby ​​curl). Ale to będzie ostatnia rzecz, którą spróbuję.

Sugestie/Pomysły?

P.S. Rozwiązanie z krawężnika (z brudnych testów ip`s zastępowane):

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 

Odpowiedz

2

Nie wygląda jak można to zrobić z siatką: HTTP. Oto źródło

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

Linia 644 jest, gdy połączenie jest otwarte

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

Argumenty trzeci i czwarty do TCPSocket.open są local_address i port_lokalny, a ponieważ nie są one określone, to niemożliwe. Wygląda na to, że musisz iść z krawężnikiem.

+0

tak, również wykopałem w pliku http.rb, aby znaleźć coś, co mogłoby zostać przesłonięte. Cóż, to jest do bani, ponieważ muszę przepisać moją główną bibliotekę żądań .. mimo to dziękuję za poradę :) –

+0

dostałem proste rozwiązanie krawężnika. dowie się, czy wydajność nadal jest taka sama. –

+4

FYI dla każdego, kto przejdzie teraz tę odpowiedź - zostało to naprawione. Niewygodne, ale wygląda na to, że możesz zrobić "x = Net :: HTTP.new (" google.com "); x.local_host = '10 .0.0.1''. – twooster

5

Jest to w istocie sposób, aby to zrobić, jeśli małpa łata TCPSocket:

https://gist.github.com/800214

Curb jest niesamowite, ale nie będzie działać z jruby więc szukałem alternatyw ...

+0

Rozwiązałem to już dawno temu: http://blog.sosedoff.com/2010/06/13/handy-http-requests-with-curb-and-ruby/ –

6

Wiem, że to jest stare, ale mam nadzieję, że ktoś inny uzna to za przydatne, tak jak tego potrzebowałem dzisiaj. Można wykonać następujące czynności:

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

pamiętać, że nie wierzę można użyć Net :: HTTP.start, gdyż nie akceptuje local_host jako opcja.

Powiązane problemy