From ca7af7b88f2207cd7a1700c2a086459f619e4d6c Mon Sep 17 00:00:00 2001 From: Sam Date: Tue, 28 Nov 2017 09:28:40 +1100 Subject: [PATCH] FIX: displaying wrong avatar and letter avatar correct regression where params and env is reused in production --- lib/hijack.rb | 20 ++++++++++++++++++-- spec/components/hijack_spec.rb | 18 ++++++++++++++++-- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/lib/hijack.rb b/lib/hijack.rb index 6f7b7e9f2d1..78943119e19 100644 --- a/lib/hijack.rb +++ b/lib/hijack.rb @@ -7,11 +7,26 @@ module Hijack def hijack(&blk) controller_class = self.class - request = self.request + + #env = request.env.dup + #request_copy = ActionDispatch::Request.new(env) + request_copy = self.request if hijack = request.env['rack.hijack'] io = hijack.call + # in prd the env object is re-used + # make a copy of all strings + env_copy = {} + request.env.each do |k, v| + env_copy[k] = v if String === v + end + + request_copy = ActionDispatch::Request.new(env_copy) + + # params is generated per request so we can simply reuse it + params_copy = params + Scheduler::Defer.later("hijack work") do begin @@ -24,7 +39,8 @@ module Hijack instance = controller_class.new response = ActionDispatch::Response.new instance.response = response - instance.request = request + instance.request = request_copy + instance.params = params_copy begin instance.instance_eval(&blk) diff --git a/spec/components/hijack_spec.rb b/spec/components/hijack_spec.rb index 15c0078faec..7d25f67ea62 100644 --- a/spec/components/hijack_spec.rb +++ b/spec/components/hijack_spec.rb @@ -8,8 +8,10 @@ describe Hijack do def initialize @io = StringIO.new - self.request = ActionController::TestRequest.new( - { "rack.hijack" => lambda { @io } }, + self.request = ActionController::TestRequest.new({ + "rack.hijack" => lambda { @io }, + "rack.input" => StringIO.new + }, nil, nil ) @@ -27,6 +29,18 @@ describe Hijack do Hijack::Tester.new end + it "dupes the request params and env" do + orig_req = tester.request + copy_req = nil + + tester.hijack_test do + copy_req = request + render body: "hello world", status: 200 + end + + expect(copy_req.object_id).not_to eq(orig_req.object_id) + end + it "handles expires_in" do tester.hijack_test do expires_in 1.year