diff --git a/lib/split/persistence/cookie_adapter.rb b/lib/split/persistence/cookie_adapter.rb index 2eac7fca..d0f4be15 100644 --- a/lib/split/persistence/cookie_adapter.rb +++ b/lib/split/persistence/cookie_adapter.rb @@ -70,7 +70,8 @@ def delete_cookie_header!(header, key, value) def hash @hash ||= if cookies = @cookies[:split.to_s] begin - JSON.parse(cookies) + parsed = JSON.parse(cookies) + parsed.is_a?(Hash) ? parsed : {} rescue JSON::ParserError {} end diff --git a/spec/persistence/cookie_adapter_spec.rb b/spec/persistence/cookie_adapter_spec.rb index e53dd88f..182d6229 100644 --- a/spec/persistence/cookie_adapter_spec.rb +++ b/spec/persistence/cookie_adapter_spec.rb @@ -14,10 +14,24 @@ end it "handles invalid JSON" do - context.request.cookies[:split] = { - value: '{"foo":2,', - expires: Time.now - } + context.request.cookies["split"] = "{\"foo\":2," + + expect(subject["my_key"]).to be_nil + subject["my_key"] = "my_value" + expect(subject["my_key"]).to eq("my_value") + end + + it "ignores valid JSON of invalid type (integer)" do + context.request.cookies["split"] = "2" + + expect(subject["my_key"]).to be_nil + subject["my_key"] = "my_value" + expect(subject["my_key"]).to eq("my_value") + end + + it "ignores valid JSON of invalid type (array)" do + context.request.cookies["split"] = "[\"foo\", \"bar\"]" + expect(subject["my_key"]).to be_nil subject["my_key"] = "my_value" expect(subject["my_key"]).to eq("my_value")