]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
code cleanup
authorslowr <jim.mavrommatis@gmail.com>
Tue, 8 Jun 2021 15:50:24 +0000 (17:50 +0200)
committerslowr <jim.mavrommatis@gmail.com>
Tue, 8 Jun 2021 15:50:24 +0000 (17:50 +0200)
pdns/dnsdistdist/dnsdist-tcp-downstream.cc
pdns/dnsdistdist/dnsdist-tcp-downstream.hh
pdns/dnsdistdist/dnsdist-tcp-upstream.hh

index f6163439aee2484dec6044f2580d994c8ae6d010..cb76fa6fa17e6dc7a69dc6f6ec5696a2f1164c59 100644 (file)
@@ -483,49 +483,8 @@ IOState TCPConnectionToBackend::handleResponse(std::shared_ptr<TCPConnectionToBa
     TCPResponse response;
     response.d_buffer = std::move(d_responseBuffer);
     response.d_connection = conn;
-    try {
-      MOADNSParser parser(true, reinterpret_cast<const char*>(response.d_buffer.data()), response.d_buffer.size());
-      if (parser.d_header.rcode != 0U) {
-        done = true;
-      }
-      else {
-        for (const auto& record : parser.d_answers) {
-          if (record.first.d_class != QClass::IN ||
-              record.first.d_type != QType::SOA) {
-            continue;
-          }
 
-          auto unknownContent = getRR<UnknownRecordContent>(record.first);
-          if (!unknownContent) {
-            continue;
-          }
-          auto raw = unknownContent->getRawContent();
-          auto serial = getSerialFromRawSOAContent(raw);
-
-          ++d_clientConn->d_xfrSerialCount;
-          if (d_clientConn->d_xfrMasterSerial == 0) {
-            // store the first SOA in our client's connection metadata
-            ++d_clientConn->d_xfrMasterSerialCount;
-            d_clientConn->d_xfrMasterSerial = serial;
-          } else if (d_clientConn->d_xfrMasterSerial == serial) {
-            ++d_clientConn->d_xfrMasterSerialCount;
-            // figure out if it's end when receiving master's SOA again
-            if (d_clientConn->d_xfrSerialCount == 2) {
-              // if there are only two SOA records marks a finished AXFR
-              done = true;
-            }
-            if (d_clientConn->d_xfrMasterSerialCount == 3) {
-              // receiving master's SOA 3 times marks a finished IXFR
-              done = true;
-            }
-          }
-        }
-      }
-    }
-    catch (const MOADNSException& e) {
-      DEBUGLOG("Exception when parsing TCPResponse to DNS: " << e.what());
-      /* ponder what to do here, shall we close the connection? */
-    }
+    done = isXFRFinished(response, clientConn);
 
     clientConn->handleXFRResponse(clientConn, now, std::move(response));
     if (done) {
@@ -632,3 +591,52 @@ bool TCPConnectionToBackend::matchesTLVs(const std::unique_ptr<std::vector<Proxy
 
   return *tlvs == *d_proxyProtocolValuesSent;
 }
+
+bool TCPConnectionToBackend::isXFRFinished(const TCPResponse& response, const shared_ptr<IncomingTCPConnectionState>& clientConn)
+{
+  bool done = false;
+  try {
+    MOADNSParser parser(true, reinterpret_cast<const char*>(response.d_buffer.data()), response.d_buffer.size());
+    if (parser.d_header.rcode != 0U) {
+      done = true;
+    }
+    else {
+      for (const auto& record : parser.d_answers) {
+        if (record.first.d_class != QClass::IN || record.first.d_type != QType::SOA) {
+          continue;
+        }
+
+        auto unknownContent = getRR<UnknownRecordContent>(record.first);
+        if (!unknownContent) {
+          continue;
+        }
+        auto raw = unknownContent->getRawContent();
+        auto serial = getSerialFromRawSOAContent(raw);
+
+        ++clientConn->d_xfrSerialCount;
+        if (clientConn->d_xfrMasterSerial == 0) {
+          // store the first SOA in our client's connection metadata
+          ++clientConn->d_xfrMasterSerialCount;
+          clientConn->d_xfrMasterSerial = serial;
+        }
+        else if (clientConn->d_xfrMasterSerial == serial) {
+          ++clientConn->d_xfrMasterSerialCount;
+          // figure out if it's end when receiving master's SOA again
+          if (clientConn->d_xfrSerialCount == 2) {
+            // if there are only two SOA records marks a finished AXFR
+            done = true;
+          }
+          if (clientConn->d_xfrMasterSerialCount == 3) {
+            // receiving master's SOA 3 times marks a finished IXFR
+            done = true;
+          }
+        }
+      }
+    }
+  }
+  catch (const MOADNSException& e) {
+    DEBUGLOG("Exception when parsing TCPResponse to DNS: " << e.what());
+    /* ponder what to do here, shall we close the connection? */
+  }
+  return done;
+}
index 61a03979239d49540153cf97914f2c9def992654..f9d26e51800a6e64fbed8a1b0deda846827428bb 100644 (file)
@@ -191,6 +191,7 @@ private:
   static void handleIOCallback(int fd, FDMultiplexer::funcparam_t& param);
   static IOState queueNextQuery(std::shared_ptr<TCPConnectionToBackend>& conn);
   static IOState sendQuery(std::shared_ptr<TCPConnectionToBackend>& conn, const struct timeval& now);
+  static bool isXFRFinished(const TCPResponse& response, const shared_ptr<IncomingTCPConnectionState>& clientConn);
 
   IOState handleResponse(std::shared_ptr<TCPConnectionToBackend>& conn, const struct timeval& now);
   uint16_t getQueryIdFromResponse();
index b54b3eb630a540b31b0466bba89ed4af5f4a6e69..6ab94f028fc51901f2dde59591f97b0d78b8e563 100644 (file)
@@ -203,13 +203,13 @@ public:
   size_t d_proxyProtocolNeed{0};
   size_t d_queriesCount{0};
   size_t d_currentQueriesCount{0};
+  uint32_t d_xfrMasterSerial{0};
+  uint32_t d_xfrSerialCount{0};
+  uint8_t d_xfrMasterSerialCount{0};
   uint16_t d_querySize{0};
   State d_state{State::doingHandshake};
   bool d_isXFR{false};
   bool d_proxyProtocolPayloadHasTLV{false};
   bool d_lastIOBlocked{false};
   bool d_hadErrors{false};
-  uint32_t d_xfrMasterSerial{0};
-  uint32_t d_xfrSerialCount{0};
-  uint8_t d_xfrMasterSerialCount{0};
 };