Skip to content
This repository was archived by the owner on May 21, 2025. It is now read-only.

Commit 4675321

Browse files
Refactor to put all cache into Dns class
1 parent bda32cc commit 4675321

File tree

2 files changed

+31
-32
lines changed

2 files changed

+31
-32
lines changed

lib/valid_email2/address.rb

Lines changed: 1 addition & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -132,24 +132,7 @@ def domain_is_in?(domain_list)
132132
end
133133

134134
def mx_server_is_in?(domain_list)
135-
mx_servers = @dns.mx_servers(address.domain)
136-
137-
cache_key = generate_mx_cache_key(domain_list, mx_servers)
138-
139-
return self.class.cache_mx_server_is_in[cache_key] if !cache_key.nil? && self.class.cache_mx_server_is_in.key?(cache_key)
140-
141-
result = mx_servers.any? do |mx_server|
142-
return false unless mx_server.respond_to?(:exchange)
143-
144-
mx_server = mx_server.exchange.to_s
145-
146-
domain_list.any? do |domain|
147-
mx_server.end_with?(domain) && mx_server =~ /\A(?:.+\.)*?#{domain}\z/
148-
end
149-
end
150-
151-
self.class.cache_mx_server_is_in[cache_key] = result unless cache_key.nil?
152-
result
135+
@dns.mx_servers_disposable?(address.domain, domain_list)
153136
end
154137

155138
def address_contain_multibyte_characters?
@@ -164,18 +147,5 @@ def null_mx?
164147
mx_servers = @dns.mx_servers(address.domain)
165148
mx_servers.length == 1 && mx_servers.first.preference == 0 && mx_servers.first.exchange.length == 0
166149
end
167-
168-
def generate_mx_cache_key(domain_list, mx_servers)
169-
return nil if mx_servers.length == 0 || domain_list.length == 0
170-
171-
mx_servers_str = mx_servers.map(&:exchange).map(&:to_s).sort.join
172-
return address.domain if mx_servers_str == ""
173-
174-
"#{domain_list.object_id}_#{domain_list.length}_#{mx_servers_str.downcase}"
175-
end
176-
177-
def self.cache_mx_server_is_in
178-
@cache_mx_server_is_in
179-
end
180150
end
181151
end

lib/valid_email2/dns.rb

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ module ValidEmail2
44
class Dns
55
MAX_CACHE_SIZE = 1_000
66
CACHE = {}
7-
7+
MX_SERVERS_CACHE = {}
88
CacheEntry = Struct.new(:records, :cached_at, :ttl)
99

1010
def self.prune_cache
@@ -26,6 +26,26 @@ def mx_servers(domain)
2626
fetch(domain, Resolv::DNS::Resource::IN::MX)
2727
end
2828

29+
def mx_servers_disposable?(domain, domain_list)
30+
servers = mx_servers(domain)
31+
cache_key = generate_mx_cache_key(domain, domain_list, servers)
32+
return MX_SERVERS_CACHE[cache_key] if !cache_key.nil? && MX_SERVERS_CACHE.key?(cache_key)
33+
34+
result = servers.any? do |mx_server|
35+
return false unless mx_server.respond_to?(:exchange)
36+
37+
mx_server = mx_server.exchange.to_s
38+
39+
domain_list.any? do |disposable_domain|
40+
mx_server.end_with?(disposable_domain) && mx_server =~ /\A(?:.+\.)*?#{disposable_domain}\z/
41+
end
42+
end
43+
44+
MX_SERVERS_CACHE[cache_key] = result unless cache_key.nil?
45+
46+
result
47+
end
48+
2949
def a_servers(domain)
3050
fetch(domain, Resolv::DNS::Resource::IN::A)
3151
end
@@ -67,5 +87,14 @@ def resolv_config
6787
config[:nameserver] = @dns_nameserver if @dns_nameserver
6888
config
6989
end
90+
91+
def generate_mx_cache_key(domain, domain_list, mx_servers)
92+
return nil if mx_servers.empty? || domain_list.empty?
93+
94+
mx_servers_str = mx_servers.map(&:exchange).map(&:to_s).sort.join
95+
return domain if mx_servers_str == ""
96+
97+
"#{domain_list.object_id}_#{domain_list.length}_#{mx_servers_str.downcase}"
98+
end
7099
end
71100
end

0 commit comments

Comments
 (0)