Project

General

Profile

Bug #4388 » open-uri_with_http_proxy.patch

yalab (あつし よしだ), 02/10/2011 02:15 PM

View differences:

lib/open-uri.rb
end
case opt_proxy
when true
find_proxy = lambda {|u| pxy = u.find_proxy; pxy ? [pxy, nil, nil] : nil}
find_proxy = lambda {|u|
if pxy = u.find_proxy
(proxy_user, proxy_pass) = pxy.userinfo.to_s.split(":")
[pxy, proxy_user, proxy_pass]
else
nil
end
}
when nil, false
find_proxy = lambda {|u| nil}
when String
......
proxy_uri = ENV[name] || ENV[name.upcase]
end
if proxy_uri && self.hostname
require 'socket'
begin
addr = IPSocket.getaddress(self.hostname)
proxy_uri = nil if /\A127\.|\A::1\z/ =~ addr
rescue SocketError
end
end
if proxy_uri
proxy_uri = URI.parse(proxy_uri)
if self.hostname
require 'socket'
begin
addr = IPSocket.getaddress(self.hostname)
return nil if /\A127\.|\A::1\z/ =~ addr && proxy_uri.userinfo.nil?
rescue SocketError
end
end
name = 'no_proxy'
if no_proxy = ENV[name] || ENV[name.upcase]
no_proxy.scan(/([^:,]*)(?::(\d+))?/) {|host, port|
test/open-uri/test_open-uri.rb
}
end
def test_proxy_http_basic_authentication_from_env
with_http {|srv, dr, url|
log = ''
proxy_user = 'user'
proxy_pass = 'pass'
proxy = WEBrick::HTTPProxyServer.new({
:ServerType => Thread,
:Logger => WEBrick::Log.new(NullLog),
:AccessLog => [[NullLog, ""]],
:ProxyAuthProc => lambda {|req, res|
log << req.request_line
auth = ["#{proxy_user}:#{proxy_pass}"].pack('m').chomp
if req["Proxy-Authorization"] != "Basic #{auth}"
raise WEBrick::HTTPStatus::ProxyAuthenticationRequired
end
},
:BindAddress => '127.0.0.1',
:Port => 0})
_, proxy_port, _, proxy_host = proxy.listeners[0].addr
proxy_url = "http://#{proxy_user}:#{proxy_pass}@#{proxy_host}:#{proxy_port}"
::ENV['http_proxy'] = proxy_url
begin
th = proxy.start
open("#{dr}/proxy", "w") {|f| f << "proxy" }
open("#{url}/proxy") {|f|
assert_equal("200", f.status[0])
assert_equal("proxy", f.read)
}
assert_match(/#{Regexp.quote url}/, log); log.clear
assert_equal("", log); log.clear
ensure
proxy.shutdown
end
}
end
def test_redirect
with_http {|srv, dr, url|
srv.mount_proc("/r1/") {|req, res| res.status = 301; res["location"] = "#{url}/r2"; res.body = "r1" }
    (1-1/1)