[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]