]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[1607] supported type ANY query case.
authorJINMEI Tatuya <jinmei@isc.org>
Fri, 2 Mar 2012 07:33:13 +0000 (23:33 -0800)
committerJINMEI Tatuya <jinmei@isc.org>
Fri, 2 Mar 2012 07:33:13 +0000 (23:33 -0800)
src/lib/datasrc/database.cc
src/lib/datasrc/memory_datasrc.cc
src/lib/datasrc/tests/zone_finder_context_unittest.cc
src/lib/datasrc/zone.h
src/lib/datasrc/zone_finder_context.cc

index a6b2a3b08ba62eb58ca2e134e1f5bbbd9992da72..37243e848e88c8b6764c1bafb7ee757692618b8d 100644 (file)
@@ -403,7 +403,8 @@ DatabaseClient::Finder::findAll(const isc::dns::Name& name,
 {
     return (ZoneFinderContextPtr(new Context(*this, options,
                                              findInternal(name, RRType::ANY(),
-                                                          &target, options))));
+                                                          &target, options),
+                                             target)));
 }
 
 ZoneFinderContextPtr
index 8ecfecdabb83e91b73c42090c688c1aa968f52e0..b9fb7deaa72896c4000db0de6ae2971953d6e427 100644 (file)
@@ -895,7 +895,8 @@ InMemoryZoneFinder::findAll(const Name& name,
 {
     return (ZoneFinderContextPtr(
                 new Context(*this, options, impl_->find(name, RRType::ANY(),
-                                                        &target, options))));
+                                                        &target, options),
+                            target)));
 }
 
 ZoneFinder::FindNSEC3Result
index f59f9a7f68f4bb3936acd3a21118629658e4c1f6..0e5c56e87e144e46abaca49746bed869301df434 100644 (file)
@@ -281,4 +281,32 @@ TEST_P(ZoneFinderContextTest, getAdditionalNoOP) {
     EXPECT_TRUE(result_sets_.empty());
 }
 
+TEST_P(ZoneFinderContextTest, getAdditionalForAny) {
+    // getAdditional() after successful type ANY query should return
+    // the additional records of all returned RRsets.
+    vector<ConstRRsetPtr> all_rrsets;
+    ZoneFinderContextPtr ctx = finder_->findAll(qzone_, all_rrsets);
+    EXPECT_EQ(ZoneFinder::SUCCESS, ctx->code);
+
+    ctx->getAdditional(REQUESTED_BOTH, result_sets_);
+    rrsetsCheck("ns1.example.org. 3600 IN A 192.0.2.1\n"
+                "ns1.example.org. 3600 IN AAAA 2001:db8::1\n"
+                "ns2.example.org. 3600 IN A 192.0.2.2\n"
+                "mx1.example.org. 3600 IN A 192.0.2.10\n"
+                "mx2.example.org. 3600 IN AAAA 2001:db8::10\n",
+                result_sets_.begin(), result_sets_.end());
+
+    // If the type ANY query results in DELEGATION, the result should be the
+    // same as normal query.
+    all_rrsets.clear();
+    result_sets_.clear();
+    ctx = finder_->findAll(Name("www.a.example.org"), all_rrsets);
+    EXPECT_EQ(ZoneFinder::DELEGATION, ctx->code);
+    ctx->getAdditional(REQUESTED_BOTH, result_sets_);
+    rrsetsCheck("ns1.a.example.org. 3600 IN A 192.0.2.5\n"
+                "ns2.a.example.org. 3600 IN A 192.0.2.6\n"
+                "ns2.a.example.org. 3600 IN AAAA 2001:db8::6\n",
+                result_sets_.begin(), result_sets_.end());
+}
+
 }
index d8ba30167f539cbe535659a940d1ba6ea09aff21..4ca545ed8f9729fb8c006e43face40e6484eaa1f 100644 (file)
@@ -153,6 +153,15 @@ public:
             code(result.code), rrset(result.rrset),
             finder_(finder), flags_(result.flags), options_(options)
         {}
+
+        Context(ZoneFinder& finder, FindOptions options,
+                const ResultContext& result,
+                std::vector<isc::dns::ConstRRsetPtr> &all_set) :
+            code(result.code), rrset(result.rrset),
+            finder_(finder), flags_(result.flags), options_(options),
+            all_set_(all_set)
+        {}
+
         const Result code;
         const isc::dns::ConstRRsetPtr rrset;
 
@@ -203,6 +212,7 @@ public:
         ZoneFinder& finder_;
         const FindResultFlags flags_;
         const FindOptions options_;
+        std::vector<isc::dns::ConstRRsetPtr> all_set_;
     };
 
     ///
index ba2aaeb7e1a4fd3ddec037530fe9134612432156..7913d711184e1f7fc4da125dd112e990c72c3ba6 100644 (file)
@@ -51,30 +51,52 @@ getAdditionalAddrs(ZoneFinder& finder, const Name& name,
         }
     }
 }
-}
 
 void
-ZoneFinder::Context::getAdditionalImpl(const vector<RRType>& requested_types,
-                                       vector<ConstRRsetPtr>& result)
+getAdditionalForRRset(ZoneFinder& finder, const AbstractRRset& rrset,
+                      const vector<RRType>& requested_types,
+                      vector<ConstRRsetPtr>& result,
+                      ZoneFinder::FindOptions orig_options)
 {
-    RdataIteratorPtr rdata_iterator(rrset->getRdataIterator());
+    RdataIteratorPtr rdata_iterator(rrset.getRdataIterator());
     ZoneFinder::FindOptions options = ZoneFinder::FIND_DEFAULT;
+    if ((orig_options & ZoneFinder::FIND_DNSSEC) != 0) {
+        options = options | ZoneFinder::FIND_DNSSEC;
+    }
 
     for (; !rdata_iterator->isLast(); rdata_iterator->next()) {
         const Rdata& rdata(rdata_iterator->getCurrent());
 
-        if (rrset->getType() == RRType::NS()) {
+        if (rrset.getType() == RRType::NS()) {
             // Need to perform the search in the "GLUE OK" mode.
             const generic::NS& ns = dynamic_cast<const generic::NS&>(rdata);
-            getAdditionalAddrs(finder_, ns.getNSName(), requested_types,
+            getAdditionalAddrs(finder, ns.getNSName(), requested_types,
                                result, options | ZoneFinder::FIND_GLUE_OK);
-        } else if (rrset->getType() == RRType::MX()) {
+        } else if (rrset.getType() == RRType::MX()) {
             const generic::MX& mx = dynamic_cast<const generic::MX&>(rdata);
-            getAdditionalAddrs(finder_, mx.getMXName(), requested_types,
+            getAdditionalAddrs(finder, mx.getMXName(), requested_types,
                                result, options);
         }
     }
 }
+}
+
+void
+ZoneFinder::Context::getAdditionalImpl(const vector<RRType>& requested_types,
+                                       vector<ConstRRsetPtr>& result)
+{
+    // If rrset is non NULL, it should have been SUCCESS/DELEGATION; otherwise
+    // we should have responded to type ANY query.
+    if (rrset) {
+        getAdditionalForRRset(finder_, *rrset, requested_types, result,
+                              options_);
+        return;
+    }
+    BOOST_FOREACH(ConstRRsetPtr rrset_in_set, all_set_) {
+        getAdditionalForRRset(finder_, *rrset_in_set, requested_types, result,
+                              options_);
+    }
+}
 
 } // namespace datasrc
 } // datasrc isc