2013-04-03 5 views
9

Ich versuche, einen Proxy zu setzen und es in einer einfachen Get-Anfrage wie in der documentation zu verwenden. Aber ich erhalte immer einen Fehler! Die Adresse und Port sind richtig mit Open-Uri es hat funktioniert .. es ist http://proxy:8080.Wie stelle ich einen Proxy in Rubys Net/http ein?

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', '') 
} 

Was mache ich falsch? Danke für alle Antworten!

Antwort

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

Dadurch wird ein Objekt http erstellt, das Sie im Block verwenden können. Verwenden Sie, dass anstatt Erzeugung jedes Mal neue, hier 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

Es gibt eine andere Option ist:

Net :: HTTP automatisch einen Proxy von den http_proxy Umgebungsvariable erstellen, wenn es vorhanden ist.

So können Sie

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

und Net verwenden :: HTTP wird es standardmäßig für alle Anfragen verwenden.

Es kann hilfreich sein für net_http Anfragen in Bibliotheken von Drittanbietern (zum Beispiel funktioniert es für Edelstein gibbon für MailChimp).

Übergeben Sie nil für die Proxy-Adresse, um Standard http_proxy zu deaktivieren.

+6

Eine kleine Klarstellung: 'Net :: HTTP' wird automatisch verwenden 'http_proxy' Umgebungsvariable nur beim Aufruf über' Net :: HTTP.new'. Die Verwendung von 'Net :: HTTP.start' wird nicht die 'http_proxy'environment-Variable verwenden, da sie für die Proxy-Adresse' nil' übergibt, wenn sie nicht angegeben wird (statt ': ENV' zu übergeben). – cbliard

+0

@cbliard Guter Punkt. Trotzdem können Sie die automatische Erkennung von Proxy in 'NET :: HTTP.start' verwenden, indem Sie' NET :: HTTP.start (url.hostname, url.port,: p_port =>: ENV) 'verwenden. – Aert

+0

@Aert mit ': p_port =>: ENV' funktioniert, aber ich mag seine Lesbarkeit nicht :). Eine andere Sache zu bemerken: Benutzername und Passwort von 'http_proxy' werden nicht gelesen (wie in' http: // Benutzername: Passwort @ Adresse: Port'). – cbliard

6

Hier ist der Code, wenn Sie funktioniert sind eine REST-API-Aufruf hinter einem Proxy machen:

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 
Verwandte Themen