0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2025-03-13 21:10:32 +01:00

ircd::rfc3986: Add validation suite for hostname strings related.

This commit is contained in:
Jason Volk 2018-10-02 17:19:50 -07:00
parent 1cf0b629cb
commit 67a759ac21
2 changed files with 129 additions and 0 deletions

View file

@ -23,6 +23,15 @@ namespace ircd::rfc3986
struct encoder extern const encoder;
struct decoder extern const decoder;
void valid_hostname(const string_view &); // name part
bool valid_hostname(std::nothrow_t, const string_view &);
void valid_domain(const string_view &); // dot delimited hostnames
bool valid_domain(std::nothrow_t, const string_view &);
void valid_host(const string_view &); // domain | ip4 | ip6
bool valid_host(std::nothrow_t, const string_view &);
void valid_remote(const string_view &); // host + optional :port
bool valid_remote(std::nothrow_t, const string_view &);
string_view encode(const string_view &url, const mutable_buffer &);
string_view decode(const string_view &url, const mutable_buffer &);
}

View file

@ -247,3 +247,123 @@ catch(const qi::expectation_failure<const char *> &e)
string_view{e.first, e.last}
};
}
bool
ircd::rfc3986::valid_remote(std::nothrow_t,
const string_view &str)
{
static const auto &rule
{
parser.remote >> eoi
};
const char *start(str.data()), *const stop(start + str.size());
return qi::parse(start, stop, rule);
}
void
ircd::rfc3986::valid_remote(const string_view &str)
try
{
static const auto &rule
{
parser.remote >> eoi
};
const char *start(str.data()), *const stop(start + str.size());
qi::parse(start, stop, eps > rule);
}
catch(const qi::expectation_failure<const char *> &e)
{
throw expectation_failure<error>{e};
}
bool
ircd::rfc3986::valid_host(std::nothrow_t,
const string_view &str)
{
static const auto &rule
{
parser.host >> eoi
};
const char *start(str.data()), *const stop(start + str.size());
return qi::parse(start, stop, rule);
}
void
ircd::rfc3986::valid_host(const string_view &str)
try
{
static const auto &rule
{
parser.host >> eoi
};
const char *start(str.data()), *const stop(start + str.size());
qi::parse(start, stop, eps > rule);
}
catch(const qi::expectation_failure<const char *> &e)
{
throw expectation_failure<error>{e};
}
bool
ircd::rfc3986::valid_domain(std::nothrow_t,
const string_view &str)
{
static const auto &rule
{
parser.domain >> eoi
};
const char *start(str.data()), *const stop(start + str.size());
return qi::parse(start, stop, rule);
}
void
ircd::rfc3986::valid_domain(const string_view &str)
try
{
static const auto &rule
{
parser.host >> eoi
};
const char *start(str.data()), *const stop(start + str.size());
qi::parse(start, stop, eps > rule);
}
catch(const qi::expectation_failure<const char *> &e)
{
throw expectation_failure<error>{e};
}
bool
ircd::rfc3986::valid_hostname(std::nothrow_t,
const string_view &str)
{
static const auto &rule
{
parser.hostname >> eoi
};
const char *start(str.data()), *const stop(start + str.size());
return qi::parse(start, stop, rule);
}
void
ircd::rfc3986::valid_hostname(const string_view &str)
try
{
static const auto &rule
{
parser.hostname >> eoi
};
const char *start(str.data()), *const stop(start + str.size());
qi::parse(start, stop, eps > rule);
}
catch(const qi::expectation_failure<const char *> &e)
{
throw expectation_failure<error>{e};
}