{
public:
RegexRule(const std::string& regex) :
- d_regex(regex), d_visual(regex)
+ d_visual(regex)
{
+ try {
+ d_regex = Regex(regex);
+ }
+ catch (const PDNSException& exp) {
+ throw std::runtime_error("Error compiling expression in RegexRule: " + exp.reason);
+ }
}
bool matches(const DNSQuestion* dq) const override
{
- return d_regex.match(dq->ids.qname.toStringNoDot());
+ return d_regex->match(dq->ids.qname.toStringNoDot());
}
string toString() const override
}
private:
- Regex d_regex;
+ std::optional<Regex> d_regex{std::nullopt};
string d_visual;
};
private:
string d_header;
- Regex d_regex;
+ std::optional<Regex> d_regex{std::nullopt};
string d_visual;
};
string toString() const override;
private:
- Regex d_regex;
+ std::optional<Regex> d_regex{std::nullopt};
std::string d_visual;
};
thread_local std::map<uint64_t, LuaFFIPerThreadRule::PerThreadState> LuaFFIPerThreadRule::t_perThreadStates;
HTTPHeaderRule::HTTPHeaderRule(const std::string& header, const std::string& regex) :
- d_header(toLower(header)), d_regex(regex), d_visual("http[" + header + "] ~ " + regex)
+ d_header(toLower(header)), d_visual("http[" + header + "] ~ " + regex)
{
#if !defined(HAVE_DNS_OVER_HTTPS) && !defined(HAVE_DNS_OVER_HTTP3)
throw std::runtime_error("Using HTTPHeaderRule while DoH support is not enabled");
+#else
+ try {
+ d_regex = Regex(regex);
+ }
+ catch (const PDNSException& exp) {
+ throw std::runtime_error("Error compiling expression in HTTPHeaderRule: " + exp.reason);
+ }
#endif /* HAVE_DNS_OVER_HTTPS || HAVE_DNS_OVER_HTTP3 */
}
const auto& headers = dnsQuestion->ids.du->getHTTPHeaders();
for (const auto& header : headers) {
if (header.first == d_header) {
- return d_regex.match(header.second);
+ return d_regex->match(header.second);
}
}
return false;
const auto& headers = dnsQuestion->ids.doh3u->getHTTPHeaders();
for (const auto& header : headers) {
if (header.first == d_header) {
- return d_regex.match(header.second);
+ return d_regex->match(header.second);
}
}
return false;
}
HTTPPathRegexRule::HTTPPathRegexRule(const std::string& regex) :
- d_regex(regex), d_visual("http path ~ " + regex)
+ d_visual("http path ~ " + regex)
{
#if !defined(HAVE_DNS_OVER_HTTPS) && !defined(HAVE_DNS_OVER_HTTP3)
throw std::runtime_error("Using HTTPRegexRule while DoH support is not enabled");
+#else
+ try {
+ d_regex = Regex(regex);
+ }
+ catch (const PDNSException& exp) {
+ throw std::runtime_error("Error compiling expression in HTTPPathRegexRule: " + exp.reason);
+ }
#endif /* HAVE_DNS_OVER_HTTPS || HAVE_DNS_OVER_HTTP3 */
}
#if defined(HAVE_DNS_OVER_HTTPS)
if (dnsQuestion->ids.du) {
const auto path = dnsQuestion->ids.du->getHTTPPath();
- return d_regex.match(path);
+ return d_regex->match(path);
}
#endif /* HAVE_DNS_OVER_HTTPS */
#if defined(HAVE_DNS_OVER_HTTP3)
if (dnsQuestion->ids.doh3u) {
- return d_regex.match(dnsQuestion->ids.doh3u->getHTTPPath());
+ return d_regex->match(dnsQuestion->ids.doh3u->getHTTPPath());
}
return false;
#endif /* HAVE_DNS_OVER_HTTP3 */
return stringfgets(filePtr.get(), *line);
}
-Regex::Regex(const string &expr)
+Regex::Regex(const string& expr)
{
- if(regcomp(&d_preg, expr.c_str(), REG_ICASE|REG_NOSUB|REG_EXTENDED))
- throw PDNSException("Regular expression did not compile");
+ if (auto ret = regcomp(&d_preg, expr.c_str(), REG_ICASE|REG_NOSUB|REG_EXTENDED); ret != 0) {
+ std::array<char, 1024> errorBuffer{};
+ if (regerror(ret, &d_preg, errorBuffer.data(), errorBuffer.size()) > 0) {
+ throw PDNSException("Regular expression " + expr + " did not compile: " + errorBuffer.data());
+ }
+ throw PDNSException("Regular expression " + expr + " did not compile");
+ }
}
// if you end up here because valgrind told you were are doing something wrong