test: add test case for cname

This commit is contained in:
Nick Peng
2023-03-14 23:52:10 +08:00
parent 12e7bc752c
commit cf52eeacc9
8 changed files with 134 additions and 34 deletions

View File

@@ -21,6 +21,7 @@
#include "util.h"
#include <arpa/inet.h>
#include <fcntl.h>
#include <fstream>
#include <netinet/in.h>
#include <poll.h>
#include <signal.h>
@@ -30,7 +31,6 @@
#include <sys/wait.h>
#include <unistd.h>
#include <vector>
#include <fstream>
namespace smartdns
{
@@ -87,13 +87,15 @@ void MockServer::Run()
struct sockaddr_storage from;
socklen_t addrlen = sizeof(from);
unsigned char in_buff[4096];
int query_id = 0;
int len = recvfrom(fd_, in_buff, sizeof(in_buff), 0, (struct sockaddr *)&from, &addrlen);
if (len < 0) {
continue;
}
char packet_buff[4096];
unsigned char out_buff[4096];
unsigned char response_data_buff[4096];
unsigned char response_packet_buff[4096];
memset(packet_buff, 0, sizeof(packet_buff));
struct dns_packet *packet = (struct dns_packet *)packet_buff;
struct ServerRequestContext request;
@@ -102,6 +104,7 @@ void MockServer::Run()
int ret = dns_decode(packet, sizeof(packet_buff), in_buff, len);
if (ret == 0) {
request.packet = packet;
query_id = packet->head.id;
if (packet->head.qr == DNS_QR_QUERY) {
struct dns_rrs *rrs = NULL;
int rr_count = 0;
@@ -126,27 +129,26 @@ void MockServer::Run()
request.fromlen = addrlen;
request.request_data = in_buff;
request.request_data_len = len;
request.response_data = out_buff;
request.response_packet = (struct dns_packet *)response_packet_buff;
request.response_data = response_data_buff;
request.response_data_len = 0;
request.response_data_max_len = sizeof(out_buff);
request.response_data_max_len = sizeof(response_data_buff);
struct dns_head head;
memset(&head, 0, sizeof(head));
head.id = query_id;
head.qr = DNS_QR_ANSWER;
head.opcode = DNS_OP_QUERY;
head.aa = 0;
head.rd = 0;
head.ra = 1;
head.rcode = DNS_RC_SERVFAIL;
dns_packet_init(request.response_packet, sizeof(response_packet_buff), &head);
auto callback_ret = callback_(&request);
if (callback_ret == false) {
unsigned char out_packet_buff[4096];
struct dns_packet *out_packet = (struct dns_packet *)out_packet_buff;
struct dns_head head;
memset(&head, 0, sizeof(head));
head.id = packet->head.id;
head.qr = DNS_QR_ANSWER;
head.opcode = DNS_OP_QUERY;
head.aa = 0;
head.rd = 1;
head.ra = 0;
head.rcode = DNS_RC_SERVFAIL;
dns_packet_init(out_packet, sizeof(out_packet_buff), &head);
if (callback_ret == false || request.response_data_len == 0) {
request.response_data_len =
dns_encode(request.response_data, request.response_data_max_len, out_packet);
dns_encode(request.response_data, request.response_data_max_len, request.response_packet);
}
sendto(fd_, request.response_data, request.response_data_len, MSG_NOSIGNAL, (struct sockaddr *)&from,
@@ -255,7 +257,8 @@ bool Server::Start(const std::string &conf, enum CONF_TYPE type)
if (fd < 0) {
return false;
}
Defer {
Defer
{
close(fd);
};