result->append(addr.str());
}
+bool IPAddressV4::validate(StringPiece ip) {
+ constexpr size_t kStrMaxLen = INET_ADDRSTRLEN;
+ std::array<char, kStrMaxLen + 1> ip_cstr;
+ const size_t len = std::min(ip.size(), kStrMaxLen);
+ std::memcpy(ip_cstr.data(), ip.data(), len);
+ ip_cstr[len] = 0;
+ struct in_addr addr;
+ return 1 == inet_pton(AF_INET, ip_cstr.data(), &addr);
+}
// public static
IPAddressV4 IPAddressV4::fromLong(uint32_t src) {
*/
class IPAddressV4 : boost::totally_ordered<IPAddressV4> {
public:
+ static bool validate(StringPiece ip);
+
// create an IPAddressV4 instance from a uint32_t (network byte order)
static IPAddressV4 fromLong(uint32_t src);
// same as above but host byte order
result->append(addr.str());
}
+bool IPAddressV6::validate(StringPiece ip) {
+ if (ip.size() > 0 && ip.front() == '[' && ip.back() == ']') {
+ ip = ip.subpiece(1, ip.size() - 2);
+ }
+
+ constexpr size_t kStrMaxLen = INET6_ADDRSTRLEN;
+ std::array<char, kStrMaxLen + 1> ip_cstr;
+ const size_t len = std::min(ip.size(), kStrMaxLen);
+ std::memcpy(ip_cstr.data(), ip.data(), len);
+ ip_cstr[len] = 0;
+ struct in6_addr addr;
+ return 1 == inet_pton(AF_INET6, ip_cstr.data(), &addr);
+}
+
// public default constructor
IPAddressV6::IPAddressV6() {
}
static constexpr size_t kToFullyQualifiedSize =
8 /*words*/ * 4 /*hex chars per word*/ + 7 /*separators*/;
+ static bool validate(StringPiece ip);
+
/**
* Create a new IPAddress instance from the provided binary data.
* @throws IPAddressFormatException if the input length is not 16 bytes.
EXPECT_EQ(IPAddressV6("::0"), v6);
}
+TEST(IPAddressV4, validate) {
+ EXPECT_TRUE(IPAddressV4::validate("0.0.0.0"));
+ EXPECT_FALSE(IPAddressV4::validate("0.0.0."));
+ EXPECT_TRUE(IPAddressV4::validate("127.127.127.127"));
+}
+
+TEST(IPAddressV6, validate) {
+ EXPECT_TRUE(IPAddressV6::validate("2620:0:1cfe:face:b00c::3"));
+ EXPECT_FALSE(IPAddressV6::validate("0.0.0.0"));
+ EXPECT_TRUE(IPAddressV6::validate("[2620:0:1cfe:face:b00c::3]"));
+ EXPECT_TRUE(IPAddressV6::validate("::ffff:0.1.1.1"));
+ EXPECT_TRUE(IPAddressV6::validate("2620:0000:1cfe:face:b00c:0000:0000:0003"));
+ EXPECT_TRUE(
+ IPAddressV6::validate("2620:0000:1cfe:face:b00c:0000:127.127.127.127"));
+}
+
// Test addresses constructed using a in[6]_addr value
TEST_P(IPAddressTest, CtorAddress) {
AddressData param = GetParam();