2013-04-03 16 views
9

Sto provando a impostare un proxy e usarlo in una semplice richiesta get come nello documentation. Ma ricevo sempre un errore! L'indirizzo e la porta sono corretti con open-uri ha funzionato .. è http://proxy:8080.Come impostare un proxy in rubys 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', '') 
} 

Cosa sto sbagliando? Grazie per tutte le risposte!

risposta

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

Questo creerà un oggetto http da utilizzare nel blocco. Utilizzare che invece di generarne di nuove ogni volta, qui 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

C'è un'altra opzione:

Net :: HTTP creerà automaticamente un proxy dalla variabile http_proxy ambiente, se presente.

Così si può utilizzare

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

e Net :: HTTP verrà utilizzato per tutte le richieste per impostazione predefinita.

Può essere utile per richieste net_http in librerie di terze parti (ad esempio funziona per gemma gibbon per MailChimp).

Passaggio nil per l'indirizzo proxy per disabilitare il valore predefinito http_proxy.

+6

Una piccola precisazione: 'Net :: http' utilizzerà automaticamente variabile d'ambiente 'http_proxy' solo quando chiamata attraverso' Net :: HTTP.new'. L'uso di 'Net :: HTTP.start' non utilizzerà la variabile' http_proxy' environment perché passa 'nil' per l'indirizzo proxy se non specificato (invece di passare': ENV'). – cbliard

+0

@cbliard Buon punto. Tuttavia, è ancora possibile utilizzare il rilevamento automatico del proxy in 'NET :: HTTP.start' utilizzando' NET :: HTTP.start (url.hostname, url.port,: p_port =>: ENV) '. – Aert

+0

@Aert utilizzando ': p_port =>: ENV' funziona, ma non mi piace la sua leggibilità :). Un'altra cosa da notare: username e password da 'http_proxy' non vengono letti (come in' http: // username: password @ address: port'). – cbliard

6

Ecco il codice che funziona se si sta effettuando una chiamata API REST dietro un 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 
Problemi correlati