THRIFT-3335 Ruby server does not handle processor exception
Client: Ruby
Patch: Nobuaki Sukegawa <nsukeg@gmail.com>
This closes #612
diff --git a/lib/rb/lib/thrift/processor.rb b/lib/rb/lib/thrift/processor.rb
index 5d9e0a1..b96fb43 100644
--- a/lib/rb/lib/thrift/processor.rb
+++ b/lib/rb/lib/thrift/processor.rb
@@ -26,16 +26,18 @@
def process(iprot, oprot)
name, type, seqid = iprot.read_message_begin
if respond_to?("process_#{name}")
- send("process_#{name}", seqid, iprot, oprot)
+ begin
+ send("process_#{name}", seqid, iprot, oprot)
+ rescue => e
+ x = ApplicationException.new(ApplicationException::INTERNAL_ERROR, 'Internal error')
+ write_error(x, oprot, name, seqid)
+ end
true
else
iprot.skip(Types::STRUCT)
iprot.read_message_end
x = ApplicationException.new(ApplicationException::UNKNOWN_METHOD, 'Unknown function '+name)
- oprot.write_message_begin(name, MessageTypes::EXCEPTION, seqid)
- x.write(oprot)
- oprot.write_message_end
- oprot.trans.flush
+ write_error(x, oprot, name, seqid)
false
end
end
@@ -53,5 +55,14 @@
oprot.write_message_end
oprot.trans.flush
end
+
+ def write_error(err, oprot, name, seqid)
+ p 'write_error'
+ oprot.write_message_begin(name, MessageTypes::EXCEPTION, seqid)
+ err.write(oprot)
+ oprot.write_message_end
+ oprot.trans.flush
+ p 'write_error end'
+ end
end
end