aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBadlop <badlop@process-one.net>2010-10-14 21:15:40 +0200
committerBadlop <badlop@process-one.net>2010-10-14 21:15:40 +0200
commita5230c46c2e9e2141cbec9b3c0a5493e41739346 (patch)
tree5dad7837eb883439b641adfc2d2322e34d697cf6
parentInclude a gitignore file in the ejabberd git repository (EJAB-1312) (diff)
Speed up ejabberd_s2s:is_service/2, allow_host/2 (thanks to Andreas Köhler)(EJAB-1319)
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.
-rw-r--r--src/ejabberd_s2s.erl36
1 files changed, 18 insertions, 18 deletions
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);
[] ->