Ruby 2.0 Open Uri всегда использует прокси, даже с флагом proxy = nil
В нашей кодовой базе сделан следующий вызов:
require 'open-uri'
open(url, :proxy => nil)
Однако, когда вызов сделан, Open URI использует http_proxy
переменная окружения для совершения вызова, которая эффективно блокируется нашим брандмауэром. Согласно документам при прохождении nil
или же false
к proxy
вариант, переменные окружения также должны быть проигнорированы, но это не так.
Если мы либо перейдем на версию Ruby 1.8.7
или же unset
переменная окружения, вызов сделан успешно без прокси. Проблема в том, что нам нужно использовать прокси для звонков в Интернет, но мы не можем использовать их для внутренних звонков (как здесь) из-за конфигурации нашего брандмауэра.
Любая помощь будет принята с благодарностью!
1 ответ
Я могу воспроизвести то, что вы описали
http_proxy=http://127.0.0.1 ruby -e "require 'open-uri'; open('http://google.com', proxy: nil)"
~/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/net/http.rb:878:in `initialize': Connection refused - connect(2) (Errno::ECONNREFUSED)
from ~/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/net/http.rb:878:in `open'
from ~/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/net/http.rb:878:in `block in connect'
from ~/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/timeout.rb:52:in `timeout'
from ~/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/net/http.rb:877:in `connect'
from ~/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/net/http.rb:862:in `do_start'
from ~/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/net/http.rb:851:in `start'
from ~/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/open-uri.rb:313:in `open_http'
from ~/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/open-uri.rb:708:in `buffer_open'
from ~/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/open-uri.rb:210:in `block in open_loop'
from ~/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/open-uri.rb:208:in `catch'
from ~/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/open-uri.rb:208:in `open_loop'
from ~/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/open-uri.rb:149:in `open_uri'
from ~/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/open-uri.rb:688:in `open'
from ~/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/open-uri.rb:34:in `open'
from -e:1:in `<main>'
Я выкопал код и думаю, что нашел проблему.
До сих пор open-uri
управляй правильно прокси. Например, в OpenURI.open_loop
, он правильно считает, что proxy
установлен в nil
(см. open-uri.rb#195
case opt_proxy
when true
find_proxy = lambda {|u| pxy = u.find_proxy; pxy ? [pxy, nil, nil] : nil}
when nil, false
find_proxy = lambda {|u| nil} # <-- THIS LINE
Но когда это создает Net::HTTP
экземпляр в OpenURI.open_http
http = klass.new(target_host, target_port)
это не проходит p_addr = nil
, Согласно исходному коду и документу для HTTP.new
def HTTP.new(address, port = nil, p_addr = :ENV, p_port = nil, p_user = nil, p_pass = nil)
http = super address, port
if proxy_class? then # from Net::HTTP::Proxy()
http.proxy_from_env = @proxy_from_env
http.proxy_address = @proxy_address
http.proxy_port = @proxy_port
http.proxy_user = @proxy_user
http.proxy_pass = @proxy_pass
elsif p_addr == :ENV then # <---- THIS LINE
http.proxy_from_env = true
else
http.proxy_address = p_addr
http.proxy_port = p_port || default_port
http.proxy_user = p_user
http.proxy_pass = p_pass
end
http
end
Над док говорит
Для отключения обнаружения прокси установите +p_addr+ в ноль.
Я залатал open-uri.rb
заменив строку 291 на
http = proxy ? klass.new(target_host, target_port) : klass.new(target_host, target_port, nil)
Теперь он ведет себя как ожидалось.
только что заполнил вопрос об ошибке в Ruby.