2013-04-03 26 views
9

Próbuję ustawić serwer proxy i użyć go w prosty sposób, tak jak w przypadku documentation. Ale zawsze otrzymuję błąd! Adres i port mają rację z open-uri to działało .. to jest http://proxy:8080.Jak ustawić proxy w rubysie net/http?

proxy_addr = 'proxy' 
proxy_port = 8080 

Net::HTTP.new('google.de', nil, proxy_addr, proxy_port).start { |http| 
    # always proxy via your.proxy.addr:8080 
    Net::HTTP.get('google.de', '') 
} 

Co robię źle? Dzięki za wszystkie odpowiedzi!

Odpowiedz

17
Net::HTTP.new('google.de', nil, proxy_addr, proxy_port).start { |http| 

Spowoduje to utworzenie obiektu http do użycia w bloku. Użyj że zamiast generować nowe za każdym razem, tutaj Net::HTTP.get('google.de', '')

proxy_addr = 'proxy' 
proxy_port = 8080 

Net::HTTP.new('google.de', nil, proxy_addr, proxy_port).start { |http| 
    # always proxy via your.proxy.addr:8080 
    http.get('google.de', '') 
} 
10

Nie ma innej opcji:

Net :: HTTP automatycznie utworzy pełnomocnictwa zmiennej http_proxy środowiska, jeśli jest obecny.

Więc można użyć

ENV['http_proxy'] = 'http://172.16.3.160:4226' # your http://address:port here 

i Net :: HTTP będzie go używać dla wszystkich żądań domyślnie.

Może być przydatny dla żądań net_http w bibliotekach stron trzecich (na przykład działa pod klejnot gibbon dla MailChimp).

Przekaż nil dla adresu proxy, aby wyłączyć domyślną http_proxy.

+6

Trochę wyjaśnienie: 'Net :: HTTP' automatycznie użyje 'Zmienna środowiskowa' http_proxy' tylko po wywołaniu przez 'Net :: HTTP.new'. Użycie 'Net :: HTTP.start' nie użyje zmiennej' http_proxy'environment, ponieważ przekazuje 'nil' dla adresu proxy, jeśli nie jest określony (zamiast podania': ENV'). – cbliard

+0

@cbliard Dobra uwaga. Mimo to nadal możesz korzystać z automatycznego wykrywania proxy w 'NET :: HTTP.start' przy użyciu' NET :: HTTP.start (url.hostname, url.port,: p_port =>: ENV) '. – Aert

+0

@Aert używając ': p_port =>: ENV' działa, ale nie podoba mi się jego czytelność :). Kolejna rzecz, o której warto pamiętać: nazwa użytkownika i hasło z 'http_proxy' nie są czytane (jak w' http: // nazwaużytkownika: hasło @ adres: port'). – cbliard

6

Oto kod, który działa jeśli podejmowania odpoczynku wywołanie API serwera proxy:

require "uri" 
require 'net/http' 

proxy_host = '<proxy addr>' 
proxy_port = '<proxy_port' 
proxy_user = '<username>' 
proxy_pass = '<password>' 

uri = URI.parse("https://saucelabs.com:80/rest/v1/users/<username>") 
proxy = Net::HTTP::Proxy(proxy_host, proxy_port, proxy_user, proxy_pass) 

req = Net::HTTP::Get.new(uri.path) 
req.basic_auth(<sauce_username>,<sauce_password>) 

result = proxy.start(uri.host,uri.port) do |http| 
http.request(req) 
end 

puts result.body