From 15fac047e6f34f3abd1ba4fbc3e239fa8be52fcc Mon Sep 17 00:00:00 2001 From: Chris Hofstaedtler Date: Mon, 19 Feb 2018 14:50:00 +0100 Subject: [PATCH] Clean up QTag code --- pdns/dnsdist-lua-actions.cc | 12 ++-- pdns/dnsdist-lua-bindings-dnsquestion.cc | 33 ++++++----- pdns/dnsdist-lua-rules.cc | 8 +-- pdns/dnsdist.hh | 73 +----------------------- 4 files changed, 29 insertions(+), 97 deletions(-) diff --git a/pdns/dnsdist-lua-actions.cc b/pdns/dnsdist-lua-actions.cc index 1dc577821..8d25ae874 100644 --- a/pdns/dnsdist-lua-actions.cc +++ b/pdns/dnsdist-lua-actions.cc @@ -693,16 +693,16 @@ private: class TagAction : public DNSAction { public: - TagAction(const std::string tag, std::string value): d_tag(tag), d_value(value) + TagAction(const std::string tag, const std::string value): d_tag(tag), d_value(value) { } DNSAction::Action operator()(DNSQuestion* dq, string* ruleresult) const override { - if (dq->qTag == nullptr) { + if (!dq->qTag) { dq->qTag = std::make_shared(); } - dq->qTag->add(d_tag, d_value); + dq->qTag->insert({d_tag, d_value}); return Action::None; } @@ -854,16 +854,16 @@ private: class TagResponseAction : public DNSResponseAction { public: - TagResponseAction(const std::string tag, std::string value): d_tag(tag), d_value(value) + TagResponseAction(const std::string tag, const std::string value): d_tag(tag), d_value(value) { } DNSResponseAction::Action operator()(DNSResponse* dr, string* ruleresult) const override { - if (dr->qTag == nullptr) { + if (!dr->qTag) { dr->qTag = std::make_shared(); } - dr->qTag->add(d_tag, d_value); + dr->qTag->insert({d_tag, d_value}); return Action::None; } diff --git a/pdns/dnsdist-lua-bindings-dnsquestion.cc b/pdns/dnsdist-lua-bindings-dnsquestion.cc index dcd47fff2..9c033bbae 100644 --- a/pdns/dnsdist-lua-bindings-dnsquestion.cc +++ b/pdns/dnsdist-lua-bindings-dnsquestion.cc @@ -62,40 +62,39 @@ void setupLuaBindingsDNSQuestion() #endif /* HAVE_NET_SNMP */ }); g_lua.registerFunction("setTag", [](DNSQuestion& dq, const std::string& strLabel, const std::string& strValue) { - if(dq.qTag == nullptr) { dq.qTag = std::make_shared(); } - dq.qTag->add(strLabel, strValue); - + dq.qTag->insert({strLabel, strValue}); }); g_lua.registerFunction>)>("setTagArray", [](DNSQuestion& dq, const vector>&tags) { - - if(dq.qTag == nullptr) { + if (!dq.qTag) { dq.qTag = std::make_shared(); } for (const auto& tag : tags) { - dq.qTag->add(tag.first, tag.second); + dq.qTag->insert({tag.first, tag.second}); } - }); g_lua.registerFunction("getTag", [](const DNSQuestion& dq, const std::string& strLabel) { + if (!dq.qTag) { + return string(); + } std::string strValue; - if(dq.qTag != nullptr) { - strValue = dq.qTag->getMatch(strLabel); + const auto it = dq.qTag->find(strLabel); + if (it == dq.qTag->cend()) { + return string(); } - return strValue; + return it->second; }); - g_lua.registerFunction(DNSQuestion::*)(void)>("getTagArray", [](const DNSQuestion& dq) { - - if(dq.qTag != nullptr) { - return dq.qTag->tagData; - } else { - std::unordered_map XX; - return XX; + g_lua.registerFunction("getTagArray", [](const DNSQuestion& dq) { + if (!dq.qTag) { + QTag empty; + return empty; } + + return *dq.qTag; }); /* LuaWrapper doesn't support inheritance */ diff --git a/pdns/dnsdist-lua-rules.cc b/pdns/dnsdist-lua-rules.cc index 42734bd98..9ae95466d 100644 --- a/pdns/dnsdist-lua-rules.cc +++ b/pdns/dnsdist-lua-rules.cc @@ -831,12 +831,12 @@ public: } bool matches(const DNSQuestion* dq) const override { - if (dq->qTag == nullptr) { + if (!dq->qTag) { return false; } - const auto got = dq->qTag->tagData.find(d_tag); - if (got == dq->qTag->tagData.cend()) { + const auto it = dq->qTag->find(d_tag); + if (it == dq->qTag->cend()) { return false; } @@ -844,7 +844,7 @@ public: return true; } - return got->second == *d_value; + return it->second == *d_value; } string toString() const override diff --git a/pdns/dnsdist.hh b/pdns/dnsdist.hh index b8d711128..1bd3eedf4 100644 --- a/pdns/dnsdist.hh +++ b/pdns/dnsdist.hh @@ -53,77 +53,10 @@ extern uint16_t g_ECSSourcePrefixV4; extern uint16_t g_ECSSourcePrefixV6; extern bool g_ECSOverride; -class QTag -{ -public: - QTag() - { - } - - ~QTag() - { - } - - void add(const std::string& strLabel, const std::string& strValue) - { - tagData.insert({strLabel, strValue}); - return; - } - - std::string getMatch(const std::string& strLabel) const - { - const auto got = tagData.find(strLabel); - if (got == tagData.cend()) { - return ""; - } - - return got->second; - } - - std::string getEntry(size_t iEntry) const - { - std::string strEntry; - size_t iCounter = 0; - - for (const auto& itr : tagData) { - iCounter++; - if(iCounter == iEntry) { - strEntry = itr.first; - strEntry += strSep; - strEntry += itr.second; - break; - } - } - - return strEntry; - } - - size_t count() const - { - return tagData.size(); - } - - std::string dumpString() const - { - std::string strRet; - - for (const auto& itr : tagData) { - strRet += itr.first; - strRet += strSep; - strRet += itr.second; - strRet += "\n"; - } - return strRet; - } - - std::unordered_map tagData; - -private: - static constexpr char const *strSep = "\t"; -}; - extern thread_local boost::uuids::random_generator t_uuidGenerator; +typedef std::unordered_map QTag; + struct DNSQuestion { DNSQuestion(const DNSName* name, uint16_t type, uint16_t class_, const ComboAddress* lc, const ComboAddress* rem, struct dnsheader* header, size_t bufferSize, uint16_t queryLen, bool isTcp, const struct timespec* queryTime_): @@ -137,7 +70,7 @@ struct DNSQuestion const uint16_t qclass; const ComboAddress* local; const ComboAddress* remote; - std::shared_ptr qTag; + std::shared_ptr qTag{nullptr}; struct dnsheader* dh; size_t size; uint16_t len; -- 2.40.0