Handle "..", "." in util::joinUri()

pull/1/head
Tatsuhiro Tsujikawa 2011-04-30 22:42:10 +09:00
parent 55d00d047c
commit 1122e55a35
2 changed files with 52 additions and 8 deletions

View File

@ -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;
} }
} }

View File

@ -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