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
This commit is contained in:
Kunpei Sakai 2018-12-16 04:43:16 +09:00
parent 5d3099ee3b
commit c686a10be6
No known key found for this signature in database
GPG Key ID: C4B6919318C291BC
2 changed files with 14 additions and 1 deletions

View File

@ -1089,7 +1089,7 @@ module Sinatra
# 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?)

View File

@ -65,4 +65,17 @@ class MiddlewareTest < Minitest::Test
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