[erlang-questions] Why netconf_client:get_result Timeout value is not used in its xmerl contiuation_fun?

Tien Le letien83@REDACTED
Mon Oct 28 18:37:57 CET 2013


Hi,

In the netconf_client.erl code, The user-defined "Timeout" is passed down
until it is used in "receive ... after Timeout" expression in
netconf_transport:receive_data/2

However during the XML processing step, the continuation_fun called cont/3
uses netconf_transport:receive_data/1 once again, but with "receive ...
after infinity"

Does it mean that the Timeout which user has entered is not used in the
continuation_fun? What happens if the netconf_transport:receive_data/1
takes longer than the "Timeout"?

Here is the code snippet:

%%%%%%%%%%%%% netconf_client.erl %%%%%%%%%%%%%

get_result(Connection, Timeout) ->
    case *netconf_transport:receive_data(Connection, Timeout)* of
    {ok, Data} ->
        case to_simple_xml(Data, Connection) of
        {'rpc-reply',_Attrs,Result} ->
            Result;
        {'nc:rpc-reply',_Attrs,Result} ->
            Result;
        OtherReply ->
            OtherReply
        end;
    {error, Reason} ->
        {error, Reason}
    end.

to_simple_xml(Bin, Connection) when is_binary(Bin) ->
    {SimpleXml,_Rest} = xmerl_scan:string("",
                    [{*continuation_fun, fun cont/3,*
                      {Bin, false, Connection}},
                     {acc_fun,fun acc_simple_xml/3},
                     {space,normalize},
                     {hook_fun, fun hook_simple_xml/2}]),
    SimpleXml.

cont(Continue, Exception, GlobalState) ->
    {OldTail, Found, Connection} = xmerl_scan:cont_state(GlobalState),
    if
    Found ->
        Continue(Exception,GlobalState);
    true ->
        case split_at_marker_or_last_whitespace(OldTail) of
        false ->
            *%% Need more data.
            {ok, Data} = netconf_transport:receive_data(Connection),*
            NewGlobalState =
            xmerl_scan:cont_state(
              {<<OldTail/binary,Data/binary>>, false, Connection},
              GlobalState),
            cont(Continue, Exception, NewGlobalState);
        {Marker, NewData, NewTail} ->
            NewGlobalState =
            xmerl_scan:cont_state({NewTail, Marker, Connection},
                          GlobalState),
            netconf_transport:adjust_window(Connection, length(NewData) +
                            case Marker of
                            true ->
                                6;
                            _ ->
                                0
                            end),
            Continue(NewData, NewGlobalState)
        end
    end.

%%%%%%%%%%%%% netconf_transport.erl %%%%%%%%%%%%%
receive_data(Connection) ->
    receive_data(Connection, *infinity*).
receive_data(#connection{transport = ssh}, Timeout) ->
    receive
    {ssh_cm, _Cm, {data, _Ch, _Type, Data}} ->
        {ok, Data};
        {ssh_cm, _Cm, {Closed, _Ch}} when Closed == closed; Closed == eof ->
            exit(closed);
        {'DOWN',_,_,_,_} ->
            exit(normal)
    after *Timeout* ->
        {error, timeout}
    end;
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20131028/bbd0485a/attachment.htm>


More information about the erlang-questions mailing list