]> granicus.if.org Git - pdns/commitdiff
Merge pull request #8391 from omoerbeek/rec-out-of-order
authorOtto Moerbeek <otto.moerbeek@open-xchange.com>
Wed, 23 Oct 2019 09:44:10 +0000 (11:44 +0200)
committerGitHub <noreply@github.com>
Wed, 23 Oct 2019 09:44:10 +0000 (11:44 +0200)
rec: Allow multiple simultaneous incoming TCP queries over a connection

1  2 
.circleci/config.yml
build-scripts/travis.sh
pdns/pdns_recursor.cc
pdns/recursordist/docs/settings.rst
pdns/syncres.hh
regression-tests.recursor-dnssec/recursortests.py

Simple merge
Simple merge
Simple merge
Simple merge
diff --cc pdns/syncres.hh
Simple merge
index 970565ad114894eb0799cd10dd746e7abc965a10,4db54049e6fb725a76f8e3c10bf8dd6e2f1474dd..1b2f018aa4c485f2646b725696768861d5e293e1
@@@ -659,9 -692,41 +694,41 @@@ distributor-threads={threads}""".format
              message = dns.message.from_wire(data)
          return message
  
+     @classmethod
+     def sendTCPQueries(cls, queries, timeout=2.0):
+         sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+         if timeout:
+             sock.settimeout(timeout)
+         sock.connect(("127.0.0.1", cls._recursorPort))
+         data = []
+         try:
+             for query in queries:
+                 wire = query.to_wire()
+                 sock.send(struct.pack("!H", len(wire)))
+                 sock.send(wire)
+             for i in range(len(queries)):
+                 try:
+                     datalen = sock.recv(2)
+                     if datalen:
+                         (datalen,) = struct.unpack("!H", datalen)
+                         data.append(sock.recv(datalen))
+                 except socket.timeout as e:
+                     continue
+         except socket.error as e:
+             print("Network error: %s" % (str(e)))
+             data = None
+         finally:
+             sock.close()
+         messages = []
+         for d in data:
+             messages.append(dns.message.from_wire(d))
+         return messages
      def setUp(self):
          # This function is called before every tests
 -        return
 +        super(RecursorTest, self).setUp()
  
      ## Functions for comparisons
      def assertMessageHasFlags(self, msg, flags, ednsflags=[]):