From d8c18394d86626726c256ce57c3336ca649a33ae Mon Sep 17 00:00:00 2001 From: Samuel Giddins Date: Tue, 15 Jan 2019 21:54:28 -0800 Subject: [PATCH] Support nil param on Ruby < 2.4 --- CHANGELOG.md | 4 ++++ lib/sinatra/base.rb | 2 +- test/routing_test.rb | 11 +++++++++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f75c7841d0..e3c547dff6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## Unreleased + +* Avoid `TypeError` when params contain a key without a value on Ruby < 2.4 [#1516](https://github.com/sinatra/sinatra/pull/1516) by Samuel Giddins + ## 2.0.5 / 2018-12-22 * Avoid FrozenError when params contains frozen value [#1506](https://github.com/sinatra/sinatra/pull/1506) by Kunpei Sakai diff --git a/lib/sinatra/base.rb b/lib/sinatra/base.rb index 4875e0baed..dcf7618607 100644 --- a/lib/sinatra/base.rb +++ b/lib/sinatra/base.rb @@ -1089,7 +1089,7 @@ def invoke # Dispatch a request with error handling. def dispatch! - @params.merge!(@request.params).each { |key, val| @params[key] = force_encoding(val.dup) } + @params.merge!(@request.params).each { |key, val| @params[key] = val && force_encoding(val.dup) } invoke do static! if settings.static? && (request.get? || request.head?) diff --git a/test/routing_test.rb b/test/routing_test.rb index d34e5bf2b6..98ce9d53b2 100644 --- a/test/routing_test.rb +++ b/test/routing_test.rb @@ -311,6 +311,17 @@ class RoutingTest < Minitest::Test assert_equal 'well, alright', body end + it "handles params without a value" do + mock_app { + get '/' do + assert_nil params.fetch('foo') + "Given: #{params.keys.sort.join(',')}" + end + } + get '/?foo' + assert_equal 'Given: foo', body + end + it "merges named params and query string params in params" do mock_app { get '/:foo' do