ruby-changes:17623
From: akr <ko1@a...>
Date: Sat, 30 Oct 2010 06:02:05 +0900 (JST)
Subject: [ruby-changes:17623] Ruby:r29631 (trunk): * lib/resolv.rb: retry via TCP if UDP reply is truncated.
akr 2010-10-30 06:01:53 +0900 (Sat, 30 Oct 2010) New Revision: 29631 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=29631 Log: * lib/resolv.rb: retry via TCP if UDP reply is truncated. fixed by Julian Mehnle. [ruby-core:32407] Modified files: trunk/ChangeLog trunk/lib/resolv.rb Index: ChangeLog =================================================================== --- ChangeLog (revision 29630) +++ ChangeLog (revision 29631) @@ -1,3 +1,8 @@ +Sat Oct 30 05:58:54 2010 Tanaka Akira <akr@f...> + + * lib/resolv.rb: retry via TCP if UDP reply is truncated. + fixed by Julian Mehnle. [ruby-core:32407] + Sat Oct 30 00:35:13 2010 Koichi Sasada <ko1@a...> * iseq.c (iseq_s_compile): fix optional argument. Index: lib/resolv.rb =================================================================== --- lib/resolv.rb (revision 29630) +++ lib/resolv.rb (revision 29631) @@ -492,7 +492,7 @@ def each_resource(name, typeclass, &proc) lazy_initialize - requester = make_requester + requester = make_udp_requester senders = {} begin @config.resolv(name) {|candidate, tout, nameserver, port| @@ -506,7 +506,19 @@ reply, reply_name = requester.request(sender, tout) case reply.rcode when RCode::NoError - extract_resources(reply, reply_name, typeclass, &proc) + if reply.tc == 1 and not Requester::TCP === requester + requester.close + # Retry via TCP: + requester = make_tcp_requester + senders = {} + # This will use TCP for all remaining candidates (assuming the + # current candidate does not already respond successfully via + # TCP). This makes sense because we already know the full + # response will not fit in an untruncated UDP packet. + redo + else + extract_resources(reply, reply_name, typeclass, &proc) + end return when RCode::NXDomain raise Config::NXDomain.new(reply_name.to_s) @@ -519,7 +531,7 @@ end end - def make_requester # :nodoc: + def make_udp_requester # :nodoc: nameserver_port = @config.nameserver_port if nameserver_port.length == 1 Requester::ConnectedUDP.new(*nameserver_port[0]) @@ -528,6 +540,11 @@ end end + def make_tcp_requester # :nodoc: + nameserver_port = @config.nameserver_port + return Requester::TCP.new(*nameserver_port[0]) + end + def extract_resources(msg, name, typeclass) # :nodoc: if typeclass < Resource::ANY n0 = Name.create(name) -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/