]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dns: Get rid of the ugly special case for OpCode 3 15881/head
authorRemi Gacogne <remi.gacogne@powerdns.com>
Thu, 24 Jul 2025 09:11:24 +0000 (11:11 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Mon, 28 Jul 2025 09:34:05 +0000 (11:34 +0200)
As suggested by Miod.

Signed-off-by: Remi Gacogne <remi.gacogne@powerdns.com>
pdns/dns.cc
pdns/test-dns_cc.cc

index df35dfa77f839390ab16f783f4bef1c775746f6d..8f11a378bd766560aa319a02705a6c13df509cd7 100644 (file)
@@ -136,9 +136,9 @@ std::optional<uint16_t> ERCode::from_short(const std::string_view& ercode_string
 }
 
 std::string Opcode::to_s(uint8_t opcode) {
-  static const std::array<std::string, 6> s_opcodes = { "Query", "IQuery", "Status", "3", "Notify", "Update" };
+  static const std::array<std::string, 6> s_opcodes = { "Query", "IQuery", "Status", "", "Notify", "Update" };
 
-  if (opcode >= s_opcodes.size()) {
+  if (opcode >= s_opcodes.size() || s_opcodes.at(opcode).empty()) {
     return std::to_string(opcode);
   }
 
@@ -147,9 +147,9 @@ std::string Opcode::to_s(uint8_t opcode) {
 
 std::optional<uint8_t> Opcode::from_lowercase_string(const std::string_view& opcode_string)
 {
-  static const std::array<std::string, 6> s_opcodes = { "query", "iquery", "status", "3", "notify", "update" };
+  static const std::array<std::string, 6> s_opcodes = { "query", "iquery", "status", "", "notify", "update" };
   const auto* position = std::find(s_opcodes.begin(), s_opcodes.end(), opcode_string);
-  if (position == s_opcodes.end()) {
+  if (position == s_opcodes.end() || position->empty()) {
     return std::nullopt;
   }
   return std::distance(s_opcodes.begin(), position);
index 9eedc8c0dd609b842cfe728acfccd67baf339752..6f03e6186875eb107a67aae08b407fe171486914 100644 (file)
@@ -71,8 +71,14 @@ BOOST_AUTO_TEST_CASE(test_opcode)
     BOOST_CHECK(long_s.size() > 0);
     boost::to_lower(long_s);
     auto opcode = Opcode::from_lowercase_string(long_s);
-    BOOST_CHECK(opcode);
-    BOOST_CHECK_EQUAL(*opcode, idx);
+    if (idx != 3) {
+      BOOST_CHECK(opcode);
+      BOOST_CHECK_EQUAL(*opcode, idx);
+    }
+    else {
+      BOOST_CHECK_EQUAL(long_s, "3");
+      BOOST_CHECK(!opcode);
+    }
   }
 
   BOOST_CHECK_EQUAL(Opcode::to_s(Opcode::Update + 1), std::to_string(Opcode::Update + 1));