From ac691c80f32dab7623af0f24051824ad03710fa4 Mon Sep 17 00:00:00 2001 From: Oskar Eichler Date: Thu, 27 Aug 2026 23:35:57 +0300 Subject: [PATCH 1/2] Preserve non-string components when escaping build2 hashes --- lib/uri/generic.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/uri/generic.rb b/lib/uri/generic.rb index fce8a8a..cc131bd 100644 --- a/lib/uri/generic.rb +++ b/lib/uri/generic.rb @@ -90,7 +90,7 @@ def self.build2(args) elsif args.kind_of?(Hash) tmp = {} args.each do |key, value| - tmp[key] = if value + tmp[key] = if value.is_a?(String) URI::RFC2396_PARSER.escape(value) else value From e7127653f3281ad40e54658f2558e147ae5c8f1c Mon Sep 17 00:00:00 2001 From: Oskar Eichler <62393985+OskarEichler@users.noreply.github.com> Date: Fri, 28 Aug 2026 15:03:58 +0300 Subject: [PATCH 2/2] test: cover URI regression --- test/uri/test_generic.rb | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/test/uri/test_generic.rb b/test/uri/test_generic.rb index 9006125..4fff536 100644 --- a/test/uri/test_generic.rb +++ b/test/uri/test_generic.rb @@ -16,6 +16,16 @@ def uri_to_ary(uri) uri.class.component.collect {|c| uri.send(c)} end + + def test_build2_preserves_non_string_components + components = {host: "example.test", port: 8080, path: "/a b"} + + uri = URI::HTTP.build2(components) + + assert_equal("http://example.test:8080/a%20b", uri.to_s) + assert_equal({host: "example.test", port: 8080, path: "/a b"}, components) + end + def test_to_s exp = 'http://example.com/'.freeze str = URI(exp).to_s