aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--lib/open-uri.rb3
-rw-r--r--test/open-uri/test_open-uri.rb36
3 files changed, 46 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 922d99a492..621e79a48c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Wed Mar 30 09:46:01 2016 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * lib/open-uri.rb: Use `userinfo` for authenticated proxy.
+ [fix GH-1148] Patch by @SokichiFujita
+ * test/open-uri/test_open-uri.rb: ditto.
+ [fix GH-1309] Patch by @jdamick
+
Wed Mar 30 01:56:06 2016 NARUSE, Yui <naruse@ruby-lang.org>
* ext/nkf/nkf-utf8/nkf.c: Merge upstream 4f3edf80a0.
diff --git a/lib/open-uri.rb b/lib/open-uri.rb
index 192f1e5711..489b83ac98 100644
--- a/lib/open-uri.rb
+++ b/lib/open-uri.rb
@@ -270,6 +270,9 @@ module OpenURI
if URI::HTTP === target
# HTTP or HTTPS
if proxy
+ unless proxy_user && proxy_pass
+ proxy_user, proxy_pass = proxy_uri.userinfo.split(':') if proxy_uri.userinfo
+ end
if proxy_user && proxy_pass
klass = Net::HTTP::Proxy(proxy_uri.hostname, proxy_uri.port, proxy_user, proxy_pass)
else
diff --git a/test/open-uri/test_open-uri.rb b/test/open-uri/test_open-uri.rb
index c64c2be324..49b3e3da06 100644
--- a/test/open-uri/test_open-uri.rb
+++ b/test/open-uri/test_open-uri.rb
@@ -372,6 +372,42 @@ class TestOpenURI < Test::Unit::TestCase
}
end
+ def test_authenticated_proxy_http_basic_authentication_success
+ with_http {|srv, dr, url|
+ proxy_log = StringIO.new(''.dup)
+ proxy_logger = WEBrick::Log.new(proxy_log, WEBrick::BasicLog::WARN)
+ proxy_auth_log = ''.dup
+ proxy = WEBrick::HTTPProxyServer.new({
+ :ServerType => Thread,
+ :Logger => proxy_logger,
+ :AccessLog => [[NullLog, ""]],
+ :ProxyAuthProc => lambda {|req, res|
+ proxy_auth_log << req.request_line
+ if req["Proxy-Authorization"] != "Basic #{['user:pass'].pack('m').chomp}"
+ raise WEBrick::HTTPStatus::ProxyAuthenticationRequired
+ end
+ },
+ :BindAddress => '127.0.0.1',
+ :Port => 0})
+ _, proxy_port, _, proxy_host = proxy.listeners[0].addr
+ proxy_url = "http://user:pass@#{proxy_host}:#{proxy_port}/"
+ begin
+ th = proxy.start
+ srv.mount_proc("/proxy", lambda { |req, res| res.body = "proxy" } )
+ open("#{url}/proxy", :proxy => proxy_url) {|f|
+ assert_equal("200", f.status[0])
+ assert_equal("proxy", f.read)
+ }
+ assert_match(/#{Regexp.quote url}/, proxy_auth_log); proxy_auth_log.clear
+ assert_equal("", proxy_auth_log); proxy_auth_log.clear
+ ensure
+ proxy.shutdown
+ th.join
+ end
+ assert_equal("", proxy_log.string)
+ }
+ 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" }