}
escaped = '\\' (([^0-9]@reportEscaped) | ([0-9]{3}$reportEscapedNumber%doneEscapedNumber));
- plain = (ascii-'\\'-'"'-'.') $ reportPlain;
+ plain = (extend-'\\'-'.') $ reportPlain;
labelElement = escaped | plain;
main := ((labelElement+ '.') >labelBegin %labelEnd)+;
}%%
if ( cs < dnsname_first_final ) {
- throw runtime_error("Unable to parse DNS name '"+input+"'");
+ throw runtime_error("Unable to parse DNS name '"+input+"': cs="+std::to_string(cs));
}
return ret;
void DNSName::appendRawLabel(const std::string& label)
{
+ if(label.empty())
+ throw std::range_error("no such thing as an empty label");
if(label.size() > 63)
throw std::range_error("label too long");
d_labels.push_back(label);
void DNSName::prependRawLabel(const std::string& label)
{
+ if(label.empty())
+ throw std::range_error("no such thing as an empty label");
+
if(label.size() > 63)
throw std::range_error("label too long");
else if(p > 0x21 && p < 0x7e)
ret.append(1, (char)p);
else {
- ret+="\\" + (boost::format("%03o") % (unsigned int)p).str();
+ ret+="\\" + (boost::format("%03d") % (unsigned int)p).str();
}
}
return ret;
BOOST_CHECK_EQUAL(*labels.rbegin(), "example");
BOOST_CHECK_EQUAL(labels.size(), 2);
+
+ DNSName build;
+ build.appendRawLabel("Donald E. Eastlake 3rd");
+ build.appendRawLabel("example");
+ BOOST_CHECK_EQUAL(build.toString(), R"(Donald\032E\.\032Eastlake\0323rd.example.)");
try {
DNSName broken("bert..hubert.");
BOOST_CHECK(0);
catch(...){}
}
+BOOST_AUTO_TEST_CASE(test_escaping) {
+ DNSName n;
+ string label;
+ for(int i = 0; i < 256; ++i) {
+ if(!((i+1)%63)) {
+ n.appendRawLabel(label);
+ label.clear();
+ }
+ label.append(1,(char)i);
+ }
+ if(!label.empty())
+ n.appendRawLabel(label);
+
+ DNSName n2(n.toString());
+ BOOST_CHECK(n==n2);
+}
+
BOOST_AUTO_TEST_CASE(test_suffixmatch) {
SuffixMatchNode smn;
DNSName ezdns("ezdns.it.");