diff --git a/ChangeLog b/ChangeLog index 44f230b3..2dca8ea4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2010-01-28 Tatsuhiro Tsujikawa + + Replaced isNumberAndDotsNotation() with isNumericHost(). + isNumericHost() can handle IPv6 address. + * src/Cookie.cc + * src/CookieStorage.cc + * src/util.cc + * src/util.h + * test/CookieTest.cc + * test/UtilTest.cc + 2010-01-28 Tatsuhiro Tsujikawa Included A2STR.h diff --git a/src/Cookie.cc b/src/Cookie.cc index b8ff5eeb..7132857c 100644 --- a/src/Cookie.cc +++ b/src/Cookie.cc @@ -56,7 +56,7 @@ static std::string prependDotIfNotExists(const std::string& domain) std::string Cookie::normalizeDomain(const std::string& domain) { - if(domain.empty() || util::isNumbersAndDotsNotation(domain)) { + if(domain.empty() || util::isNumericHost(domain)) { return domain; } std::string md = prependDotIfNotExists(domain); diff --git a/src/CookieStorage.cc b/src/CookieStorage.cc index 11b0e347..06bb7a6f 100644 --- a/src/CookieStorage.cc +++ b/src/CookieStorage.cc @@ -245,7 +245,7 @@ std::deque CookieStorage::criteriaFind(const std::string& requestHost, time_t date, bool secure) { std::deque res; - bool numericHost = util::isNumbersAndDotsNotation(requestHost); + bool numericHost = util::isNumericHost(requestHost); searchCookieByDomainSuffix ((!numericHost && requestHost.find(A2STR::DOT_C) == std::string::npos)? requestHost+".local":requestHost, diff --git a/src/util.cc b/src/util.cc index 7e866bc4..09d66941 100644 --- a/src/util.cc +++ b/src/util.cc @@ -664,13 +664,18 @@ std::string toLower(const std::string& src) { return temp; } -bool isNumbersAndDotsNotation(const std::string& name) { - struct sockaddr_in sockaddr; - if(inet_aton(name.c_str(), &sockaddr.sin_addr)) { - return true; - } else { +bool isNumericHost(const std::string& name) +{ + struct addrinfo hints; + struct addrinfo* res; + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_UNSPEC; + hints.ai_flags = AI_NUMERICHOST; + if(getaddrinfo(name.c_str(), 0, &hints, &res)) { return false; } + freeaddrinfo(res); + return true; } void setGlobalSignalHandler(int sig, void (*handler)(int), int flags) { diff --git a/src/util.h b/src/util.h index a57a84e5..8a979074 100644 --- a/src/util.h +++ b/src/util.h @@ -222,7 +222,7 @@ std::string toUpper(const std::string& src); std::string toLower(const std::string& src); -bool isNumbersAndDotsNotation(const std::string& name); +bool isNumericHost(const std::string& name); void setGlobalSignalHandler(int signal, void (*handler)(int), int flags); diff --git a/test/CookieTest.cc b/test/CookieTest.cc index 4290c7fe..deaced49 100644 --- a/test/CookieTest.cc +++ b/test/CookieTest.cc @@ -178,6 +178,8 @@ void CookieTest::testNormalizeDomain() CPPUNIT_ASSERT_EQUAL(std::string("..local"), dot.getDomain()); Cookie ip("k", "v", "/", "192.168.1.1", false); CPPUNIT_ASSERT_EQUAL(std::string("192.168.1.1"), ip.getDomain()); + Cookie ipv6("k", "v", "/", "::1", false); + CPPUNIT_ASSERT_EQUAL(std::string("::1"), ipv6.getDomain()); } void CookieTest::testToNsCookieFormat() diff --git a/test/UtilTest.cc b/test/UtilTest.cc index 3916fb4c..13bd212e 100644 --- a/test/UtilTest.cc +++ b/test/UtilTest.cc @@ -60,6 +60,7 @@ class UtilTest:public CppUnit::TestFixture { CPPUNIT_TEST(testParsePrioritizePieceRange); CPPUNIT_TEST(testApplyDir); CPPUNIT_TEST(testFixTaintedBasename); + CPPUNIT_TEST(testIsNumericHost); CPPUNIT_TEST_SUITE_END(); private: @@ -108,6 +109,7 @@ public: void testParsePrioritizePieceRange(); void testApplyDir(); void testFixTaintedBasename(); + void testIsNumericHost(); }; @@ -919,4 +921,11 @@ void UtilTest::testFixTaintedBasename() CPPUNIT_ASSERT_EQUAL(std::string("a__b"), util::fixTaintedBasename("a\\/b")); } +void UtilTest::testIsNumericHost() +{ + CPPUNIT_ASSERT(util::isNumericHost("192.168.0.1")); + CPPUNIT_ASSERT(!util::isNumericHost("aria2.sf.net")); + CPPUNIT_ASSERT(util::isNumericHost("::1")); +} + } // namespace aria2