From bb8fca11315332a31f4aca6fda1d10b5f74b021f Mon Sep 17 00:00:00 2001 From: Jordan Owens Date: Fri, 8 Jan 2021 01:42:40 -0500 Subject: [PATCH] Preserve query param value if named route param nil Optional named route params would overwrite a query param of the same name with nil if not included --- lib/sinatra/base.rb | 2 +- test/routing_test.rb | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/sinatra/base.rb b/lib/sinatra/base.rb index 8f0d00c7..a2c406d4 100644 --- a/lib/sinatra/base.rb +++ b/lib/sinatra/base.rb @@ -1046,7 +1046,7 @@ module Sinatra params.delete("ignore") # TODO: better params handling, maybe turn it into "smart" object or detect changes force_encoding(params) - @params = @params.merge(params) if params.any? + @params = @params.merge(params) { |k, v1, v2| v2 || v1 } if params.any? regexp_exists = pattern.is_a?(Mustermann::Regular) || (pattern.respond_to?(:patterns) && pattern.patterns.any? {|subpattern| subpattern.is_a?(Mustermann::Regular)} ) if regexp_exists diff --git a/test/routing_test.rb b/test/routing_test.rb index d4de6013..305bff1c 100644 --- a/test/routing_test.rb +++ b/test/routing_test.rb @@ -358,6 +358,10 @@ class RoutingTest < Minitest::Test assert ok? assert_equal "foo=hello;bar=", body + get '/hello?bar=baz' + assert ok? + assert_equal "foo=hello;bar=baz", body + get '/' assert ok? assert_equal "foo=;bar=", body