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.")