From 636b089e8b5de57d4388afa2198a02fd43d0ed15 Mon Sep 17 00:00:00 2001 From: Nobuaki Sukegawa Date: Sat, 10 Oct 2015 01:52:13 +0900 Subject: [PATCH] THRIFT-3374 Ruby TJSONProtocol fails to unescape string values --- lib/rb/lib/thrift/protocol/json_protocol.rb | 2 +- lib/rb/spec/json_protocol_spec.rb | 27 ++++++++++++++++++--- test/rb/integration/TestClient.rb | 11 ++++++++- 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/lib/rb/lib/thrift/protocol/json_protocol.rb b/lib/rb/lib/thrift/protocol/json_protocol.rb index 4d6186c60f5..2b8ac15dfc0 100644 --- a/lib/rb/lib/thrift/protocol/json_protocol.rb +++ b/lib/rb/lib/thrift/protocol/json_protocol.rb @@ -514,7 +514,7 @@ def read_json_string(skipContext = false) # The elements of this array must match up with the sequence of characters in # escape_chars escape_char_vals = [ - '"', '\\', '/', '\b', '\f', '\n', '\r', '\t', + "\"", "\\", "\/", "\b", "\f", "\n", "\r", "\t", ] if !skipContext diff --git a/lib/rb/spec/json_protocol_spec.rb b/lib/rb/spec/json_protocol_spec.rb index 9fb6b7bfdeb..b6b46bff3f4 100644 --- a/lib/rb/spec/json_protocol_spec.rb +++ b/lib/rb/spec/json_protocol_spec.rb @@ -293,15 +293,36 @@ it "should read json escape char" do @trans.write('0054') @prot.read_json_escape_char.should == 'T' + + @trans.write("\"\\\"\"") + @prot.read_json_string(false).should == "\"" + + @trans.write("\"\\\\\"") + @prot.read_json_string(false).should == "\\" + + @trans.write("\"\\/\"") + @prot.read_json_string(false).should == "\/" + + @trans.write("\"\\b\"") + @prot.read_json_string(false).should == "\b" + + @trans.write("\"\\f\"") + @prot.read_json_string(false).should == "\f" + + @trans.write("\"\\n\"") + @prot.read_json_string(false).should == "\n" + + @trans.write("\"\\r\"") + @prot.read_json_string(false).should == "\r" + + @trans.write("\"\\t\"") + @prot.read_json_string(false).should == "\t" end it "should read json string" do @trans.write("\"\\P") expect {@prot.read_json_string(false)}.to raise_error(Thrift::ProtocolException) - @trans.write("\"\\n\"") - @prot.read_json_string(false).should == "\\n" - @trans.write("\"this is a test string\"") @prot.read_json_string.should == "this is a test string" end diff --git a/test/rb/integration/TestClient.rb b/test/rb/integration/TestClient.rb index fb339c438d5..bc5bde993e3 100755 --- a/test/rb/integration/TestClient.rb +++ b/test/rb/integration/TestClient.rb @@ -85,7 +85,16 @@ def test_void def test_string p 'test_string' - assert_equal(@client.testString('string'), 'string') + test_string = + 'quote: \" backslash:' + + ' forwardslash-escaped: \/ ' + + ' backspace: \b formfeed: \f newline: \n return: \r tab: ' + + ' now-all-of-them-together: "\\\/\b\n\r\t' + + ' now-a-bunch-of-junk: !@#$%&()(&%$#{}{}<><><' + + ' char-to-test-json-parsing: ]] \"]] \\" }}}{ [[[ ' + + result_string = @client.testString(test_string) + assert_equal(test_string, result_string.force_encoding(Encoding::UTF_8)) end def test_bool