mirror of https://github.com/aria2/aria2
Allow subsecond value in ns cookie.txt file's expiry time field
parent
6976ffed9e
commit
bafbbe7c1d
|
@ -69,9 +69,14 @@ std::unique_ptr<Cookie> parseNsCookie(const std::string& cookieStr,
|
|||
return nullptr;
|
||||
}
|
||||
int64_t expiryTime;
|
||||
if (!util::parseLLIntNoThrow(expiryTime,
|
||||
std::string(vs[4].first, vs[4].second))) {
|
||||
return nullptr;
|
||||
{
|
||||
// chrome extension uses subsecond resolution for expiry time.
|
||||
double expiryTimeDouble;
|
||||
if (!util::parseDoubleNoThrow(expiryTimeDouble,
|
||||
std::string(vs[4].first, vs[4].second))) {
|
||||
return nullptr;
|
||||
}
|
||||
expiryTime = static_cast<int64_t>(expiryTimeDouble);
|
||||
}
|
||||
if (std::numeric_limits<time_t>::max() < expiryTime) {
|
||||
expiryTime = std::numeric_limits<time_t>::max();
|
||||
|
|
27
src/util.cc
27
src/util.cc
|
@ -596,6 +596,33 @@ bool parseLLIntNoThrow(int64_t& res, const std::string& s, int base)
|
|||
}
|
||||
}
|
||||
|
||||
bool parseDoubleNoThrow(double& res, const std::string& s)
|
||||
{
|
||||
if (s.empty()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
errno = 0;
|
||||
char* endptr;
|
||||
auto d = strtod(s.c_str(), &endptr);
|
||||
|
||||
if (errno == ERANGE) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (endptr != s.c_str() + s.size()) {
|
||||
for (auto i = std::begin(s) + (endptr - s.c_str()); i != std::end(s); ++i) {
|
||||
if (!isspace(*i)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
res = d;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
SegList<int> parseIntSegments(const std::string& src)
|
||||
{
|
||||
SegList<int> sgl;
|
||||
|
|
|
@ -280,6 +280,10 @@ bool parseUIntNoThrow(uint32_t& res, const std::string& s, int base = 10);
|
|||
|
||||
bool parseLLIntNoThrow(int64_t& res, const std::string& s, int base = 10);
|
||||
|
||||
// Parses |s| as floating point number, and stores the result into
|
||||
// |res|. This function returns true if it succeeds.
|
||||
bool parseDoubleNoThrow(double& res, const std::string& s);
|
||||
|
||||
SegList<int> parseIntSegments(const std::string& src);
|
||||
|
||||
// Parses string which specifies the range of piece index for higher
|
||||
|
|
|
@ -328,10 +328,10 @@ void CookieStorageTest::testLoad()
|
|||
c = cookies[3];
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("TAX"), c->getName());
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("1000"), c->getValue());
|
||||
CPPUNIT_ASSERT((time_t)INT32_MAX <= c->getExpiryTime());
|
||||
CPPUNIT_ASSERT_EQUAL((time_t)1463304912, c->getExpiryTime());
|
||||
CPPUNIT_ASSERT(c->getPersistent());
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("/"), c->getPath());
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("overflow"), c->getDomain());
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("something"), c->getDomain());
|
||||
CPPUNIT_ASSERT(!c->getSecure());
|
||||
}
|
||||
|
||||
|
|
|
@ -69,9 +69,9 @@ void NsCookieParserTest::testParse()
|
|||
c = cookies[3].get();
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("TAX"), c->getName());
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("1000"), c->getValue());
|
||||
CPPUNIT_ASSERT((time_t)INT32_MAX <= c->getExpiryTime());
|
||||
CPPUNIT_ASSERT_EQUAL((time_t)1463304912, c->getExpiryTime());
|
||||
CPPUNIT_ASSERT(c->getPersistent());
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("overflow"), c->getDomain());
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("something"), c->getDomain());
|
||||
CPPUNIT_ASSERT(c->getHostOnly());
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("/"), c->getPath());
|
||||
CPPUNIT_ASSERT(!c->getSecure());
|
||||
|
|
|
@ -66,6 +66,7 @@ class UtilTest2 : public CppUnit::TestFixture {
|
|||
CPPUNIT_TEST(testInPrivateAddress);
|
||||
CPPUNIT_TEST(testSecfmt);
|
||||
CPPUNIT_TEST(testTlsHostnameMatch);
|
||||
CPPUNIT_TEST(testParseDoubleNoThrow);
|
||||
CPPUNIT_TEST_SUITE_END();
|
||||
|
||||
private:
|
||||
|
@ -115,6 +116,7 @@ public:
|
|||
void testInPrivateAddress();
|
||||
void testSecfmt();
|
||||
void testTlsHostnameMatch();
|
||||
void testParseDoubleNoThrow();
|
||||
};
|
||||
|
||||
CPPUNIT_TEST_SUITE_REGISTRATION(UtilTest2);
|
||||
|
@ -978,4 +980,21 @@ void UtilTest2::testTlsHostnameMatch()
|
|||
CPPUNIT_ASSERT(!util::tlsHostnameMatch("xn--*.a.b", "xn--c.a.b"));
|
||||
}
|
||||
|
||||
void UtilTest2::testParseDoubleNoThrow()
|
||||
{
|
||||
double n;
|
||||
|
||||
CPPUNIT_ASSERT(util::parseDoubleNoThrow(n, " 123 "));
|
||||
CPPUNIT_ASSERT_EQUAL(123., n);
|
||||
|
||||
CPPUNIT_ASSERT(util::parseDoubleNoThrow(n, "3.14"));
|
||||
CPPUNIT_ASSERT_EQUAL(3.14, n);
|
||||
|
||||
CPPUNIT_ASSERT(util::parseDoubleNoThrow(n, "-3.14"));
|
||||
CPPUNIT_ASSERT_EQUAL(-3.14, n);
|
||||
|
||||
CPPUNIT_ASSERT(!util::parseDoubleNoThrow(n, ""));
|
||||
CPPUNIT_ASSERT(!util::parseDoubleNoThrow(n, "123x"));
|
||||
}
|
||||
|
||||
} // namespace aria2
|
||||
|
|
|
@ -5,5 +5,5 @@ expired FALSE / FALSE 1000 user me
|
|||
|
||||
192.168.0.1 TRUE /cgi-bin FALSE 0 passwd secret
|
||||
badformat
|
||||
overflow FALSE / FALSE 9223372036854775807 TAX 1000
|
||||
.example.org TRUE / FALSE 2147483647 novalue
|
||||
something FALSE / FALSE 1463304912.5 TAX 1000
|
||||
.example.org TRUE / FALSE 2147483647.123 novalue
|
||||
|
|
Loading…
Reference in New Issue