From ff18d0d8a1bf00c239da8d4bc53730ae024ca585 Mon Sep 17 00:00:00 2001 From: Michael Bumann Date: Tue, 3 Mar 2020 19:29:26 +0100 Subject: [PATCH] Use local variables in rack middleware to prevent instance state changes see: https://github.com/railslove/rack-tracker/pull/150 --- lib/rack/tracker.rb | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/lib/rack/tracker.rb b/lib/rack/tracker.rb index ed0a07e..955203e 100644 --- a/lib/rack/tracker.rb +++ b/lib/rack/tracker.rb @@ -38,9 +38,10 @@ def initialize(app, &block) end def call(env) - @status, @headers, @body = @app.call(env) - return [@status, @headers, @body] unless html? - response = Rack::Response.new([], @status, @headers) + status, headers, body = @app.call(env) + return [status, headers, body] unless headers['Content-Type'] =~ /html/ + + response = Rack::Response.new([], status, headers) env[EVENT_TRACKING_KEY] ||= {} @@ -52,16 +53,14 @@ def call(env) session[EVENT_TRACKING_KEY] = env[EVENT_TRACKING_KEY] end - @body.each { |fragment| response.write inject(env, fragment) } - @body.close if @body.respond_to?(:close) + body.each { |fragment| response.write inject(env, fragment) } + body.close if body.respond_to?(:close) response.finish end private - def html?; @headers['Content-Type'] =~ /html/; end - def inject(env, response) duplicated_response = response.dup @handlers.each(env) do |handler|