From d58742ad21407362db34d508ceef8b7b21088bb1 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Mon, 27 Apr 2009 06:55:10 +0000 Subject: [PATCH] 2009-04-27 Tatsuhiro Tsujikawa Use url-list (web-seeding) only for single-file torrent. This is basically the same behavior with Metalink file with torrent and URIs. * src/RequestGroup.cc * src/DefaultBtContext.cc * test/DefaultBtContextTest.cc --- ChangeLog | 9 +++++++++ src/DefaultBtContext.cc | 15 ++++++++++++++- src/RequestGroup.cc | 6 ++++++ test/DefaultBtContextTest.cc | 21 ++++++++++++++++++++- 4 files changed, 49 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index a6413883..e4934a78 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2009-04-27 Tatsuhiro Tsujikawa + + Use url-list (web-seeding) only for single-file torrent. This is + basically the same behavior with Metalink file with torrent and + URIs. + * src/RequestGroup.cc + * src/DefaultBtContext.cc + * test/DefaultBtContextTest.cc + 2009-04-26 Tatsuhiro Tsujikawa Rewritten expr diff --git a/src/DefaultBtContext.cc b/src/DefaultBtContext.cc index 1f6d28ad..99b8beef 100644 --- a/src/DefaultBtContext.cc +++ b/src/DefaultBtContext.cc @@ -183,9 +183,22 @@ void DefaultBtContext::extractFileEntries(const bencode::BDE& infoDict, // Slice path by '/' just in case nasty ".." is included in name std::deque pathelems; Util::slice(pathelems, name, '/'); + + // For each uri in urlList, if it ends with '/', then + // concatenate name to it. Specification just says so. + std::deque uris; + for(std::deque::const_iterator i = urlList.begin(); + i != urlList.end(); ++i) { + if(Util::endsWith(*i, "/")) { + uris.push_back((*i)+name); + } else { + uris.push_back(*i); + } + } + SharedHandle fileEntry (new FileEntry(_dir+"/"+Util::joinPath(pathelems.begin(),pathelems.end()), - totalLength, 0, urlList)); + totalLength, 0, uris)); fileEntries.push_back(fileEntry); } } diff --git a/src/RequestGroup.cc b/src/RequestGroup.cc index 871c0d41..a33d179c 100644 --- a/src/RequestGroup.cc +++ b/src/RequestGroup.cc @@ -226,6 +226,12 @@ void RequestGroup::createInitialCommand(std::deque& commands, _uris.clear(); _pieceStorage->setFileFilter(btContext->getFileFilter()); + } else if(btContext->getFileEntries().size() == 1) { + // web-seeding is only enabled for single file torrent + SharedHandle fileEntry = btContext->getFileEntries().front(); + _uris.insert(_uris.end(), + fileEntry->getAssociatedUris().begin(), + fileEntry->getAssociatedUris().end()); } SharedHandle diff --git a/test/DefaultBtContextTest.cc b/test/DefaultBtContextTest.cc index 81362710..2548480a 100644 --- a/test/DefaultBtContextTest.cc +++ b/test/DefaultBtContextTest.cc @@ -36,6 +36,7 @@ class DefaultBtContextTest:public CppUnit::TestFixture { CPPUNIT_TEST(testComputeFastSet); CPPUNIT_TEST(testGetFileEntries_multiFileUrlList); CPPUNIT_TEST(testGetFileEntries_singleFileUrlList); + CPPUNIT_TEST(testGetFileEntries_singleFileUrlListEndsWithSlash); CPPUNIT_TEST(testLoadFromMemory); CPPUNIT_TEST(testLoadFromMemory_somethingMissing); CPPUNIT_TEST(testLoadFromMemory_overrideName); @@ -66,6 +67,7 @@ public: void testComputeFastSet(); void testGetFileEntries_multiFileUrlList(); void testGetFileEntries_singleFileUrlList(); + void testGetFileEntries_singleFileUrlListEndsWithSlash(); void testLoadFromMemory(); void testLoadFromMemory_somethingMissing(); void testLoadFromMemory_overrideName(); @@ -317,7 +319,24 @@ void DefaultBtContextTest::testGetFileEntries_multiFileUrlList() { void DefaultBtContextTest::testGetFileEntries_singleFileUrlList() { DefaultBtContext btContext; btContext.load("url-list-singleFile.torrent"); - // This is multi-file torrent. + // This is single-file torrent. + std::deque > fileEntries = btContext.getFileEntries(); + // There are 1 file entries. + CPPUNIT_ASSERT_EQUAL((size_t)1, fileEntries.size()); + + SharedHandle fileEntry1 = fileEntries.front(); + CPPUNIT_ASSERT_EQUAL(std::string("./aria2.tar.bz2"), + fileEntry1->getPath()); + std::deque uris1 = fileEntry1->getAssociatedUris(); + CPPUNIT_ASSERT_EQUAL((size_t)1, uris1.size()); + CPPUNIT_ASSERT_EQUAL(std::string("http://localhost/dist/aria2.tar.bz2"), + uris1[0]); +} + +void DefaultBtContextTest::testGetFileEntries_singleFileUrlListEndsWithSlash() { + DefaultBtContext btContext; + btContext.load("url-list-singleFileEndsWithSlash.torrent"); + // This is single-file torrent. std::deque > fileEntries = btContext.getFileEntries(); // There are 1 file entries. CPPUNIT_ASSERT_EQUAL((size_t)1, fileEntries.size());