diff --git a/ChangeLog b/ChangeLog index 9961a0a8..e3b6b8ae 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2010-04-03 Tatsuhiro Tsujikawa + + Fixed the bug that web-seed URI is not percent-encoded. + * src/a2functional.h + * src/bittorrent_helper.cc + * test/BittorrentHelperTest.cc + * test/url-list-multiFile.torrent + * test/url-list-singleFileEndsWithSlash.torrent + 2010-04-02 Tatsuhiro Tsujikawa Added aria2.shutdown and aria2.forceShutdown XML-RPC method. diff --git a/src/a2functional.h b/src/a2functional.h index 34e0ccf4..a4e7e7fe 100644 --- a/src/a2functional.h +++ b/src/a2functional.h @@ -221,6 +221,25 @@ std::string strjoin(InputIterator first, InputIterator last, return result; } +// Applies unaryOp through first to last and joins the result with +// delimiter delim. +template +std::string strjoin(InputIterator first, InputIterator last, + const DelimiterType& delim, const UnaryOp& unaryOp) +{ + std::string result; + if(first == last) { + return result; + } + InputIterator beforeLast = last-1; + for(; first != beforeLast; ++first) { + result += unaryOp(*first); + result += delim; + } + result += unaryOp(*beforeLast); + return result; +} + template inline std::string strconcat(const T1& a1, const T2& a2) { diff --git a/src/bittorrent_helper.cc b/src/bittorrent_helper.cc index ffc9decb..e9f0302a 100644 --- a/src/bittorrent_helper.cc +++ b/src/bittorrent_helper.cc @@ -254,8 +254,12 @@ static void extractFileEntries throw DL_ABORT_EX (StringFormat(MSG_DIR_TRAVERSAL_DETECTED, path.c_str()).str()); } + std::string pePath = + strjoin(pathelem.begin(), pathelem.end(), '/', + std::ptr_fun(static_cast + (util::percentEncode))); std::vector uris; - createUri(urlList.begin(), urlList.end(), std::back_inserter(uris), path); + createUri(urlList.begin(), urlList.end(),std::back_inserter(uris),pePath); SharedHandle fileEntry (new FileEntry(util::applyDir(ctx->getDir(), util::escapePath(path)), fileLengthData.i(), @@ -280,7 +284,7 @@ static void extractFileEntries for(std::vector::const_iterator i = urlList.begin(), eoi = urlList.end(); i != eoi; ++i) { if(util::endsWith(*i, A2STR::SLASH_C)) { - uris.push_back((*i)+name); + uris.push_back((*i)+util::percentEncode(name)); } else { uris.push_back(*i); } diff --git a/test/BittorrentHelperTest.cc b/test/BittorrentHelperTest.cc index 28ae4844..62b16259 100644 --- a/test/BittorrentHelperTest.cc +++ b/test/BittorrentHelperTest.cc @@ -351,24 +351,24 @@ void BittorrentHelperTest::testGetFileEntries_multiFileUrlList() { fileEntries.begin(); const SharedHandle& fileEntry1 = *itr; - CPPUNIT_ASSERT_EQUAL(std::string("./aria2-test/aria2/src/aria2c"), + CPPUNIT_ASSERT_EQUAL(std::string("./aria2-test@/aria2@/src@/aria2c@"), fileEntry1->getPath()); const std::deque& uris1 = fileEntry1->getRemainingUris(); CPPUNIT_ASSERT_EQUAL((size_t)2, uris1.size()); - CPPUNIT_ASSERT_EQUAL(std::string("http://localhost/dist/aria2-test/aria2/src/aria2c"), + CPPUNIT_ASSERT_EQUAL(std::string("http://localhost/dist/aria2-test%40/aria2%40/src%40/aria2c%40"), uris1[0]); - CPPUNIT_ASSERT_EQUAL(std::string("http://mirror/dist/aria2-test/aria2/src/aria2c"), + CPPUNIT_ASSERT_EQUAL(std::string("http://mirror/dist/aria2-test%40/aria2%40/src%40/aria2c%40"), uris1[1]); ++itr; const SharedHandle& fileEntry2 = *itr; - CPPUNIT_ASSERT_EQUAL(std::string("./aria2-test/aria2-0.2.2.tar.bz2"), + CPPUNIT_ASSERT_EQUAL(std::string("./aria2-test@/aria2-0.2.2.tar.bz2"), fileEntry2->getPath()); const std::deque& uris2 = fileEntry2->getRemainingUris(); CPPUNIT_ASSERT_EQUAL((size_t)2, uris2.size()); - CPPUNIT_ASSERT_EQUAL(std::string("http://localhost/dist/aria2-test/aria2-0.2.2.tar.bz2"), + CPPUNIT_ASSERT_EQUAL(std::string("http://localhost/dist/aria2-test%40/aria2-0.2.2.tar.bz2"), uris2[0]); - CPPUNIT_ASSERT_EQUAL(std::string("http://mirror/dist/aria2-test/aria2-0.2.2.tar.bz2"), + CPPUNIT_ASSERT_EQUAL(std::string("http://mirror/dist/aria2-test%40/aria2-0.2.2.tar.bz2"), uris2[1]); } @@ -400,11 +400,11 @@ void BittorrentHelperTest::testGetFileEntries_singleFileUrlListEndsWithSlash() { CPPUNIT_ASSERT_EQUAL((size_t)1, fileEntries.size()); const SharedHandle& fileEntry1 = fileEntries.front(); - CPPUNIT_ASSERT_EQUAL(std::string("./aria2.tar.bz2"), + CPPUNIT_ASSERT_EQUAL(std::string("./aria2@.tar.bz2"), fileEntry1->getPath()); const std::deque& uris1 = fileEntry1->getRemainingUris(); CPPUNIT_ASSERT_EQUAL((size_t)1, uris1.size()); - CPPUNIT_ASSERT_EQUAL(std::string("http://localhost/dist/aria2.tar.bz2"), + CPPUNIT_ASSERT_EQUAL(std::string("http://localhost/dist/aria2%40.tar.bz2"), uris1[0]); } diff --git a/test/url-list-multiFile.torrent b/test/url-list-multiFile.torrent index 5f7af667..354312df 100644 --- a/test/url-list-multiFile.torrent +++ b/test/url-list-multiFile.torrent @@ -1 +1 @@ -d8:url-listl22:http://localhost/dist/18:http://mirror/diste8:announce36:http://aria.rednoah.com/announce.php13:announce-listll15:http://tracker1el15:http://tracker2el15:http://tracker3ee7:comment17:REDNOAH.COM RULES13:creation datei1123456789e4:infod5:filesld6:lengthi284e4:pathl5:aria23:src6:aria2ceed6:lengthi100e4:pathl19:aria2-0.2.2.tar.bz2eee4:name10:aria2-test12:piece lengthi128e6:pieces60:AAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCCee \ No newline at end of file +d8:url-listl22:http://localhost/dist/18:http://mirror/diste8:announce36:http://aria.rednoah.com/announce.php13:announce-listll15:http://tracker1el15:http://tracker2el15:http://tracker3ee7:comment17:REDNOAH.COM RULES13:creation datei1123456789e4:infod5:filesld6:lengthi284e4:pathl6:aria2@4:src@7:aria2c@eed6:lengthi100e4:pathl19:aria2-0.2.2.tar.bz2eee4:name11:aria2-test@12:piece lengthi128e6:pieces60:AAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCCee \ No newline at end of file diff --git a/test/url-list-singleFileEndsWithSlash.torrent b/test/url-list-singleFileEndsWithSlash.torrent index 61e937c9..aa8a58f8 100644 --- a/test/url-list-singleFileEndsWithSlash.torrent +++ b/test/url-list-singleFileEndsWithSlash.torrent @@ -1 +1 @@ -d8:url-list22:http://localhost/dist/8:announce36:http://aria.rednoah.com/announce.php13:announce-listll15:http://tracker1el15:http://tracker2el15:http://tracker3ee7:comment17:REDNOAH.COM RULES13:creation datei1123456789e4:infod6:lengthi380e4:name13:aria2.tar.bz212:piece lengthi128e6:pieces60:AAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCCee \ No newline at end of file +d8:url-list22:http://localhost/dist/8:announce36:http://aria.rednoah.com/announce.php13:announce-listll15:http://tracker1el15:http://tracker2el15:http://tracker3ee7:comment17:REDNOAH.COM RULES13:creation datei1123456789e4:infod6:lengthi380e4:name14:aria2@.tar.bz212:piece lengthi128e6:pieces60:AAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCCee \ No newline at end of file