feature: add expand ptr from address feature

This commit is contained in:
Nick Peng
2023-03-31 23:28:34 +08:00
parent d402d62cc5
commit fbdcb7ba41
5 changed files with 107 additions and 13 deletions

View File

@@ -161,3 +161,50 @@ cache-persist no)""");
EXPECT_EQ(client.GetAnswer()[0].GetType(), "AAAA");
EXPECT_EQ(client.GetAnswer()[0].GetData(), "64:ff9b::1010:1010");
}
TEST_F(Address, ptr)
{
smartdns::MockServer server_upstream;
smartdns::Server server;
server_upstream.Start("udp://0.0.0.0:61053", [&](struct smartdns::ServerRequestContext *request) {
if (request->qtype == DNS_T_A) {
smartdns::MockServer::AddIP(request, request->domain.c_str(), "1.2.3.4", 700);
return smartdns::SERVER_REQUEST_OK;
} else if (request->qtype == DNS_T_AAAA) {
smartdns::MockServer::AddIP(request, request->domain.c_str(), "64:ff9b::102:304", 700);
return smartdns::SERVER_REQUEST_OK;
}
return smartdns::SERVER_REQUEST_SOA;
});
server.Start(R"""(bind [::]:60053
server 127.0.0.1:61053
log-num 0
log-console yes
log-level debug
speed-check-mode none
expand-ptr-from-address yes
address /a.com/10.11.12.13
address /a.com/64:ff9b::1010:1010
cache-persist no)""");
smartdns::Client client;
ASSERT_TRUE(client.Query("13.12.11.10.in-addr.arpa PTR", 60053));
std::cout << client.GetResult() << std::endl;
ASSERT_EQ(client.GetAnswerNum(), 1);
EXPECT_EQ(client.GetStatus(), "NOERROR");
EXPECT_EQ(client.GetAnswer()[0].GetName(), "13.12.11.10.in-addr.arpa");
EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 600);
EXPECT_EQ(client.GetAnswer()[0].GetType(), "PTR");
EXPECT_EQ(client.GetAnswer()[0].GetData(), "a.com.");
ASSERT_TRUE(client.Query("0.1.0.1.0.1.0.1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.b.9.f.f.4.6.0.0.ip6.arpa PTR", 60053));
std::cout << client.GetResult() << std::endl;
ASSERT_EQ(client.GetAnswerNum(), 1);
EXPECT_EQ(client.GetStatus(), "NOERROR");
EXPECT_EQ(client.GetAnswer()[0].GetName(),
"0.1.0.1.0.1.0.1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.b.9.f.f.4.6.0.0.ip6.arpa");
EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 600);
EXPECT_EQ(client.GetAnswer()[0].GetType(), "PTR");
EXPECT_EQ(client.GetAnswer()[0].GetData(), "a.com.");
}

View File

@@ -49,7 +49,18 @@ DNSRecord::~DNSRecord() {}
bool DNSRecord::Parser(const std::string &line)
{
std::vector<std::string> fields = StringSplit(line, '\t');
std::vector<std::string> fields_first = StringSplit(line, '\t');
std::vector<std::string> fields;
for (const auto &f : fields_first) {
std::vector<std::string> fields_second = StringSplit(f, ' ');
for (const auto &s : fields_second) {
if (s.length() > 0) {
fields.push_back(s);
}
}
}
if (fields.size() < 3) {
std::cerr << "Invalid DNS record: " << line << ", size: " << fields.size() << std::endl;
return false;