Skip to content

Commit 094e533

Browse files
hanazukimatzbot
authored andcommitted
[ruby/resolv] Reuse open TCP connection
[RFC7766] Section 5 recommends stub resolvers to reuse open TCP connections to a nameserver. [RFC7766]: https://datatracker.ietf.org/doc/html/rfc7766 ruby/resolv@9bf1b08f5c
1 parent 4be9b72 commit 094e533

File tree

1 file changed

+15
-14
lines changed

1 file changed

+15
-14
lines changed

lib/resolv.rb

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -513,27 +513,28 @@ def each_resource(name, typeclass, &proc)
513513

514514
def fetch_resource(name, typeclass)
515515
lazy_initialize
516-
protocols = {}
516+
truncated = {}
517517
requesters = {}
518+
udp_requester = begin
519+
make_udp_requester
520+
rescue Errno::EACCES
521+
# fall back to TCP
522+
end
518523
senders = {}
524+
519525
begin
520526
@config.resolv(name) do |candidate, tout, nameserver, port|
521527
msg = Message.new
522528
msg.rd = 1
523529
msg.add_question(candidate, typeclass)
524530

525-
protocol = protocols[candidate] ||= :udp
526-
requester = requesters[[protocol, nameserver]] ||=
527-
case protocol
528-
when :udp
529-
begin
530-
make_udp_requester
531-
rescue Errno::EACCES
532-
make_tcp_requester(nameserver, port)
533-
end
534-
when :tcp
535-
make_tcp_requester(nameserver, port)
531+
requester = requesters.fetch([nameserver, port]) do
532+
if !truncated[candidate] && udp_requester
533+
udp_requester
534+
else
535+
requesters[[nameserver, port]] = make_tcp_requester(nameserver, port)
536536
end
537+
end
537538

538539
unless sender = senders[[candidate, requester, nameserver, port]]
539540
sender = requester.sender(msg, candidate, nameserver, port)
@@ -544,9 +545,8 @@ def fetch_resource(name, typeclass)
544545
case reply.rcode
545546
when RCode::NoError
546547
if reply.tc == 1 and not Requester::TCP === requester
547-
requester.close
548548
# Retry via TCP:
549-
protocols[candidate] = :tcp
549+
truncated[candidate] = true
550550
redo
551551
else
552552
yield(reply, reply_name)
@@ -559,6 +559,7 @@ def fetch_resource(name, typeclass)
559559
end
560560
end
561561
ensure
562+
udp_requester&.close
562563
requesters.each_value { |requester| requester&.close }
563564
end
564565
end

0 commit comments

Comments
 (0)