void DNSPacketWriter::startRecord(const DNSName& name, uint16_t qtype, uint32_t ttl, uint16_t qclass, DNSResourceRecord::Place place, bool compress)
{
+ d_compress = compress;
commit();
d_rollbackmarker=d_content.size();
uint16_t li=0;
uint16_t matchlen=0;
- if(compress && (li=lookupName(name, &matchlen)) && li < 16384) {
+ if(d_compress && compress && (li=lookupName(name, &matchlen)) && li < 16384) {
const auto& dns=name.getStorage();
if(l_verbose)
cout<<"Found a substring of "<<matchlen<<" bytes from the back, offset: "<<li<<", dnslen: "<<dns.size()<<endl;
uint16_t d_truncatemarker; // end of header, for truncate
DNSResourceRecord::Place d_recordplace;
- bool d_canonic, d_lowerCase;
+ bool d_canonic, d_lowerCase, d_compress{false};
};
typedef vector<pair<string::size_type, string::size_type> > labelparts_t;
BOOST_AUTO_TEST_SUITE(test_dnswriter_cc)
+BOOST_AUTO_TEST_CASE(test_compressionBool) {
+ auto testCompressionBool = [](bool compress, size_t size1, size_t size2) {
+ DNSName name("powerdns.com.");
+
+ vector<uint8_t> packet;
+ DNSPacketWriter pwR(packet, name, QType::A, QClass::IN, 0);
+ pwR.getHeader()->qr = 1;
+
+ pwR.startRecord(DNSName("mediumsizedlabel.example.net"), QType::A, 3600, QClass::IN, DNSResourceRecord::ANSWER, compress);
+ pwR.xfrIP('P'<<24 |
+ 'Q'<<16 |
+ 'R'<<8 |
+ 'S');
+ pwR.commit();
+ BOOST_CHECK_EQUAL(pwR.size(), size1);
+
+ pwR.startRecord(DNSName("adifferentlabel.example.net"), QType::NS, 3600, QClass::IN, DNSResourceRecord::ANSWER, compress);
+ pwR.xfrName(DNSName("target.example.net"), true);
+ pwR.commit();
+ BOOST_CHECK_EQUAL(pwR.size(), size2);
+
+ string spacket(packet.begin(), packet.end());
+
+ BOOST_CHECK_NO_THROW(MOADNSParser mdp(false, spacket));
+ };
+
+ testCompressionBool(true, 74, 111);
+ testCompressionBool(false, 74, 133);
+}
+
BOOST_AUTO_TEST_CASE(test_compressionBoundary) {
DNSName name("powerdns.com.");