mirror of https://github.com/aria2/aria2
Moved joinUri from util namespace to uri namespace.
parent
11d7e4fa46
commit
e7d7233d54
42
src/uri.cc
42
src/uri.cc
|
@ -295,6 +295,48 @@ std::string construct(const UriStruct& us)
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string joinUri(const std::string& baseUri, const std::string& uri)
|
||||||
|
{
|
||||||
|
UriStruct us;
|
||||||
|
if(parse(us, uri)) {
|
||||||
|
return uri;
|
||||||
|
} else {
|
||||||
|
UriStruct bus;
|
||||||
|
if(!parse(bus, baseUri)) {
|
||||||
|
return uri;
|
||||||
|
}
|
||||||
|
std::vector<std::string> parts;
|
||||||
|
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.query.clear();
|
||||||
|
std::string res = construct(bus);
|
||||||
|
res += util::joinPath(parts.begin(), parts.end());
|
||||||
|
if((path.empty() || util::endsWith(path, "/")) &&
|
||||||
|
!util::endsWith(res, "/")) {
|
||||||
|
res += "/";
|
||||||
|
}
|
||||||
|
res += std::string(end, qend);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace uri
|
} // namespace uri
|
||||||
|
|
||||||
} // namespace aria2
|
} // namespace aria2
|
||||||
|
|
|
@ -72,6 +72,8 @@ bool parse(UriStruct& result, const std::string& uri);
|
||||||
|
|
||||||
std::string construct(const UriStruct& us);
|
std::string construct(const UriStruct& us);
|
||||||
|
|
||||||
|
std::string joinUri(const std::string& baseUri, const std::string& uri);
|
||||||
|
|
||||||
} // namespace uri
|
} // namespace uri
|
||||||
|
|
||||||
} // namespace aria2
|
} // namespace aria2
|
||||||
|
|
43
src/util.cc
43
src/util.cc
|
@ -81,7 +81,6 @@
|
||||||
#include "Logger.h"
|
#include "Logger.h"
|
||||||
#include "Option.h"
|
#include "Option.h"
|
||||||
#include "DownloadContext.h"
|
#include "DownloadContext.h"
|
||||||
#include "uri.h"
|
|
||||||
|
|
||||||
#ifdef ENABLE_MESSAGE_DIGEST
|
#ifdef ENABLE_MESSAGE_DIGEST
|
||||||
# include "MessageDigest.h"
|
# include "MessageDigest.h"
|
||||||
|
@ -1584,48 +1583,6 @@ std::string safeStrerror(int errNum)
|
||||||
return makeString(strerror(errNum));
|
return makeString(strerror(errNum));
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string joinUri(const std::string& baseUri, const std::string& uri)
|
|
||||||
{
|
|
||||||
uri::UriStruct us;
|
|
||||||
if(uri::parse(us, uri)) {
|
|
||||||
return uri;
|
|
||||||
} else {
|
|
||||||
uri::UriStruct bus;
|
|
||||||
if(!uri::parse(bus, baseUri)) {
|
|
||||||
return uri;
|
|
||||||
}
|
|
||||||
std::vector<std::string> parts;
|
|
||||||
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.query.clear();
|
|
||||||
std::string res = uri::construct(bus);
|
|
||||||
res += util::joinPath(parts.begin(), parts.end());
|
|
||||||
if((path.empty() || util::endsWith(path, "/")) &&
|
|
||||||
!util::endsWith(res, "/")) {
|
|
||||||
res += "/";
|
|
||||||
}
|
|
||||||
res += std::string(end, qend);
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace util
|
} // namespace util
|
||||||
|
|
||||||
} // namespace aria2
|
} // namespace aria2
|
||||||
|
|
|
@ -324,8 +324,6 @@ std::string joinPath(InputIterator first, InputIterator last)
|
||||||
return strjoin(elements.begin(), elements.end(), "/");
|
return strjoin(elements.begin(), elements.end(), "/");
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string joinUri(const std::string& baseUri, const std::string& uri);
|
|
||||||
|
|
||||||
// Parses INDEX=PATH format string. INDEX must be an unsigned
|
// Parses INDEX=PATH format string. INDEX must be an unsigned
|
||||||
// integer.
|
// integer.
|
||||||
std::map<size_t, std::string>::value_type
|
std::map<size_t, std::string>::value_type
|
||||||
|
|
|
@ -35,6 +35,7 @@ class UriTest:public CppUnit::TestFixture {
|
||||||
CPPUNIT_TEST(testInnerLink);
|
CPPUNIT_TEST(testInnerLink);
|
||||||
CPPUNIT_TEST(testConstruct);
|
CPPUNIT_TEST(testConstruct);
|
||||||
CPPUNIT_TEST(testSwap);
|
CPPUNIT_TEST(testSwap);
|
||||||
|
CPPUNIT_TEST(testJoinUri);
|
||||||
CPPUNIT_TEST_SUITE_END();
|
CPPUNIT_TEST_SUITE_END();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -64,6 +65,7 @@ public:
|
||||||
void testInnerLink();
|
void testInnerLink();
|
||||||
void testConstruct();
|
void testConstruct();
|
||||||
void testSwap();
|
void testSwap();
|
||||||
|
void testJoinUri();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -485,6 +487,68 @@ void UriTest::testSwap()
|
||||||
construct(us2));
|
construct(us2));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void UriTest::testJoinUri()
|
||||||
|
{
|
||||||
|
CPPUNIT_ASSERT_EQUAL(std::string("http://host/dir/file"),
|
||||||
|
joinUri("http://base/d/f",
|
||||||
|
"http://host/dir/file"));
|
||||||
|
|
||||||
|
CPPUNIT_ASSERT_EQUAL(std::string("http://base/dir/file"),
|
||||||
|
joinUri("http://base/d/f",
|
||||||
|
"/dir/file"));
|
||||||
|
|
||||||
|
CPPUNIT_ASSERT_EQUAL(std::string("http://base/d/dir/file"),
|
||||||
|
joinUri("http://base/d/f",
|
||||||
|
"dir/file"));
|
||||||
|
|
||||||
|
CPPUNIT_ASSERT_EQUAL(std::string("http://base/d/"),
|
||||||
|
joinUri("http://base/d/f",
|
||||||
|
""));
|
||||||
|
|
||||||
|
CPPUNIT_ASSERT_EQUAL(std::string("http://base/d/dir/file?q=k"),
|
||||||
|
joinUri("http://base/d/f",
|
||||||
|
"dir/file?q=k"));
|
||||||
|
|
||||||
|
CPPUNIT_ASSERT_EQUAL(std::string("dir/file"),
|
||||||
|
joinUri("baduri", "dir/file"));
|
||||||
|
|
||||||
|
CPPUNIT_ASSERT_EQUAL(std::string("http://base/a/b/d/file"),
|
||||||
|
joinUri("http://base/a/b/c/x",
|
||||||
|
"../d/file"));
|
||||||
|
|
||||||
|
CPPUNIT_ASSERT_EQUAL(std::string("http://base/a/b/file"),
|
||||||
|
joinUri("http://base/c/x",
|
||||||
|
"../../a/b/file"));
|
||||||
|
|
||||||
|
CPPUNIT_ASSERT_EQUAL(std::string("http://base/"),
|
||||||
|
joinUri("http://base/c/x",
|
||||||
|
"../.."));
|
||||||
|
|
||||||
|
CPPUNIT_ASSERT_EQUAL(std::string("http://base/"),
|
||||||
|
joinUri("http://base/c/x",
|
||||||
|
".."));
|
||||||
|
|
||||||
|
CPPUNIT_ASSERT_EQUAL(std::string("http://base/a/file"),
|
||||||
|
joinUri("http://base/b/c/x",
|
||||||
|
"/a/x/../file"));
|
||||||
|
|
||||||
|
CPPUNIT_ASSERT_EQUAL(std::string("http://base/file"),
|
||||||
|
joinUri("http://base/f/?q=k",
|
||||||
|
"/file"));
|
||||||
|
|
||||||
|
CPPUNIT_ASSERT_EQUAL(std::string("http://base/file?q=/"),
|
||||||
|
joinUri("http://base/",
|
||||||
|
"/file?q=/"));
|
||||||
|
|
||||||
|
CPPUNIT_ASSERT_EQUAL(std::string("http://base/file?q=v"),
|
||||||
|
joinUri("http://base/",
|
||||||
|
"/file?q=v#a?q=x"));
|
||||||
|
|
||||||
|
CPPUNIT_ASSERT_EQUAL(std::string("http://base/file"),
|
||||||
|
joinUri("http://base/",
|
||||||
|
"/file#a?q=x"));
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace uri
|
} // namespace uri
|
||||||
|
|
||||||
} // namespace aria2
|
} // namespace aria2
|
||||||
|
|
|
@ -71,7 +71,6 @@ class UtilTest:public CppUnit::TestFixture {
|
||||||
CPPUNIT_TEST(testGetCidrPrefix);
|
CPPUNIT_TEST(testGetCidrPrefix);
|
||||||
CPPUNIT_TEST(testInSameCidrBlock);
|
CPPUNIT_TEST(testInSameCidrBlock);
|
||||||
CPPUNIT_TEST(testIsUtf8String);
|
CPPUNIT_TEST(testIsUtf8String);
|
||||||
CPPUNIT_TEST(testJoinUri);
|
|
||||||
CPPUNIT_TEST_SUITE_END();
|
CPPUNIT_TEST_SUITE_END();
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
@ -131,7 +130,6 @@ public:
|
||||||
void testGetCidrPrefix();
|
void testGetCidrPrefix();
|
||||||
void testInSameCidrBlock();
|
void testInSameCidrBlock();
|
||||||
void testIsUtf8String();
|
void testIsUtf8String();
|
||||||
void testJoinUri();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -1249,52 +1247,4 @@ void UtilTest::testIsUtf8String()
|
||||||
CPPUNIT_ASSERT(!util::isUtf8(util::fromHex("00")));
|
CPPUNIT_ASSERT(!util::isUtf8(util::fromHex("00")));
|
||||||
}
|
}
|
||||||
|
|
||||||
void UtilTest::testJoinUri()
|
|
||||||
{
|
|
||||||
CPPUNIT_ASSERT_EQUAL(std::string("http://host/dir/file"),
|
|
||||||
util::joinUri("http://base/d/f",
|
|
||||||
"http://host/dir/file"));
|
|
||||||
CPPUNIT_ASSERT_EQUAL(std::string("http://base/dir/file"),
|
|
||||||
util::joinUri("http://base/d/f",
|
|
||||||
"/dir/file"));
|
|
||||||
CPPUNIT_ASSERT_EQUAL(std::string("http://base/d/dir/file"),
|
|
||||||
util::joinUri("http://base/d/f",
|
|
||||||
"dir/file"));
|
|
||||||
CPPUNIT_ASSERT_EQUAL(std::string("http://base/d/"),
|
|
||||||
util::joinUri("http://base/d/f",
|
|
||||||
""));
|
|
||||||
CPPUNIT_ASSERT_EQUAL(std::string("http://base/d/dir/file?q=k"),
|
|
||||||
util::joinUri("http://base/d/f",
|
|
||||||
"dir/file?q=k"));
|
|
||||||
CPPUNIT_ASSERT_EQUAL(std::string("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