From a6b328f12a1f0962bf7841e496cf8494ed68e71f Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Tue, 18 Mar 2014 23:51:23 +0200 Subject: [PATCH] THRIFT-2354 Connection errors can lead to case_clause exceptions Patch: Anthony Molinaro --- lib/erl/src/thrift_binary_protocol.erl | 14 +++++++++----- lib/erl/src/thrift_client.erl | 25 ++++++++++++++----------- lib/erl/src/thrift_client_util.erl | 9 ++++++--- 3 files changed, 29 insertions(+), 19 deletions(-) diff --git a/lib/erl/src/thrift_binary_protocol.erl b/lib/erl/src/thrift_binary_protocol.erl index 800fd8ea..85abb62d 100644 --- a/lib/erl/src/thrift_binary_protocol.erl +++ b/lib/erl/src/thrift_binary_protocol.erl @@ -333,11 +333,15 @@ parse_factory_options([{strict_write, Bool} | Rest], Opts) when is_boolean(Bool) new_protocol_factory(TransportFactory, Options) -> ParsedOpts = parse_factory_options(Options, #tbp_opts{}), F = fun() -> - {ok, Transport} = TransportFactory(), - thrift_binary_protocol:new( - Transport, - [{strict_read, ParsedOpts#tbp_opts.strict_read}, - {strict_write, ParsedOpts#tbp_opts.strict_write}]) + case TransportFactory() of + {ok, Transport} -> + thrift_binary_protocol:new( + Transport, + [{strict_read, ParsedOpts#tbp_opts.strict_read}, + {strict_write, ParsedOpts#tbp_opts.strict_write}]); + {error, Error} -> + {error, Error} + end end, {ok, F}. diff --git a/lib/erl/src/thrift_client.erl b/lib/erl/src/thrift_client.erl index 5c74adc7..c91c3ea7 100644 --- a/lib/erl/src/thrift_client.erl +++ b/lib/erl/src/thrift_client.erl @@ -96,17 +96,20 @@ read_result(Client = #tclient{protocol = Proto0, seqid = SeqId}, Function, ReplyType) -> - {Proto1, MessageBegin} = thrift_protocol:read(Proto0, message_begin), - NewClient = Client#tclient{protocol = Proto1}, - case MessageBegin of - #protocol_message_begin{seqid = RetSeqId} when RetSeqId =/= SeqId -> - {NewClient, {error, {bad_seq_id, SeqId}}}; - - #protocol_message_begin{type = ?tMessageType_EXCEPTION} -> - handle_application_exception(NewClient); - - #protocol_message_begin{type = ?tMessageType_REPLY} -> - handle_reply(NewClient, Function, ReplyType) + case thrift_protocol:read(Proto0, message_begin) of + {Proto1, {error, Reason}} -> + NewClient = Client#tclient{protocol = Proto1}, + {NewClient, {error, Reason}}; + {Proto1, MessageBegin} -> + NewClient = Client#tclient{protocol = Proto1}, + case MessageBegin of + #protocol_message_begin{seqid = RetSeqId} when RetSeqId =/= SeqId -> + {NewClient, {error, {bad_seq_id, SeqId}}}; + #protocol_message_begin{type = ?tMessageType_EXCEPTION} -> + handle_application_exception(NewClient); + #protocol_message_begin{type = ?tMessageType_REPLY} -> + handle_reply(NewClient, Function, ReplyType) + end end. diff --git a/lib/erl/src/thrift_client_util.erl b/lib/erl/src/thrift_client_util.erl index c52bb8b6..02368bf0 100644 --- a/lib/erl/src/thrift_client_util.erl +++ b/lib/erl/src/thrift_client_util.erl @@ -56,6 +56,9 @@ new(Host, Port, Service, Options) {ok, ProtocolFactory} = thrift_binary_protocol:new_protocol_factory( TransportFactory, ProtoOpts), - {ok, Protocol} = ProtocolFactory(), - - thrift_client:new(Protocol, Service). + case ProtocolFactory() of + {ok, Protocol} -> + thrift_client:new(Protocol, Service); + {error, Error} -> + {error, Error} + end. -- 2.17.1