mirror of https://github.com/aria2/aria2
Handle "..", "." in util::joinUri()
parent
55d00d047c
commit
1122e55a35
33
src/util.cc
33
src/util.cc
|
@ -1594,18 +1594,35 @@ std::string joinUri(const std::string& baseUri, const std::string& uri)
|
||||||
if(!uri::parse(bus, baseUri)) {
|
if(!uri::parse(bus, baseUri)) {
|
||||||
return uri;
|
return uri;
|
||||||
}
|
}
|
||||||
if(util::startsWith(uri, "/")) {
|
std::vector<std::string> parts;
|
||||||
bus.dir.clear();
|
if(!util::startsWith(uri, "/")) {
|
||||||
|
util::split(bus.dir, std::back_inserter(parts), "/");
|
||||||
}
|
}
|
||||||
|
std::string::const_iterator qend;
|
||||||
|
for(qend = uri.begin(); qend != uri.end(); ++qend) {
|
||||||
|
if(*qend == '#') {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
std::string::const_iterator end;
|
||||||
|
for(end = uri.begin(); end != qend; ++end) {
|
||||||
|
if(*end == '?') {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
std::string path(uri.begin(), end);
|
||||||
|
util::split(path, std::back_inserter(parts), "/");
|
||||||
|
bus.dir.clear();
|
||||||
bus.file.clear();
|
bus.file.clear();
|
||||||
bus.query.clear();
|
bus.query.clear();
|
||||||
std::string newUri = construct(bus);
|
std::string res = uri::construct(bus);
|
||||||
if(util::startsWith(uri, "/")) {
|
res += util::joinPath(parts.begin(), parts.end());
|
||||||
newUri += uri.substr(1);
|
if((path.empty() || util::endsWith(path, "/")) &&
|
||||||
} else {
|
!util::endsWith(res, "/")) {
|
||||||
newUri += uri;
|
res += "/";
|
||||||
}
|
}
|
||||||
return newUri;
|
res += std::string(end, qend);
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1268,6 +1268,33 @@ void UtilTest::testJoinUri()
|
||||||
"dir/file?q=k"));
|
"dir/file?q=k"));
|
||||||
CPPUNIT_ASSERT_EQUAL(std::string("dir/file"),
|
CPPUNIT_ASSERT_EQUAL(std::string("dir/file"),
|
||||||
util::joinUri("baduri", "dir/file"));
|
util::joinUri("baduri", "dir/file"));
|
||||||
|
CPPUNIT_ASSERT_EQUAL(std::string("http://base/a/b/d/file"),
|
||||||
|
util::joinUri("http://base/a/b/c/x",
|
||||||
|
"../d/file"));
|
||||||
|
CPPUNIT_ASSERT_EQUAL(std::string("http://base/a/b/file"),
|
||||||
|
util::joinUri("http://base/c/x",
|
||||||
|
"../../a/b/file"));
|
||||||
|
CPPUNIT_ASSERT_EQUAL(std::string("http://base/"),
|
||||||
|
util::joinUri("http://base/c/x",
|
||||||
|
"../.."));
|
||||||
|
CPPUNIT_ASSERT_EQUAL(std::string("http://base/"),
|
||||||
|
util::joinUri("http://base/c/x",
|
||||||
|
".."));
|
||||||
|
CPPUNIT_ASSERT_EQUAL(std::string("http://base/a/file"),
|
||||||
|
util::joinUri("http://base/b/c/x",
|
||||||
|
"/a/x/../file"));
|
||||||
|
CPPUNIT_ASSERT_EQUAL(std::string("http://base/file"),
|
||||||
|
util::joinUri("http://base/f/?q=k",
|
||||||
|
"/file"));
|
||||||
|
CPPUNIT_ASSERT_EQUAL(std::string("http://base/file?q=/"),
|
||||||
|
util::joinUri("http://base/",
|
||||||
|
"/file?q=/"));
|
||||||
|
CPPUNIT_ASSERT_EQUAL(std::string("http://base/file?q=v"),
|
||||||
|
util::joinUri("http://base/",
|
||||||
|
"/file?q=v#a?q=x"));
|
||||||
|
CPPUNIT_ASSERT_EQUAL(std::string("http://base/file"),
|
||||||
|
util::joinUri("http://base/",
|
||||||
|
"/file#a?q=x"));
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace aria2
|
} // namespace aria2
|
||||||
|
|
Loading…
Reference in New Issue