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.

Другие вопросы по тегам