Преглед изворни кода

Rewritten DownloadHandlerConstants

DownloadHandlerConstants was simplified.  MIME type handling in Accept
header was also reworked.  DownloadContext's metalinkServerContacted_
is replaced with acceptMetalink_ and its boolean value is reverted.
RequestGroup and HttpRequest now do not hold vector of accepting
types.  HttpRequest has the flag acceptMetalink_ which will be set by
the same value of DownloadContext::accpetMetalink_ and if it is true,
Metalink MIME types are added to Accept header field.
Tatsuhiro Tsujikawa пре 13 година
родитељ
комит
461a542c5e

+ 1 - 4
src/BtPostDownloadHandler.cc

@@ -59,10 +59,7 @@ BtPostDownloadHandler::BtPostDownloadHandler()
 {
   SharedHandle<RequestGroupCriteria> cri
     (new ContentTypeRequestGroupCriteria
-     (DownloadHandlerConstants::getBtContentTypes().begin(),
-      DownloadHandlerConstants::getBtContentTypes().end(),
-      DownloadHandlerConstants::getBtExtensions().begin(),
-      DownloadHandlerConstants::getBtExtensions().end()));
+     (getBtContentTypes(), getBtExtensions()));
   setCriteria(cri);
 }
 

+ 18 - 23
src/ContentTypeRequestGroupCriteria.cc

@@ -34,8 +34,6 @@
 /* copyright --> */
 #include "ContentTypeRequestGroupCriteria.h"
 
-#include <algorithm>
-
 #include "RequestGroup.h"
 #include "util.h"
 #include "FileEntry.h"
@@ -43,19 +41,13 @@
 
 namespace aria2 {
 
-namespace {
-template<typename InputIterator>
-bool tailMatch
-(InputIterator first, InputIterator last, const std::string& target)
-{
-  for(; first != last; ++first) {
-    if(util::endsWith(target, *first)) {
-      return true;
-    }
-  }
-  return false;
-}
-} // namespace
+ContentTypeRequestGroupCriteria::ContentTypeRequestGroupCriteria
+(const char** contentTypes, const char** extensions)
+  : contentTypes_(contentTypes),
+    extensions_(extensions)
+{}
+
+ContentTypeRequestGroupCriteria::~ContentTypeRequestGroupCriteria() {}
 
 bool ContentTypeRequestGroupCriteria::match
 (const RequestGroup* requestGroup) const
@@ -63,15 +55,18 @@ bool ContentTypeRequestGroupCriteria::match
   if(requestGroup->getDownloadContext()->getFileEntries().size() != 1) {
     return false;
   }
-  if(tailMatch(extensions_.begin(), extensions_.end(),
-               requestGroup->getFirstFilePath())) {
-    return true;
-  } else {
-    return
-      std::find(contentTypes_.begin(), contentTypes_.end(),
-                requestGroup->getDownloadContext()->getFirstFileEntry()->
-                getContentType()) != contentTypes_.end();
+  for(size_t i = 0; extensions_[i]; ++i) {
+    if(util::iendsWith(requestGroup->getFirstFilePath(), extensions_[i])) {
+      return true;
+    }
   }
+  for(size_t i = 0; contentTypes_[i]; ++i) {
+    if(util::strieq(requestGroup->getDownloadContext()->getFirstFileEntry()->
+                    getContentType(), contentTypes_[i])) {
+      return true;
+    }
+  }
+  return false;
 }
 
 } // namespace aria2

+ 6 - 9
src/ContentTypeRequestGroupCriteria.h

@@ -44,16 +44,13 @@ namespace aria2 {
 class ContentTypeRequestGroupCriteria:public RequestGroupCriteria
 {
 private:
-  std::vector<std::string> contentTypes_;
-  std::vector<std::string> extensions_;
+  const char** contentTypes_;
+  const char** extensions_;
 public:
-  template<typename InputIterator>
-  ContentTypeRequestGroupCriteria(InputIterator contentTypeFirst,
-                                  InputIterator contentTypeLast,
-                                  InputIterator extensionFirst,
-                                  InputIterator extensionLast):
-    contentTypes_(contentTypeFirst, contentTypeLast),
-    extensions_(extensionFirst, extensionLast) {}
+  ContentTypeRequestGroupCriteria(const char** contentTypes,
+                                  const char** extensions);
+
+  virtual ~ContentTypeRequestGroupCriteria();
 
   virtual bool match(const RequestGroup* requestGroup) const;
 };

+ 2 - 2
src/DownloadContext.cc

@@ -54,7 +54,7 @@ DownloadContext::DownloadContext():
   attrs_(MAX_CTX_ATTR),
   downloadStartTime_(0),
   downloadStopTime_(downloadStartTime_),
-  metalinkServerContacted_(false) {}
+  acceptMetalink_(true) {}
 
 DownloadContext::DownloadContext(int32_t pieceLength,
                                  int64_t totalLength,
@@ -66,7 +66,7 @@ DownloadContext::DownloadContext(int32_t pieceLength,
   attrs_(MAX_CTX_ATTR),
   downloadStartTime_(0),
   downloadStopTime_(0),
-  metalinkServerContacted_(false)
+  acceptMetalink_(true)
 {
   SharedHandle<FileEntry> fileEntry(new FileEntry(path, totalLength, 0));
   fileEntries_.push_back(fileEntry);

+ 7 - 7
src/DownloadContext.h

@@ -84,9 +84,9 @@ private:
   Timer downloadStopTime_;
 
   SharedHandle<Signature> signature_;
-  // This member variable is required to avoid to parse Metalink/HTTP
-  // Link header fields multiple times.
-  bool metalinkServerContacted_;
+  // This member variable is required to avoid to use parse Metalink
+  // (including both Metalink XML and Metalink/HTTP) twice.
+  bool acceptMetalink_;
 public:
   DownloadContext();
 
@@ -226,13 +226,13 @@ public:
 
   void releaseRuntimeResource();
 
-  void setMetalinkServerContacted(bool f)
+  void setAcceptMetalink(bool f)
   {
-    metalinkServerContacted_ = f;
+    acceptMetalink_ = f;
   }
-  bool getMetalinkServerContacted() const
+  bool getAcceptMetalink() const
   {
-    return metalinkServerContacted_;
+    return acceptMetalink_;
   }
 };
 

+ 35 - 32
src/DownloadHandlerConstants.cc

@@ -2,7 +2,7 @@
 /*
  * aria2 - The high speed download utility
  *
- * Copyright (C) 2006 Tatsuhiro Tsujikawa
+ * Copyright (C) 2012 Tatsuhiro Tsujikawa
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -33,54 +33,57 @@
  */
 /* copyright --> */
 #include "DownloadHandlerConstants.h"
-#include "array_fun.h"
 
 namespace aria2 {
 
-const char* DownloadHandlerConstants::METALINK_EXTENSIONS[] = {
+namespace {
+const char* METALINK_EXTENSIONS[] = {
   ".metalink", // Metalink3Spec
-  ".meta4" // Metalink4Spec
+  ".meta4", // Metalink4Spec
+  0
 };
+} // namespace
 
-const char* DownloadHandlerConstants::METALINK_CONTENT_TYPES[] = {
-  "application/metalink4+xml", // Metalink4Spec
-  "application/metalink+xml" // Metalink3Spec
-};
-
-const char* DownloadHandlerConstants::BT_EXTENSIONS[] = { ".torrent" };
+const char** getMetalinkExtensions()
+{
+  return METALINK_EXTENSIONS;
+}
 
-const char* DownloadHandlerConstants::BT_CONTENT_TYPES[] = {
-  "application/x-bittorrent"
+namespace {
+const char* METALINK_CONTENT_TYPES[] = {
+  "application/metalink4+xml", // Metalink4Spec
+  "application/metalink+xml", // Metalink3Spec
+  0
 };
+} // namespace
 
-const std::vector<std::string>&
-DownloadHandlerConstants::getMetalinkExtensions()
+const char** getMetalinkContentTypes()
 {
-  static const std::vector<std::string> l
-    (vbegin(METALINK_EXTENSIONS), vend(METALINK_EXTENSIONS));
-  return l;
+  return METALINK_CONTENT_TYPES;
 }
 
-const std::vector<std::string>&
-DownloadHandlerConstants::getMetalinkContentTypes()
-{
-  static const std::vector<std::string> l
-    (vbegin(METALINK_CONTENT_TYPES), vend(METALINK_CONTENT_TYPES));
-  return l;
-}
+namespace {
+const char* BT_EXTENSIONS[] = {
+  ".torrent",
+  0
+};
+} // namespace
 
-const std::vector<std::string>& DownloadHandlerConstants::getBtExtensions()
+const char** getBtExtensions()
 {
-  static const std::vector<std::string> l
-    (vbegin(BT_EXTENSIONS), vend(BT_EXTENSIONS));
-  return l;
+  return BT_EXTENSIONS;
 }
 
-const std::vector<std::string>& DownloadHandlerConstants::getBtContentTypes()
+namespace {
+const char* BT_CONTENT_TYPES[] = {
+  "application/x-bittorrent",
+  0
+};
+} // namespace
+
+const char** getBtContentTypes()
 {
-  static const std::vector<std::string> l
-    (vbegin(BT_CONTENT_TYPES), vend(BT_CONTENT_TYPES));
-  return l;
+  return BT_CONTENT_TYPES;
 }
 
 } // namespace aria2

+ 6 - 18
src/DownloadHandlerConstants.h

@@ -2,7 +2,7 @@
 /*
  * aria2 - The high speed download utility
  *
- * Copyright (C) 2006 Tatsuhiro Tsujikawa
+ * Copyright (C) 2012 Tatsuhiro Tsujikawa
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -36,30 +36,18 @@
 #define D_DOWNLOAD_HANDLER_CONSTANTS_H
 
 #include "common.h"
-#include <string>
-#include <vector>
 
 namespace aria2 {
 
-class DownloadHandlerConstants
-{
-public:
-  static const char* METALINK_EXTENSIONS[];
+// These methods returns NULL-terminated list of c-strings.
 
-  static const std::vector<std::string>& getMetalinkExtensions();
+const char** getMetalinkExtensions();
 
-  static const char* METALINK_CONTENT_TYPES[];
+const char** getMetalinkContentTypes();
 
-  static const std::vector<std::string>& getMetalinkContentTypes();
+const char** getBtExtensions();
 
-  static const char* BT_EXTENSIONS[];
-
-  static const std::vector<std::string>& getBtExtensions();
-
-  static const char* BT_CONTENT_TYPES[];
-
-  static const std::vector<std::string>& getBtContentTypes();
-};
+const char** getBtContentTypes();
 
 } // namespace aria2
 

+ 2 - 8
src/DownloadHandlerFactory.cc

@@ -74,10 +74,7 @@ DownloadHandlerFactory::getMetalinkPreDownloadHandler()
 
     RequestGroupCriteriaHandle criteria
       (new ContentTypeRequestGroupCriteria
-       (DownloadHandlerConstants::getMetalinkContentTypes().begin(),
-        DownloadHandlerConstants::getMetalinkContentTypes().end(),
-        DownloadHandlerConstants::getMetalinkExtensions().begin(),
-        DownloadHandlerConstants::getMetalinkExtensions().end()));
+       (getMetalinkContentTypes(), getMetalinkExtensions()));
     metalinkPreDownloadHandler_->setCriteria(criteria);
   }
   return metalinkPreDownloadHandler_;
@@ -105,10 +102,7 @@ DownloadHandlerFactory::getBtPreDownloadHandler()
 
     RequestGroupCriteriaHandle criteria
       (new ContentTypeRequestGroupCriteria
-       (DownloadHandlerConstants::getBtContentTypes().begin(),
-        DownloadHandlerConstants::getBtContentTypes().end(),
-        DownloadHandlerConstants::getBtExtensions().begin(),
-        DownloadHandlerConstants::getBtExtensions().end()));
+       (getBtContentTypes(), getBtExtensions()));
     btPreDownloadHandler_->setCriteria(criteria);
   }
   return btPreDownloadHandler_;

+ 9 - 9
src/HttpRequest.cc

@@ -51,6 +51,7 @@
 #include "TimeA2.h"
 #include "array_fun.h"
 #include "Request.h"
+#include "DownloadHandlerConstants.h"
 
 namespace aria2 {
 
@@ -58,6 +59,7 @@ const std::string HttpRequest::USER_AGENT("aria2");
 
 HttpRequest::HttpRequest():contentEncodingEnabled_(true),
                            userAgent_(USER_AGENT),
+                           acceptMetalink_(false),
                            noCache_(true),
                            acceptGzip_(false),
                            endOffsetOverride_(0)
@@ -164,10 +166,13 @@ std::string HttpRequest::createRequest()
   builtinHds.reserve(20);
   builtinHds.push_back(std::make_pair("User-Agent:", userAgent_));
   std::string acceptTypes = "*/*";
-  for(std::vector<std::string>::const_iterator i = acceptTypes_.begin(),
-        eoi = acceptTypes_.end(); i != eoi; ++i) {
-    acceptTypes += ",";
-    acceptTypes += *i;
+  if(acceptMetalink_) {
+    // The mime types of Metalink are used for "transparent metalink".
+    const char** metalinkTypes = getMetalinkContentTypes();
+    for(size_t i = 0; metalinkTypes[i]; ++i) {
+      acceptTypes += ",";
+      acceptTypes += metalinkTypes[i];
+    }
   }
   builtinHds.push_back(std::make_pair("Accept:", acceptTypes));
   if(contentEncodingEnabled_) {
@@ -328,11 +333,6 @@ void HttpRequest::clearHeader()
   headers_.clear();
 }
 
-void HttpRequest::addAcceptType(const std::string& type)
-{
-  acceptTypes_.push_back(type);
-}
-
 void HttpRequest::setCookieStorage
 (const SharedHandle<CookieStorage>& cookieStorage)
 {

+ 4 - 4
src/HttpRequest.h

@@ -71,7 +71,8 @@ private:
 
   std::vector<std::string> headers_;
 
-  std::vector<std::string> acceptTypes_;
+  // If true, metalink content types are sent in Accept header field.
+  bool acceptMetalink_;
 
   SharedHandle<CookieStorage> cookieStorage_;
 
@@ -172,10 +173,9 @@ public:
 
   void addAcceptType(const std::string& type);
 
-  template<typename InputIterator>
-  void addAcceptType(InputIterator first, InputIterator last)
+  void setAcceptMetalink(bool f)
   {
-    acceptTypes_.insert(acceptTypes_.end(), first, last);
+    acceptMetalink_ = f;
   }
 
   void setCookieStorage(const SharedHandle<CookieStorage>& cookieStorage);

+ 2 - 2
src/HttpRequestCommand.cc

@@ -103,8 +103,8 @@ createHttpRequest(const SharedHandle<Request>& req,
   httpRequest->setCookieStorage(cookieStorage);
   httpRequest->setAuthConfigFactory(authConfigFactory, option.get());
   httpRequest->setProxyRequest(proxyRequest);
-  httpRequest->addAcceptType(rg->getAcceptTypes().begin(),
-                             rg->getAcceptTypes().end());
+  httpRequest->setAcceptMetalink(rg->getDownloadContext()->
+                                 getAcceptMetalink());
   if(option->getAsBool(PREF_HTTP_ACCEPT_GZIP)) {
     httpRequest->enableAcceptGZip();
   } else {

+ 3 - 3
src/HttpResponseCommand.cc

@@ -197,9 +197,9 @@ bool HttpResponseCommand::executeInternal()
   }
   if(!getPieceStorage()) {
     // Metalink/HTTP
-    if(!getDownloadContext()->getMetalinkServerContacted()) {
+    if(getDownloadContext()->getAcceptMetalink()) {
       if(httpHeader->defined(HttpHeader::LINK)) {
-        getDownloadContext()->setMetalinkServerContacted(true);
+        getDownloadContext()->setAcceptMetalink(false);
         std::vector<MetalinkHttpEntry> entries;
         httpResponse->getMetalinKHttpEntries(entries, getOption());
         for(std::vector<MetalinkHttpEntry>::iterator i = entries.begin(),
@@ -245,7 +245,7 @@ bool HttpResponseCommand::executeInternal()
     }
   }
   if(!getPieceStorage()) {
-    util::removeMetalinkContentTypes(getRequestGroup());
+    getDownloadContext()->setAcceptMetalink(false);
     int64_t totalLength = httpResponse->getEntityLength();
     getFileEntry()->setLength(totalLength);
     if(getFileEntry()->getPath().empty()) {

+ 2 - 2
src/Metalink2RequestGroup.cc

@@ -229,7 +229,7 @@ Metalink2RequestGroup::createRequestGroup
         torrentRg->clearPostDownloadHandler();
         // remove "metalink" from Accept Type list to avoid loop in
         // tranparent metalink
-        util::removeMetalinkContentTypes(torrentRg);
+        torrentRg->getDownloadContext()->setAcceptMetalink(false);
         // make it in-memory download
         SharedHandle<PreDownloadHandler> preh
           (new MemoryBufferPreDownloadHandler());
@@ -328,7 +328,7 @@ Metalink2RequestGroup::createRequestGroup
     removeOneshotOption(option);
     // remove "metalink" from Accept Type list to avoid loop in
     // tranparent metalink
-    util::removeMetalinkContentTypes(rg);
+    dctx->setAcceptMetalink(false);
 #ifdef ENABLE_BITTORRENT
     // Inject depenency between rg and torrentRg here if
     // torrentRg is true

+ 1 - 4
src/MetalinkPostDownloadHandler.cc

@@ -58,10 +58,7 @@ MetalinkPostDownloadHandler::MetalinkPostDownloadHandler()
 {
   SharedHandle<RequestGroupCriteria> cri
     (new ContentTypeRequestGroupCriteria
-     (DownloadHandlerConstants::getMetalinkContentTypes().begin(),
-      DownloadHandlerConstants::getMetalinkContentTypes().end(),
-      DownloadHandlerConstants::getMetalinkExtensions().begin(),
-      DownloadHandlerConstants::getMetalinkExtensions().end()));
+     (getMetalinkContentTypes(), getMetalinkExtensions()));
   setCriteria(cri);
 }
 

+ 0 - 19
src/RequestGroup.cc

@@ -154,12 +154,6 @@ RequestGroup::RequestGroup(const SharedHandle<Option>& option)
     resumeFailureCount_(0)
 {
   fileAllocationEnabled_ = option_->get(PREF_FILE_ALLOCATION) != V_NONE;
-  // Add types to be sent as a Accept header value here.
-  // It would be good to put this value in Option so that user can tweak
-  // and add this list.
-  // The mime types of Metalink is used for `transparent metalink'.
-  addAcceptType(DownloadHandlerConstants::getMetalinkContentTypes().begin(),
-		DownloadHandlerConstants::getMetalinkContentTypes().end());
   if(!option_->getAsBool(PREF_DRY_RUN)) {
     initializePreDownloadHandler();
     initializePostDownloadHandler();
@@ -1213,19 +1207,6 @@ void RequestGroup::reportDownloadFinished()
 #endif // ENABLE_BITTORRENT
 }
 
-void RequestGroup::addAcceptType(const std::string& type)
-{
-  if(std::find(acceptTypes_.begin(), acceptTypes_.end(), type) == acceptTypes_.end()) {
-    acceptTypes_.push_back(type);
-  }
-}
-
-void RequestGroup::removeAcceptType(const std::string& type)
-{
-  acceptTypes_.erase(std::remove(acceptTypes_.begin(), acceptTypes_.end(), type),
-                     acceptTypes_.end());
-}
-
 void RequestGroup::setURISelector(const SharedHandle<URISelector>& uriSelector)
 {
   uriSelector_ = uriSelector;

+ 0 - 22
src/RequestGroup.h

@@ -138,8 +138,6 @@ private:
 
   std::vector<SharedHandle<PostDownloadHandler> > postDownloadHandlers_;
 
-  std::vector<std::string> acceptTypes_;
-
   SharedHandle<URISelector> uriSelector_;
 
   Time lastModifiedTime_;
@@ -410,26 +408,6 @@ public:
 
   void reportDownloadFinished();
 
-  const std::vector<std::string>& getAcceptTypes() const
-  {
-    return acceptTypes_;
-  }
-
-  void addAcceptType(const std::string& type);
-
-  template<typename InputIterator>
-  void addAcceptType(InputIterator first, InputIterator last)
-  {
-    for(; first != last; ++first) {
-      if(std::find(acceptTypes_.begin(), acceptTypes_.end(), *first) ==
-	 acceptTypes_.end()) {
-	acceptTypes_.push_back(*first);
-      }
-    }
-  }
-
-  void removeAcceptType(const std::string& type);
-
   void setURISelector(const SharedHandle<URISelector>& uriSelector);
 
   const SharedHandle<URISelector>& getURISelector() const

+ 1 - 1
src/TrackerWatcherCommand.cc

@@ -255,7 +255,7 @@ TrackerWatcherCommand::createRequestGroup(const std::string& uri)
   // RequestGroup is not handled by RequestGroupMan.
   rg->clearPreDownloadHandler();
   rg->clearPostDownloadHandler();
-  util::removeMetalinkContentTypes(rg);
+  dctx->setAcceptMetalink(false);
   A2_LOG_INFO(fmt("Creating tracker request group GID#%" PRId64 "", rg->getGID()));
   return rg;
 }

+ 1 - 1
src/download_helper.cc

@@ -197,7 +197,7 @@ createBtRequestGroup(const std::string& metaInfoUri,
   rg->setPauseRequested(option->getAsBool(PREF_PAUSE));
   // Remove "metalink" from Accept Type list to avoid server from
   // responding Metalink file for web-seeding URIs.
-  util::removeMetalinkContentTypes(rg);
+  dctx->setAcceptMetalink(false);
   removeOneshotOption(option);
   return rg;
 }

+ 10 - 15
src/util.cc

@@ -1479,21 +1479,6 @@ bool inSameCidrBlock
   return (s1[last] & mask) == (s2[last] & mask);
 }
 
-void removeMetalinkContentTypes(const SharedHandle<RequestGroup>& group)
-{
-  removeMetalinkContentTypes(group.get());
-}
-
-void removeMetalinkContentTypes(RequestGroup* group)
-{
-  for(std::vector<std::string>::const_iterator i =
-	DownloadHandlerConstants::getMetalinkContentTypes().begin(),
-        eoi = DownloadHandlerConstants::getMetalinkContentTypes().end();
-      i != eoi; ++i) {
-    group->removeAcceptType(*i);
-  }
-}
-
 namespace {
 
 void executeHook
@@ -1695,6 +1680,16 @@ bool tlsHostnameMatch(const std::string& pattern, const std::string& hostname)
               ptWildcard+1, ptLeftLabelEnd);
 }
 
+bool strieq(const std::string& a, const char* b)
+{
+  return strieq(a.begin(), a.end(), b);
+}
+
+bool strieq(const std::string& a, const std::string& b)
+{
+  return strieq(a.begin(), a.end(), b.begin(), b.end());
+}
+
 bool startsWith(const std::string& a, const char* b)
 {
   return startsWith(a.begin(), a.end(), b);

+ 3 - 3
src/util.h

@@ -625,6 +625,9 @@ bool strieq(InputIterator first, InputIterator last, const char* b)
   return first == last && *b == '\0';
 }
 
+bool strieq(const std::string& a, const char* b);
+bool strieq(const std::string& a, const std::string& b);
+
 template<typename InputIterator1, typename InputIterator2>
 bool startsWith
 (InputIterator1 first1,
@@ -762,9 +765,6 @@ std::string escapePath(const std::string& s);
 bool inSameCidrBlock
 (const std::string& ip1, const std::string& ip2, size_t bits);
 
-void removeMetalinkContentTypes(const SharedHandle<RequestGroup>& group);
-void removeMetalinkContentTypes(RequestGroup* group);
-
 // No throw
 void executeHookByOptName
 (const SharedHandle<RequestGroup>& group, const Option* option,

+ 5 - 8
test/HttpRequestTest.cc

@@ -35,7 +35,7 @@ class HttpRequestTest : public CppUnit::TestFixture {
   CPPUNIT_TEST(testIsRangeSatisfied);
   CPPUNIT_TEST(testUserAgent);
   CPPUNIT_TEST(testAddHeader);
-  CPPUNIT_TEST(testAddAcceptType);
+  CPPUNIT_TEST(testAcceptMetalink);
   CPPUNIT_TEST(testEnableAcceptEncoding);
   CPPUNIT_TEST(testConditionalRequest);
   CPPUNIT_TEST_SUITE_END();
@@ -63,7 +63,7 @@ public:
   void testIsRangeSatisfied();
   void testUserAgent();
   void testAddHeader();
-  void testAddAcceptType();
+  void testAcceptMetalink();
   void testEnableAcceptEncoding();
   void testConditionalRequest();
 };
@@ -758,11 +758,8 @@ void HttpRequestTest::testAddHeader()
   CPPUNIT_ASSERT_EQUAL(expectedText, httpRequest.createRequest());
 }
 
-void HttpRequestTest::testAddAcceptType()
+void HttpRequestTest::testAcceptMetalink()
 {
-  std::string acceptTypes[] = { "cream/custard",
-                                "muffin/chocolate" };
-
   SharedHandle<Request> request(new Request());
   request->setUri("http://localhost/archives/aria2-1.0.0.tar.bz2");
 
@@ -770,12 +767,12 @@ void HttpRequestTest::testAddAcceptType()
   httpRequest.disableContentEncoding();
   httpRequest.setRequest(request);
   httpRequest.setAuthConfigFactory(authConfigFactory_, option_.get());
-  httpRequest.addAcceptType(vbegin(acceptTypes), vend(acceptTypes));
+  httpRequest.setAcceptMetalink(true);
 
   std::string expectedText =
     "GET /archives/aria2-1.0.0.tar.bz2 HTTP/1.1\r\n"
     "User-Agent: aria2\r\n"
-    "Accept: */*,cream/custard,muffin/chocolate\r\n"
+    "Accept: */*,application/metalink4+xml,application/metalink+xml\r\n"
     "Host: localhost\r\n"
     "Pragma: no-cache\r\n"
     "Cache-Control: no-cache\r\n"