diff --git a/lib/sinatra/base.rb b/lib/sinatra/base.rb index eb94d3ed19..4875e0baed 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! - force_encoding(@params.merge!(@request.params)) + @params.merge!(@request.params).each { |key, val| @params[key] = force_encoding(val.dup) } invoke do static! if settings.static? && (request.get? || request.head?) diff --git a/test/middleware_test.rb b/test/middleware_test.rb index 8a6e836c4e..7f71588696 100644 --- a/test/middleware_test.rb +++ b/test/middleware_test.rb @@ -65,4 +65,17 @@ def call(env) assert_equal "/FOO", body assert_equal "UpcaseMiddleware", response['X-Tests'] end + + class FreezeMiddleware < MockMiddleware + def call(env) + req = Rack::Request.new(env) + req.update_param('bar', 'baz'.freeze) + super + end + end + + it "works when middleware adds a frozen param" do + @app.use FreezeMiddleware + get '/Foo' + end end