浏览代码

2009-04-27 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>

	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
Tatsuhiro Tsujikawa 16 年之前
父节点
当前提交
d58742ad21
共有 4 个文件被更改,包括 49 次插入2 次删除
  1. 9 0
      ChangeLog
  2. 14 1
      src/DefaultBtContext.cc
  3. 6 0
      src/RequestGroup.cc
  4. 20 1
      test/DefaultBtContextTest.cc

+ 9 - 0
ChangeLog

@@ -1,3 +1,12 @@
+2009-04-27  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
+
+	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  <t-tujikawa@users.sourceforge.net>
 
 	Rewritten expr

+ 14 - 1
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<std::string> 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<std::string> uris;
+    for(std::deque<std::string>::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> fileEntry
       (new FileEntry(_dir+"/"+Util::joinPath(pathelems.begin(),pathelems.end()),
-		     totalLength, 0, urlList));
+		     totalLength, 0, uris));
     fileEntries.push_back(fileEntry);
   }
 }

+ 6 - 0
src/RequestGroup.cc

@@ -226,6 +226,12 @@ void RequestGroup::createInitialCommand(std::deque<Command*>& commands,
 	_uris.clear();
 
 	_pieceStorage->setFileFilter(btContext->getFileFilter());
+      } else if(btContext->getFileEntries().size() == 1) {
+	// web-seeding is only enabled for single file torrent
+	SharedHandle<FileEntry> fileEntry = btContext->getFileEntries().front();
+	_uris.insert(_uris.end(),
+		     fileEntry->getAssociatedUris().begin(),
+		     fileEntry->getAssociatedUris().end());
       }
       
       SharedHandle<DefaultBtProgressInfoFile>

+ 20 - 1
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<SharedHandle<FileEntry> > fileEntries = btContext.getFileEntries();
+  // There are 1 file entries.
+  CPPUNIT_ASSERT_EQUAL((size_t)1, fileEntries.size());
+
+  SharedHandle<FileEntry> fileEntry1 = fileEntries.front();
+  CPPUNIT_ASSERT_EQUAL(std::string("./aria2.tar.bz2"),
+		       fileEntry1->getPath());
+  std::deque<std::string> 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<SharedHandle<FileEntry> > fileEntries = btContext.getFileEntries();
   // There are 1 file entries.
   CPPUNIT_ASSERT_EQUAL((size_t)1, fileEntries.size());