diff --git a/lib/sinatra/base.rb b/lib/sinatra/base.rb index aef747e794..17e7175f95 100644 --- a/lib/sinatra/base.rb +++ b/lib/sinatra/base.rb @@ -1089,7 +1089,14 @@ def invoke # Dispatch a request with error handling. def dispatch! - @params.merge!(@request.params).each { |key, val| @params[key] = val && force_encoding(val.dup) } + @params.merge!(@request.params).each do |key, val| + @params[key] = + begin + force_encoding(val.dup) + rescue TypeError + val + end + end invoke do static! if settings.static? && (request.get? || request.head?) diff --git a/test/middleware_test.rb b/test/middleware_test.rb index 7f71588696..370f874a8b 100644 --- a/test/middleware_test.rb +++ b/test/middleware_test.rb @@ -78,4 +78,23 @@ def call(env) @app.use FreezeMiddleware get '/Foo' end + + class SpecialConstsMiddleware < MockMiddleware + def call(env) + req = Rack::Request.new(env) + req.update_param('s', :s) + req.update_param('i', 1) + req.update_param('c', 3.to_c) + req.update_param('t', true) + req.update_param('f', false) + req.update_param('n', nil) + super + end + end + + it "handles params when the params contains true/false values" do + @app.use SpecialConstsMiddleware + get '/' + end + end