From 5db28b5a03d1bb1fa2985aa92744735acbeb478b Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Mon, 29 Dec 2008 14:05:39 +0000 Subject: [PATCH] 2008-12-29 Tatsuhiro Tsujikawa Added --use-head option to toggle whether HEAD method should be used in the first HTTP request. By default aria2 uses HEAD method as the first request. When the server doesn't recognize HEAD, then give aria2 --use-head=false to force aria2 to use GET method instead. * src/OptionHandlerFactory.cc * src/RequestGroupMan.cc * src/option_processing.cc * src/prefs.cc * src/prefs.h * src/usage_text.h --- ChangeLog | 14 ++++++++++++++ src/OptionHandlerFactory.cc | 8 ++++++++ src/RequestGroupMan.cc | 17 +++++++++++++++-- src/option_processing.cc | 4 ++++ src/prefs.cc | 2 ++ src/prefs.h | 2 ++ src/usage_text.h | 3 +++ 7 files changed, 48 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 1131ffc7..365e9c7d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2008-12-29 Tatsuhiro Tsujikawa + + Added --use-head option to toggle whether HEAD method should be + used in the first HTTP request. By default aria2 uses HEAD method + as the first request. When the server doesn't recognize HEAD, then + give aria2 --use-head=false to force aria2 to use GET method + instead. + * src/OptionHandlerFactory.cc + * src/RequestGroupMan.cc + * src/option_processing.cc + * src/prefs.cc + * src/prefs.h + * src/usage_text.h + 2008-12-29 Tatsuhiro Tsujikawa Fixed the bug that BitTorrent download doesn't finish when REJECT diff --git a/src/OptionHandlerFactory.cc b/src/OptionHandlerFactory.cc index 563ecf23..a1cbe1a1 100644 --- a/src/OptionHandlerFactory.cc +++ b/src/OptionHandlerFactory.cc @@ -539,6 +539,14 @@ OptionHandlers OptionHandlerFactory::createOptionHandlers() op->addTag(TAG_HTTP); handlers.push_back(op); } + { + SharedHandle op(new DefaultOptionHandler + (PREF_USE_HEAD, + TEXT_USE_HEAD, + V_TRUE)); + op->addTag(TAG_HTTP); + handlers.push_back(op); + } { SharedHandle op(new DefaultOptionHandler (PREF_USER_AGENT, diff --git a/src/RequestGroupMan.cc b/src/RequestGroupMan.cc index 71f6b30b..f0c30e93 100644 --- a/src/RequestGroupMan.cc +++ b/src/RequestGroupMan.cc @@ -268,6 +268,17 @@ void RequestGroupMan::configureRequestGroup } } +static void createInitialCommand(const SharedHandle& requestGroup, + std::deque& commands, + DownloadEngine* e, + bool useHead) +{ + requestGroup->createInitialCommand(commands, e, + useHead ? + Request::METHOD_HEAD : + Request::METHOD_GET); +} + void RequestGroupMan::fillRequestGroupFromReserver(DownloadEngine* e) { RequestGroups temp; @@ -284,7 +295,8 @@ void RequestGroupMan::fillRequestGroupFromReserver(DownloadEngine* e) } configureRequestGroup(groupToAdd); Commands commands; - groupToAdd->createInitialCommand(commands, e); + createInitialCommand(groupToAdd, commands, e, + _option->getAsBool(PREF_USE_HEAD)); _requestGroups.push_back(groupToAdd); ++count; e->addCommand(commands); @@ -308,7 +320,8 @@ void RequestGroupMan::getInitialCommands(std::deque& commands, try { if((*itr)->isDependencyResolved()) { configureRequestGroup(*itr); - (*itr)->createInitialCommand(commands, e); + createInitialCommand(*itr, commands, e, + _option->getAsBool(PREF_USE_HEAD)); ++itr; } else { _reservedGroups.push_front((*itr)); diff --git a/src/option_processing.cc b/src/option_processing.cc index e0102d84..035cf1db 100644 --- a/src/option_processing.cc +++ b/src/option_processing.cc @@ -189,6 +189,7 @@ Option* option_processing(int argc, char* const argv[]) { PREF_CA_CERTIFICATE.c_str(), optional_argument, &lopt, 233 }, { PREF_CHECK_CERTIFICATE.c_str(), optional_argument, &lopt, 234 }, { PREF_NO_PROXY.c_str(), required_argument, &lopt, 235 }, + { PREF_USE_HEAD.c_str(), optional_argument, &lopt, 236 }, #if defined ENABLE_BITTORRENT || defined ENABLE_METALINK { PREF_SHOW_FILES.c_str(), no_argument, NULL, 'S' }, { PREF_SELECT_FILE.c_str(), required_argument, &lopt, 21 }, @@ -470,6 +471,9 @@ Option* option_processing(int argc, char* const argv[]) case 235: cmdstream << PREF_NO_PROXY << "=" << optarg << "\n"; break; + case 236: + cmdstream << PREF_USE_HEAD << "=" << toBoolArg(optarg) << "\n"; + break; } break; } diff --git a/src/prefs.cc b/src/prefs.cc index 8a677259..e1e93924 100644 --- a/src/prefs.cc +++ b/src/prefs.cc @@ -188,6 +188,8 @@ const std::string PREF_PRIVATE_KEY("private-key"); const std::string PREF_CA_CERTIFICATE("ca-certificate"); // value: true | false const std::string PREF_CHECK_CERTIFICATE("check-certificate"); +// value: true | false +const std::string PREF_USE_HEAD("use-head"); /** * Proxy related preferences diff --git a/src/prefs.h b/src/prefs.h index 0328a656..3ce4e553 100644 --- a/src/prefs.h +++ b/src/prefs.h @@ -192,6 +192,8 @@ extern const std::string PREF_PRIVATE_KEY; extern const std::string PREF_CA_CERTIFICATE; // value: true | false extern const std::string PREF_CHECK_CERTIFICATE; +// value: true | false +extern const std::string PREF_USE_HEAD; /**; * Proxy related preferences diff --git a/src/usage_text.h b/src/usage_text.h index 62ca8241..a073a4aa 100644 --- a/src/usage_text.h +++ b/src/usage_text.h @@ -434,3 +434,6 @@ _(" --check-certificate[=true|false] Verify the peer using certificates specifie #define TEXT_NO_PROXY \ _(" --no-proxy=DOMAINS Specify comma separated hostnames or domains where\n"\ " proxy should not be used.") +#define TEXT_USE_HEAD \ +_(" --use-head[=true|false] Use HEAD method for the first request to the HTTP\n"\ + " server.")