summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzeshuai007 <51382517@qq.com>2020-11-07 15:45:11 +0800
committerJens Geyer <Jens-G@users.noreply.github.com>2022-10-25 22:42:09 +0200
commit5ef174b5c1ab1ddd32f430ccacbad6d94e8dc452 (patch)
tree1c96014046608da926ace02d37fe4b1c9337716f
parent22aa3e52860fb7c2248af99715b9235ca4723af0 (diff)
downloadthrift-5ef174b5c1ab1ddd32f430ccacbad6d94e8dc452.tar.gz
Implement Validate message reply seq ids
-rw-r--r--compiler/cpp/src/thrift/generate/t_rb_generator.cc7
-rw-r--r--lib/rb/lib/thrift/client.rb12
-rw-r--r--lib/rb/spec/client_spec.rb4
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("#<MockClass:mock>")
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