@@ -513,27 +513,28 @@ def each_resource(name, typeclass, &proc)
513
513
514
514
def fetch_resource ( name , typeclass )
515
515
lazy_initialize
516
- protocols = { }
516
+ truncated = { }
517
517
requesters = { }
518
+ udp_requester = begin
519
+ make_udp_requester
520
+ rescue Errno ::EACCES
521
+ # fall back to TCP
522
+ end
518
523
senders = { }
524
+
519
525
begin
520
526
@config . resolv ( name ) do |candidate , tout , nameserver , port |
521
527
msg = Message . new
522
528
msg . rd = 1
523
529
msg . add_question ( candidate , typeclass )
524
530
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 )
536
536
end
537
+ end
537
538
538
539
unless sender = senders [ [ candidate , requester , nameserver , port ] ]
539
540
sender = requester . sender ( msg , candidate , nameserver , port )
@@ -544,9 +545,8 @@ def fetch_resource(name, typeclass)
544
545
case reply . rcode
545
546
when RCode ::NoError
546
547
if reply . tc == 1 and not Requester ::TCP === requester
547
- requester . close
548
548
# Retry via TCP:
549
- protocols [ candidate ] = :tcp
549
+ truncated [ candidate ] = true
550
550
redo
551
551
else
552
552
yield ( reply , reply_name )
@@ -559,6 +559,7 @@ def fetch_resource(name, typeclass)
559
559
end
560
560
end
561
561
ensure
562
+ udp_requester &.close
562
563
requesters . each_value { |requester | requester &.close }
563
564
end
564
565
end
0 commit comments