thread_local LocalStateHolder<vector<DNSDistResponseRuleAction>> localRespRuleActions = g_respruleactions.getLocal();
DNSResponse dr = makeDNSResponseFromIDState(ids, response.d_buffer);
if (response.d_buffer.size() > d_payloadSize) {
+ vinfolog("Got a response of size %d over TCP, while the initial UDP payload size was %d, truncating", response.d_buffer.size(), d_payloadSize);
truncateTC(dr.getMutableData(), dr.getMaximumSize(), dr.qname->wirelength());
dr.getHeader()->tc = true;
}
{
uint16_t z = 0;
getEDNSUDPPayloadSizeAndZ(reinterpret_cast<const char*>(buffer.data()), buffer.size(), &d_payloadSize, &z);
+ if (d_payloadSize < 512) {
+ d_payloadSize = 512;
+ }
query = InternalQuery(std::move(buffer), std::move(ids));
downstream = ds;
proxyProtocolPayloadSize = 0;
--- /dev/null
+#!/usr/bin/env python
+import dns
+
+from dnsdisttests import DNSDistTest
+
+class TestTCPOnly(DNSDistTest):
+
+ _config_template = """
+ newServer{address="127.0.0.1:%s", tcpOnly=true}
+ """
+
+ def testUDP(self):
+ """
+ TCP Only: UDP query is sent via TCP
+ """
+ name = 'udp.tcp-only.test.powerdns.com.'
+ query = dns.message.make_query(name, 'A', 'IN')
+ expectedResponse = dns.message.make_response(query)
+ rrset = dns.rrset.from_text(name,
+ 60,
+ dns.rdataclass.IN,
+ dns.rdatatype.A,
+ '127.0.0.1')
+ expectedResponse.answer.append(rrset)
+
+ (receivedQuery, receivedResponse) = self.sendUDPQuery(query, expectedResponse)
+ self.assertEqual(query, receivedQuery)
+ self.assertEqual(receivedResponse, expectedResponse)
+
+ if 'UDP Responder' in self._responsesCounter:
+ self.assertEqual(self._responsesCounter['UDP Responder'], 0)
+ if 'TCP Responder' in self._responsesCounter:
+ self.assertEqual(self._responsesCounter['TCP Responder'], 1)
+
+ def testTCP(self):
+ """
+ TCP Only: TCP query is sent via TCP
+ """
+ name = 'tcp.tcp-only.test.powerdns.com.'
+ query = dns.message.make_query(name, 'A', 'IN')
+ expectedResponse = dns.message.make_response(query)
+ rrset = dns.rrset.from_text(name,
+ 60,
+ dns.rdataclass.IN,
+ dns.rdatatype.A,
+ '127.0.0.1')
+ expectedResponse.answer.append(rrset)
+
+ (receivedQuery, receivedResponse) = self.sendTCPQuery(query, expectedResponse)
+ self.assertEqual(query, receivedQuery)
+ self.assertEqual(receivedResponse, expectedResponse)
+ if 'UDP Responder' in self._responsesCounter:
+ self.assertEqual(self._responsesCounter['UDP Responder'], 0)
+ if 'TCP Responder' in self._responsesCounter:
+ self.assertEqual(self._responsesCounter['TCP Responder'], 1)