From 9a488bdea0f7bcf5d42d9bad6f3c201707eea34b Mon Sep 17 00:00:00 2001 From: Marshall Huss Date: Sun, 17 May 2009 23:07:19 -0400 Subject: [PATCH] Added proxy support to active_resource --- activeresource/lib/active_resource/base.rb | 21 +++++++++++++++++++++ activeresource/lib/active_resource/connection.rb | 12 ++++++++++-- activeresource/test/connection_test.rb | 10 ++++++++++ 3 files changed, 41 insertions(+), 2 deletions(-) diff --git a/activeresource/lib/active_resource/base.rb b/activeresource/lib/active_resource/base.rb index bc82139..1673125 100644 --- a/activeresource/lib/active_resource/base.rb +++ b/activeresource/lib/active_resource/base.rb @@ -256,6 +256,22 @@ module ActiveResource @password = URI.decode(@site.password) if @site.password end end + + # Gets the \proxy variable if a proxy is required + def proxy + # Not using superclass_delegating_reader. See +site+ for explanation + if defined?(@proxy) + @proxy + elsif superclass != Object && superclass.site + superclass.proxy.dup.freeze + end + end + + # Sets the URI of the http proxy to the value in the +proxy+ argument. + def proxy=(proxy) + @connection = nil + @proxy = proxy.nil? ? nil : create_proxy_uri_from(proxy) + end # Gets the \user for REST HTTP authentication. def user @@ -621,6 +637,11 @@ module ActiveResource def create_site_uri_from(site) site.is_a?(URI) ? site.dup : URI.parse(site) end + + # Accepts a URI and creates the proxy URI from that. + def create_proxy_uri_from(proxy) + proxy.is_a?(URI) ? proxy.dup : URI.parse(proxy) + end # contains a set of the current prefix parameters. def prefix_parameters diff --git a/activeresource/lib/active_resource/connection.rb b/activeresource/lib/active_resource/connection.rb index 99d4b8f..5ee3f61 100644 --- a/activeresource/lib/active_resource/connection.rb +++ b/activeresource/lib/active_resource/connection.rb @@ -16,7 +16,7 @@ module ActiveResource :delete => 'Accept' } - attr_reader :site, :user, :password, :timeout + attr_reader :site, :user, :password, :timeout, :proxy attr_accessor :format class << self @@ -55,6 +55,10 @@ module ActiveResource def timeout=(timeout) @timeout = timeout end + + def proxy=(proxy) + @proxy = proxy.is_a?(URI) ? proxy : URI.parse(proxy) + end # Executes a GET request. # Used to get (find) resources. @@ -132,7 +136,11 @@ module ActiveResource # Creates new Net::HTTP instance for communication with the # remote service and resources. def http - http = Net::HTTP.new(@site.host, @site.port) + if @proxy + http = Net::HTTP.new(@site.host, @site.port, @proxy.host, @proxy.port, @proxy.user, @proxy.password) + else + http = Net::HTTP.new(@site.host, @site.port) + end http.use_ssl = @site.is_a?(URI::HTTPS) http.verify_mode = OpenSSL::SSL::VERIFY_NONE if http.use_ssl? http.read_timeout = @timeout if @timeout # If timeout is not set, the default Net::HTTP timeout (60s) is used. diff --git a/activeresource/test/connection_test.rb b/activeresource/test/connection_test.rb index 831fbc4..12c1894 100644 --- a/activeresource/test/connection_test.rb +++ b/activeresource/test/connection_test.rb @@ -100,6 +100,16 @@ class ConnectionTest < Test::Unit::TestCase assert_nothing_raised { @conn.site = site } assert_equal site, @conn.site end + + def test_proxy_accessor_accepts_uri_or_string_argument + proxy = URI.parse("http://proxy_user:proxy_password@proxy.local:4242") + + assert_nothing_raised { @conn.proxy = "http://proxy_user:proxy_password@proxy.local:4242" } + assert_equal proxy, @conn.proxy + + assert_nothing_raised { @conn.proxy = proxy } + assert_equal proxy, @conn.proxy + end def test_timeout_accessor @conn.timeout = 5 -- 1.6.0.4