From a5230c46c2e9e2141cbec9b3c0a5493e41739346 Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 14 Oct 2010 21:15:40 +0200 Subject: =?UTF-8?q?Speed=20up=20ejabberd=5Fs2s:is=5Fservice/2,=20allow=5Fh?= =?UTF-8?q?ost/2=20(thanks=20to=20Andreas=20K=C3=B6hler)(EJAB-1319)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Iterating through the list of possible parent domains of a given domain and comparing with the list of hosts or routes is almost always faster than doing it the other way around. It naturally returns the shortest or longest parent domain satisfying a predicate, whereas the possibly long list compared with would need to be sorted by length first. --- src/ejabberd_s2s.erl | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) (limited to 'src') diff --git a/src/ejabberd_s2s.erl b/src/ejabberd_s2s.erl index 8ab520f56..4d32ef66d 100644 --- a/src/ejabberd_s2s.erl +++ b/src/ejabberd_s2s.erl @@ -408,22 +408,21 @@ needed_connections_number(Ls, MaxS2SConnectionsNumber, is_service(From, To) -> LFromDomain = From#jid.lserver, case ejabberd_config:get_local_option({route_subdomains, LFromDomain}) of - s2s -> % bypass RFC 3920 10.3 - false; - _ -> - LDstDomain = To#jid.lserver, - P = fun(Domain) -> is_subdomain(LDstDomain, Domain) end, - lists:any(P, ?MYHOSTS) + s2s -> % bypass RFC 3920 10.3 + false; + _ -> + Hosts = ?MYHOSTS, + P = fun(ParentDomain) -> lists:member(ParentDomain, Hosts) end, + lists:any(P, parent_domains(To#jid.lserver)) end. -%%-------------------------------------------------------------------- -%% Function: is_subdomain(Domain1, Domain2) -> true | false -%% Description: Return true if Domain1 (a string representing an -%% internet domain name) is a subdomain (or the same domain) of -%% Domain2 -%% -------------------------------------------------------------------- -is_subdomain(Domain1, Domain2) -> - lists:suffix(string:tokens(Domain2, "."), string:tokens(Domain1, ".")). +parent_domains(Domain) -> + lists:foldl( + fun(Label, []) -> + [Label]; + (Label, [Head | Tail]) -> + [Label ++ "." ++ Head, Head | Tail] + end, [], lists:reverse(string:tokens(Domain, "."))). send_element(Pid, El) -> Pid ! {send_element, El}. @@ -486,10 +485,11 @@ update_tables() -> %% Check if host is in blacklist or white list allow_host(MyServer, S2SHost) -> - case lists:filter( - fun(Host) -> - is_subdomain(MyServer, Host) - end, ?MYHOSTS) of + Hosts = ?MYHOSTS, + case lists:dropwhile( + fun(ParentDomain) -> + not lists:member(ParentDomain, Hosts) + end, parent_domains(MyServer)) of [MyHost|_] -> allow_host1(MyHost, S2SHost); [] -> -- cgit v1.2.3