mirror of https://github.com/aria2/aria2
Use same domain-match algorithm for no-proxy and netrc.
Now "example.org" does not domain-match ".example.org" in both functions.pull/2/head
parent
69966d7ac9
commit
0ba6f8c352
|
@ -585,24 +585,6 @@ bool isProxyRequest
|
||||||
}
|
}
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
namespace {
|
|
||||||
class DomainMatch {
|
|
||||||
private:
|
|
||||||
std::string hostname_;
|
|
||||||
public:
|
|
||||||
DomainMatch(const std::string& hostname):hostname_(hostname) {}
|
|
||||||
|
|
||||||
bool operator()(const std::string& domain) const
|
|
||||||
{
|
|
||||||
if(util::startsWith(domain, A2STR::DOT_C)) {
|
|
||||||
return util::endsWith(hostname_, domain);
|
|
||||||
} else {
|
|
||||||
return util::endsWith(hostname_, A2STR::DOT_C+domain);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
bool inNoProxy(const SharedHandle<Request>& req,
|
bool inNoProxy(const SharedHandle<Request>& req,
|
||||||
const std::string& noProxy)
|
const std::string& noProxy)
|
||||||
|
@ -612,16 +594,11 @@ bool inNoProxy(const SharedHandle<Request>& req,
|
||||||
if(entries.empty()) {
|
if(entries.empty()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
DomainMatch domainMatch(A2STR::DOT_C+req->getHost());
|
|
||||||
for(std::vector<std::string>::const_iterator i = entries.begin(),
|
for(std::vector<std::string>::const_iterator i = entries.begin(),
|
||||||
eoi = entries.end(); i != eoi; ++i) {
|
eoi = entries.end(); i != eoi; ++i) {
|
||||||
std::string::size_type slashpos = (*i).find('/');
|
std::string::size_type slashpos = (*i).find('/');
|
||||||
if(slashpos == std::string::npos) {
|
if(slashpos == std::string::npos) {
|
||||||
if(util::isNumericHost(*i)) {
|
if(util::noProxyDomainMatch(req->getHost(), *i)) {
|
||||||
if(req->getHost() == *i) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
} else if(domainMatch(*i)) {
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
10
src/Netrc.cc
10
src/Netrc.cc
|
@ -63,15 +63,7 @@ Authenticator::~Authenticator() {}
|
||||||
|
|
||||||
bool Authenticator::match(const std::string& hostname) const
|
bool Authenticator::match(const std::string& hostname) const
|
||||||
{
|
{
|
||||||
if(util::isNumericHost(hostname)) {
|
return util::noProxyDomainMatch(hostname, machine_);
|
||||||
return hostname == machine_;
|
|
||||||
} else {
|
|
||||||
if(util::startsWith(machine_, A2STR::DOT_C)) {
|
|
||||||
return util::endsWith(A2STR::DOT_C+hostname, machine_);
|
|
||||||
} else {
|
|
||||||
return hostname == machine_;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Authenticator::setMachine(const std::string& machine)
|
void Authenticator::setMachine(const std::string& machine)
|
||||||
|
|
12
src/util.cc
12
src/util.cc
|
@ -1752,6 +1752,18 @@ std::string safeStrerror(int errNum)
|
||||||
return makeString(strerror(errNum));
|
return makeString(strerror(errNum));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool noProxyDomainMatch
|
||||||
|
(const std::string& hostname,
|
||||||
|
const std::string& domain)
|
||||||
|
{
|
||||||
|
if(!util::isNumericHost(hostname) &&
|
||||||
|
util::startsWith(domain, A2STR::DOT_C)) {
|
||||||
|
return util::endsWith(hostname, domain);
|
||||||
|
} else {
|
||||||
|
return hostname == domain;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace util
|
} // namespace util
|
||||||
|
|
||||||
} // namespace aria2
|
} // namespace aria2
|
||||||
|
|
11
src/util.h
11
src/util.h
|
@ -520,6 +520,17 @@ SharedHandle<T> copy(const SharedHandle<T>& a)
|
||||||
return SharedHandle<T>(new T(*a.get()));
|
return SharedHandle<T>(new T(*a.get()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This is a bit different from cookie_helper::domainMatch(). If
|
||||||
|
// hostname is numeric host, then returns true if domain == hostname.
|
||||||
|
// That is if domain starts with ".", then returns true if domain is a
|
||||||
|
// suffix of hostname. If domain does not start with ".", then
|
||||||
|
// returns true if domain == hostname. Otherwise returns true.
|
||||||
|
// For example,
|
||||||
|
//
|
||||||
|
// * noProxyDomainMatch("aria2.sf.net", ".sf.net") returns true.
|
||||||
|
// * noProxyDomainMatch("sf.net", ".sf.net") returns false.
|
||||||
|
bool noProxyDomainMatch(const std::string& hostname, const std::string& domain);
|
||||||
|
|
||||||
} // namespace util
|
} // namespace util
|
||||||
|
|
||||||
} // namespace aria2
|
} // namespace aria2
|
||||||
|
|
|
@ -64,7 +64,7 @@ void NetrcTest::testFindAuthenticator()
|
||||||
SharedHandle<Authenticator> domainMatchAuth2 =
|
SharedHandle<Authenticator> domainMatchAuth2 =
|
||||||
netrc.findAuthenticator("my.domain");
|
netrc.findAuthenticator("my.domain");
|
||||||
CPPUNIT_ASSERT(domainMatchAuth2);
|
CPPUNIT_ASSERT(domainMatchAuth2);
|
||||||
CPPUNIT_ASSERT_EQUAL(std::string("dmname"), domainMatchAuth2->getLogin());
|
CPPUNIT_ASSERT_EQUAL(std::string("default"), domainMatchAuth2->getLogin());
|
||||||
}
|
}
|
||||||
|
|
||||||
void NetrcTest::testParse()
|
void NetrcTest::testParse()
|
||||||
|
|
|
@ -74,6 +74,7 @@ class UtilTest:public CppUnit::TestFixture {
|
||||||
CPPUNIT_TEST(testInSameCidrBlock);
|
CPPUNIT_TEST(testInSameCidrBlock);
|
||||||
CPPUNIT_TEST(testIsUtf8String);
|
CPPUNIT_TEST(testIsUtf8String);
|
||||||
CPPUNIT_TEST(testNextParam);
|
CPPUNIT_TEST(testNextParam);
|
||||||
|
CPPUNIT_TEST(testNoProxyDomainMatch);
|
||||||
CPPUNIT_TEST_SUITE_END();
|
CPPUNIT_TEST_SUITE_END();
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
@ -133,6 +134,7 @@ public:
|
||||||
void testInSameCidrBlock();
|
void testInSameCidrBlock();
|
||||||
void testIsUtf8String();
|
void testIsUtf8String();
|
||||||
void testNextParam();
|
void testNextParam();
|
||||||
|
void testNoProxyDomainMatch();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -1277,4 +1279,15 @@ void UtilTest::testNextParam()
|
||||||
CPPUNIT_ASSERT(!r.second);
|
CPPUNIT_ASSERT(!r.second);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void UtilTest::testNoProxyDomainMatch()
|
||||||
|
{
|
||||||
|
CPPUNIT_ASSERT(util::noProxyDomainMatch("localhost", "localhost"));
|
||||||
|
CPPUNIT_ASSERT(util::noProxyDomainMatch("192.168.0.1", "192.168.0.1"));
|
||||||
|
CPPUNIT_ASSERT(util::noProxyDomainMatch("www.example.org", ".example.org"));
|
||||||
|
CPPUNIT_ASSERT(!util::noProxyDomainMatch("www.example.org", "example.org"));
|
||||||
|
CPPUNIT_ASSERT(!util::noProxyDomainMatch("192.168.0.1", "0.1"));
|
||||||
|
CPPUNIT_ASSERT(!util::noProxyDomainMatch("example.org", "example.com"));
|
||||||
|
CPPUNIT_ASSERT(!util::noProxyDomainMatch("example.org", "www.example.org"));
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace aria2
|
} // namespace aria2
|
||||||
|
|
Loading…
Reference in New Issue