diff options
author | Rafael Mendonça França <rafaelmfranca@gmail.com> | 2018-04-04 18:17:01 -0400 |
---|---|---|
committer | Rafael Mendonça França <rafaelmfranca@gmail.com> | 2018-04-04 18:17:16 -0400 |
commit | 826b17cd8a4f0416fd6b8451199fd0f1fa20f417 (patch) | |
tree | ecccec505ebcdd76cad6a03c586a92ae1e44ae1f | |
parent | 8d62ff00805a222baa76cfe1fe7b16c985a1893e (diff) | |
parent | 0ac64470ea3dd39e7285ecb971b5995fb94eb2c2 (diff) | |
download | rails-826b17cd8a4f0416fd6b8451199fd0f1fa20f417.tar.gz rails-826b17cd8a4f0416fd6b8451199fd0f1fa20f417.tar.bz2 rails-826b17cd8a4f0416fd6b8451199fd0f1fa20f417.zip |
Merge pull request #32444 from matrinox/fix-return-response-mutation-rack-logger
Stop mutating body response
-rw-r--r-- | railties/lib/rails/rack/logger.rb | 6 | ||||
-rw-r--r-- | railties/test/rack_logger_test.rb | 20 |
2 files changed, 21 insertions, 5 deletions
diff --git a/railties/lib/rails/rack/logger.rb b/railties/lib/rails/rack/logger.rb index ec5212ee76..4ea7e40319 100644 --- a/railties/lib/rails/rack/logger.rb +++ b/railties/lib/rails/rack/logger.rb @@ -35,9 +35,9 @@ module Rails instrumenter = ActiveSupport::Notifications.instrumenter instrumenter.start "request.action_dispatch", request: request logger.info { started_request_message(request) } - resp = @app.call(env) - resp[2] = ::Rack::BodyProxy.new(resp[2]) { finish(request) } - resp + status, headers, body = @app.call(env) + body = ::Rack::BodyProxy.new(body) { finish(request) } + [status, headers, body] rescue Exception finish(request) raise diff --git a/railties/test/rack_logger_test.rb b/railties/test/rack_logger_test.rb index e47f30d5b6..41e063e893 100644 --- a/railties/test/rack_logger_test.rb +++ b/railties/test/rack_logger_test.rb @@ -14,14 +14,21 @@ module Rails attr_reader :logger - def initialize(logger = NULL, taggers = nil, &block) - super(->(_) { block.call; [200, {}, []] }, taggers) + def initialize(logger = NULL, app: nil, taggers: nil, &block) + app ||= ->(_) { block.call; [200, {}, []] } + super(app, taggers) @logger = logger end def development?; false; end end + class TestApp < Struct.new(:response) + def call(_env) + response + end + end + Subscriber = Struct.new(:starts, :finishes) do def initialize(starts = [], finishes = []) super @@ -72,6 +79,15 @@ module Rails end end end + + def test_logger_does_not_mutate_app_return + response = [] + app = TestApp.new(response) + logger = TestLogger.new(app: app) + assert_no_changes("response") do + logger.call("REQUEST_METHOD" => "GET") + end + end end end end |