From bd0fb6a7ede5ac1f911df95a6778ef018f505d00 Mon Sep 17 00:00:00 2001 From: Thomas Walpole Date: Tue, 8 Mar 2016 09:12:30 -0800 Subject: [PATCH] Don't mutate string in quote_phrase --- lib/mail/utilities.rb | 10 ++++------ spec/mail/utilities_spec.rb | 21 +++++++++++++-------- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/lib/mail/utilities.rb b/lib/mail/utilities.rb index 01a0e625d..87ba2c882 100644 --- a/lib/mail/utilities.rb +++ b/lib/mail/utilities.rb @@ -24,13 +24,11 @@ def quote_atom( str ) def quote_phrase( str ) if RUBY_VERSION >= '1.9' original_encoding = str.encoding - str.force_encoding('ASCII-8BIT') - if (PHRASE_UNSAFE === str) - quoted_str = dquote(str).force_encoding(original_encoding) - str.force_encoding(original_encoding) - quoted_str + ascii_str = str.dup.force_encoding('ASCII-8BIT') + if (PHRASE_UNSAFE === ascii_str) + dquote(ascii_str).force_encoding(original_encoding) else - str.force_encoding(original_encoding) + str end else (PHRASE_UNSAFE === str) ? dquote(str) : str diff --git a/spec/mail/utilities_spec.rb b/spec/mail/utilities_spec.rb index 74038f59f..a1360f178 100644 --- a/spec/mail/utilities_spec.rb +++ b/spec/mail/utilities_spec.rb @@ -84,27 +84,32 @@ end - if RUBY_VERSION >= '1.9' - describe "quoting phrases" do + describe "quoting phrases" do + it "doesn't mutate original string" do + input_str = "blargh".freeze + expect { quote_phrase(input_str) }.not_to raise_error + end + + if RUBY_VERSION >= '1.9' describe "given a non-unsafe string" do it "should not change the encoding" do - input_str = String.new("blargh") + input_str = "blargh" input_str_encoding = input_str.encoding - quote_phrase(input_str) + result = quote_phrase(input_str) - expect(input_str.encoding).to eq input_str_encoding + expect(result.encoding).to eq input_str_encoding end end describe "given an unsafe string" do it "should not change the encoding" do - input_str = String.new("Bjørn") + input_str = "Bjørn" input_str_encoding = input_str.encoding - quote_phrase(input_str) + result = quote_phrase(input_str) - expect(input_str.encoding).to eq input_str_encoding + expect(result.encoding).to eq input_str_encoding end end end