aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--lib/xmlrpc/client.rb29
-rw-r--r--test/xmlrpc/test_client.rb11
3 files changed, 31 insertions, 15 deletions
diff --git a/ChangeLog b/ChangeLog
index 2bc4fbaa70..0379e95d5f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Sat Mar 3 08:42:25 2012 Aaron Patterson <aaron@tenderlovemaking.com>
+
+ * lib/xmlrpc/client.rb (new2): use URI for uri parsing.
+ * test/xmlrpc/test_client.rb: test that query params are passed to the
+ client constructor.
+
Sat Mar 3 08:20:10 2012 Aaron Patterson <aaron@tenderlovemaking.com>
* lib/xmlrpc/client.rb (new2): raises an ArgumentError on bad
diff --git a/lib/xmlrpc/client.rb b/lib/xmlrpc/client.rb
index d6495b55c4..e61d631b16 100644
--- a/lib/xmlrpc/client.rb
+++ b/lib/xmlrpc/client.rb
@@ -339,24 +339,23 @@ module XMLRPC
class << self
def new2(uri, proxy=nil, timeout=nil)
- if match = /^([^:]+):\/\/(([^@]+)@)?([^\/]+)(\/.*)?$/.match(uri)
- proto = match[1]
- user, passwd = (match[3] || "").split(":")
- host, port = match[4].split(":")
- path = match[5]
-
- case proto
- when 'http' then port ||= 80
- when 'https' then port ||= 443
- else
- raise ArgumentError, "Wrong protocol specified. Only http or https allowed!"
- end
+ begin
+ url = URI(uri)
+ rescue URI::InvalidURIError => e
+ raise ArgumentError, e.message, e.backtrace
+ end
- port = port.to_i
- else
- raise ArgumentError, "Wrong URI as parameter!"
+ unless URI::HTTP === url
+ raise ArgumentError, "Wrong protocol specified. Only http or https allowed!"
end
+ proto = url.scheme
+ user = url.user
+ passwd = url.password
+ host = url.host
+ port = url.port
+ path = url.path.empty? ? nil : url.request_uri
+
proxy_host, proxy_port = (proxy || "").split(":")
proxy_port = proxy_port.to_i if proxy_port
diff --git a/test/xmlrpc/test_client.rb b/test/xmlrpc/test_client.rb
index 353bfc5f88..fd2263024a 100644
--- a/test/xmlrpc/test_client.rb
+++ b/test/xmlrpc/test_client.rb
@@ -132,5 +132,16 @@ module XMLRPC
XMLRPC::Client.new2 ':::::'
end
end
+
+ def test_new2_path_with_query
+ client = FakeClient.new2 'http://example.org/foo?bar=baz'
+ host, path, port, *rest = client.args
+
+ assert_equal 'example.org', host
+ assert_equal '/foo?bar=baz', path
+ assert port
+
+ rest.each { |x| refute x }
+ end
end
end