From c686a10be68a959c34495c4969dcbabe7b93205e Mon Sep 17 00:00:00 2001 From: Kunpei Sakai Date: Sun, 16 Dec 2018 04:43:16 +0900 Subject: [PATCH] avoid FrozenError when params contains frozen value The error can be fixed by using dupped values. The original code for testing is implemented by @programmarchy in #1479 Fixes #1478 Closes #1479 --- lib/sinatra/base.rb | 2 +- test/middleware_test.rb | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) 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