From 5ef174b5c1ab1ddd32f430ccacbad6d94e8dc452 Mon Sep 17 00:00:00 2001 From: zeshuai007 <51382517@qq.com> Date: Sat, 7 Nov 2020 15:45:11 +0800 Subject: Implement Validate message reply seq ids --- compiler/cpp/src/thrift/generate/t_rb_generator.cc | 7 ++++++- lib/rb/lib/thrift/client.rb | 12 ++++++++++-- lib/rb/spec/client_spec.rb | 4 +++- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/compiler/cpp/src/thrift/generate/t_rb_generator.cc b/compiler/cpp/src/thrift/generate/t_rb_generator.cc index 90dbfe5d7..17e57cf95 100644 --- a/compiler/cpp/src/thrift/generate/t_rb_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_rb_generator.cc @@ -944,7 +944,12 @@ void t_rb_generator::generate_service_client(t_service* tservice) { f_service_.indent() << "def " << function_signature(&recv_function) << endl; f_service_.indent_up(); - // TODO(mcslee): Validate message reply here, seq ids etc. + f_service_.indent() << "fname, mtype, rseqid = receive_message_begin()" << endl; + f_service_.indent() << "handle_exception(mtype)" << endl; + + f_service_.indent() << "if reply_seqid(rseqid)==false" << endl; + f_service_.indent() << " raise \"seqid reply faild\"" << endl; + f_service_.indent() << "end" << endl; f_service_.indent() << "result = receive_message(" << resultname << ")" << endl; diff --git a/lib/rb/lib/thrift/client.rb b/lib/rb/lib/thrift/client.rb index 64ef05956..5c7cd987e 100644 --- a/lib/rb/lib/thrift/client.rb +++ b/lib/rb/lib/thrift/client.rb @@ -50,9 +50,17 @@ module Thrift @oprot.trans.flush end - def receive_message(result_klass) + def receive_message_begin() fname, mtype, rseqid = @iprot.read_message_begin - handle_exception(mtype) + [fname, mtype, rseqid] + end + + def reply_seqid(rseqid) + result = (rseqid==@seqid)?true:false + result + end + + def receive_message(result_klass) result = result_klass.new result.read(@iprot) @iprot.read_message_end diff --git a/lib/rb/spec/client_spec.rb b/lib/rb/spec/client_spec.rb index d5d4ceedb..f015d666e 100644 --- a/lib/rb/spec/client_spec.rb +++ b/lib/rb/spec/client_spec.rb @@ -69,6 +69,7 @@ describe 'Client' do expect(@prot).to receive(:read_message_end) mock_klass = double("#") expect(mock_klass).to receive(:read).with(@prot) + @client.receive_message_begin() @client.receive_message(double("MockClass", :new => mock_klass)) end @@ -80,7 +81,8 @@ describe 'Client' do expect(mock_exc).to receive(:read).with(@prot) end end - expect { @client.receive_message(nil) }.to raise_error(StandardError) + fname, mtype, sqeid = @client.receive_message_begin() + expect { @client.handle_exception(mtype) }.to raise_error(StandardError) end it "should close the transport if an error occurs while sending a message" do -- cgit v1.2.1