Current section

Files

Jump to
erldns src erldns_edns.erl
Raw

src/erldns_edns.erl

-module(erldns_edns).
-moduledoc false.
-include_lib("dns_erlang/include/dns_records.hrl").
-export([get_opts/1, get_ede_errors/1]).
%% Get a property list of EDNS0 options.
%%
%% Supported options are:
%%
%% * {dnssec, true}
-spec get_opts(dns:message()) -> [proplists:property()].
get_opts(Message) ->
get_opts(Message#dns_message.additional, []).
-spec get_opts([dns:rr() | dns:optrr()], [proplists:property()]) -> [proplists:property()].
get_opts([#dns_optrr{dnssec = true} | Rest], Opts) ->
get_opts(Rest, [{dnssec, true} | Opts]);
get_opts([_RR | Rest], Opts) ->
get_opts(Rest, Opts);
get_opts([], Opts) ->
lists:reverse(Opts).
%% Extract Extended DNS Errors from a message.
%%
%% Returns a list of {InfoCode, ExtraText} tuples for all EDE options
%% found in the message's OPT RR.
-spec get_ede_errors(dns:message()) -> [{non_neg_integer(), binary()}].
get_ede_errors(Message) ->
get_ede_errors(Message#dns_message.additional, []).
-spec get_ede_errors([dns:rr() | dns:optrr()], [{non_neg_integer(), binary()}]) ->
[{non_neg_integer(), binary()}].
get_ede_errors([#dns_optrr{data = Data} | Rest], Acc) ->
EDEList = [
{InfoCode, ExtraText}
|| #dns_opt_ede{info_code = InfoCode, extra_text = ExtraText} <- Data
],
get_ede_errors(Rest, EDEList ++ Acc);
get_ede_errors([_RR | Rest], Acc) ->
get_ede_errors(Rest, Acc);
get_ede_errors([], Acc) ->
lists:reverse(Acc).