summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--lib/xmlrpc/client.rb8
-rw-r--r--test/xmlrpc/test_client.rb102
3 files changed, 115 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index e235615ce30..d6fbea25c5b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Sat Mar 3 08:08:11 2012 Aaron Patterson <aaron@tenderlovemaking.com>
+
+ * lib/xmlrpc/client.rb (new2): fix custom port specification when an
+ SSL uri is used.
+ * test/xmlrpc/test_client.rb: tests for XMLRPC::Client.new2
+
Sat Mar 3 08:03:29 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
* ext/syck/rubyext.c (mktime_do): use ISDIGIT().
diff --git a/lib/xmlrpc/client.rb b/lib/xmlrpc/client.rb
index 968292b077a..b9d4affeb23 100644
--- a/lib/xmlrpc/client.rb
+++ b/lib/xmlrpc/client.rb
@@ -279,6 +279,7 @@ require "xmlrpc/create"
require "xmlrpc/config"
require "xmlrpc/utils" # ParserWriterChooseMixin
require "net/http"
+require "uri"
module XMLRPC
@@ -344,15 +345,20 @@ module XMLRPC
host, port = match[4].split(":")
path = match[5]
- if proto != "http" and proto != "https"
+ case proto
+ when 'http' then port ||= 80
+ when 'https' then port ||= 443
+ else
raise "Wrong protocol specified. Only http or https allowed!"
end
+ port = port.to_i
else
raise "Wrong URI as parameter!"
end
proxy_host, proxy_port = (proxy || "").split(":")
+ proxy_port = proxy_port.to_i if proxy_port
self.new(host, path, port, proxy_host, proxy_port, user, passwd, (proto == "https"), timeout)
end
diff --git a/test/xmlrpc/test_client.rb b/test/xmlrpc/test_client.rb
new file mode 100644
index 00000000000..e12391a3ea1
--- /dev/null
+++ b/test/xmlrpc/test_client.rb
@@ -0,0 +1,102 @@
+require 'minitest/autorun'
+require 'xmlrpc/client'
+
+module XMLRPC
+ class ClientTest < MiniTest::Unit::TestCase
+ class FakeClient < XMLRPC::Client
+ attr_reader :args
+
+ def initialize(*args)
+ @args = args
+ super
+ end
+ end
+
+ def test_new2_host_path_port
+ client = FakeClient.new2 'http://example.org/foo'
+ host, path, port, *rest = client.args
+
+ assert_equal 'example.org', host
+ assert_equal '/foo', path
+ assert_equal 80, port
+
+ rest.each { |x| refute x }
+ end
+
+ def test_new2_custom_port
+ client = FakeClient.new2 'http://example.org:1234/foo'
+ host, path, port, *rest = client.args
+
+ assert_equal 'example.org', host
+ assert_equal '/foo', path
+ assert_equal 1234, port
+
+ rest.each { |x| refute x }
+ end
+
+ def test_new2_ssl
+ client = FakeClient.new2 'https://example.org/foo'
+ host, path, port, proxy_host, proxy_port, user, password, use_ssl, timeout = client.args
+
+ assert_equal 'example.org', host
+ assert_equal '/foo', path
+ assert_equal 443, port
+ assert use_ssl
+
+ refute proxy_host
+ refute proxy_port
+ refute user
+ refute password
+ refute timeout
+ end
+
+ def test_new2_ssl_custom_port
+ client = FakeClient.new2 'https://example.org:1234/foo'
+ host, path, port, proxy_host, proxy_port, user, password, use_ssl, timeout = client.args
+
+ assert_equal 'example.org', host
+ assert_equal '/foo', path
+ assert_equal 1234, port
+
+ refute proxy_host
+ refute proxy_port
+ refute user
+ refute password
+ refute timeout
+ end
+
+ def test_new2_user_password
+ client = FakeClient.new2 'http://aaron:tenderlove@example.org/foo'
+ host, path, port, proxy_host, proxy_port, user, password, use_ssl, timeout = client.args
+
+ [ host, path, port ].each { |x| assert x }
+ assert_equal 'aaron', user
+ assert_equal 'tenderlove', password
+
+ [ proxy_host, proxy_port, use_ssl, timeout ].each { |x| refute x }
+ end
+
+ def test_new2_proxy_host
+ client = FakeClient.new2 'http://example.org/foo', 'example.com'
+ host, path, port, proxy_host, proxy_port, user, password, use_ssl, timeout = client.args
+
+ [ host, path, port ].each { |x| assert x }
+
+ assert_equal 'example.com', proxy_host
+
+ [ user, password, proxy_port, use_ssl, timeout ].each { |x| refute x }
+ end
+
+ def test_new2_proxy_port
+ client = FakeClient.new2 'http://example.org/foo', 'example.com:1234'
+ host, path, port, proxy_host, proxy_port, user, password, use_ssl, timeout = client.args
+
+ [ host, path, port ].each { |x| assert x }
+
+ assert_equal 'example.com', proxy_host
+ assert_equal 1234, proxy_port
+
+ [ user, password, use_ssl, timeout ].each { |x| refute x }
+ end
+ end
+end