/* */ #include "download_helper.h" #include #include #include #include #include "RequestGroup.h" #include "Option.h" #include "prefs.h" #include "Metalink2RequestGroup.h" #include "ProtocolDetector.h" #include "ParameterizedStringParser.h" #include "PStringBuildVisitor.h" #include "UriListParser.h" #include "DownloadContext.h" #include "RecoverableException.h" #include "DlAbortEx.h" #include "message.h" #include "StringFormat.h" #include "FileEntry.h" #include "LogFactory.h" #include "File.h" #include "util.h" #include "array_fun.h" #include "OptionHandler.h" #include "ByteArrayDiskWriter.h" #include "a2functional.h" #include "ByteArrayDiskWriterFactory.h" #include "MetadataInfo.h" #ifdef ENABLE_BITTORRENT # include "bittorrent_helper.h" # include "BtConstants.h" # include "UTMetadataPostDownloadHandler.h" #endif // ENABLE_BITTORRENT namespace aria2 { const std::set& listRequestOptions() { static const std::string REQUEST_OPTIONS[] = { PREF_DIR, PREF_CHECK_INTEGRITY, PREF_CONTINUE, PREF_ALL_PROXY, PREF_ALL_PROXY_USER, PREF_ALL_PROXY_PASSWD, PREF_CONNECT_TIMEOUT, PREF_DRY_RUN, PREF_LOWEST_SPEED_LIMIT, PREF_MAX_FILE_NOT_FOUND, PREF_MAX_TRIES, PREF_NO_PROXY, PREF_OUT, PREF_PROXY_METHOD, PREF_REMOTE_TIME, PREF_SPLIT, PREF_TIMEOUT, PREF_HTTP_AUTH_CHALLENGE, PREF_HTTP_NO_CACHE, PREF_HTTP_USER, PREF_HTTP_PASSWD, PREF_HTTP_PROXY, PREF_HTTP_PROXY_USER, PREF_HTTP_PROXY_PASSWD, PREF_HTTPS_PROXY, PREF_HTTPS_PROXY_USER, PREF_HTTPS_PROXY_PASSWD, PREF_REFERER, PREF_ENABLE_HTTP_KEEP_ALIVE, PREF_ENABLE_HTTP_PIPELINING, PREF_HEADER, PREF_USE_HEAD, PREF_USER_AGENT, PREF_FTP_USER, PREF_FTP_PASSWD, PREF_FTP_PASV, PREF_FTP_PROXY, PREF_FTP_PROXY_USER, PREF_FTP_PROXY_PASSWD, PREF_FTP_TYPE, PREF_FTP_REUSE_CONNECTION, PREF_NO_NETRC, PREF_REUSE_URI, PREF_SELECT_FILE, PREF_BT_ENABLE_LPD, PREF_BT_EXTERNAL_IP, PREF_BT_HASH_CHECK_SEED, PREF_BT_MAX_OPEN_FILES, PREF_BT_MAX_PEERS, PREF_BT_METADATA_ONLY, PREF_BT_MIN_CRYPTO_LEVEL, PREF_BT_PRIORITIZE_PIECE, PREF_BT_REQUIRE_CRYPTO, PREF_BT_REQUEST_PEER_SPEED_LIMIT, PREF_BT_SAVE_METADATA, PREF_BT_SEED_UNVERIFIED, PREF_BT_STOP_TIMEOUT, PREF_BT_TRACKER_INTERVAL, PREF_BT_TRACKER_TIMEOUT, PREF_BT_TRACKER_CONNECT_TIMEOUT, PREF_ENABLE_PEER_EXCHANGE, PREF_FOLLOW_TORRENT, PREF_INDEX_OUT, PREF_MAX_UPLOAD_LIMIT, PREF_SEED_RATIO, PREF_SEED_TIME, PREF_FOLLOW_METALINK, PREF_METALINK_SERVERS, PREF_METALINK_LANGUAGE, PREF_METALINK_LOCATION, PREF_METALINK_OS, PREF_METALINK_VERSION, PREF_METALINK_PREFERRED_PROTOCOL, PREF_METALINK_ENABLE_UNIQUE_PROTOCOL, PREF_ALLOW_OVERWRITE, PREF_ALLOW_PIECE_LENGTH_CHANGE, PREF_ASYNC_DNS, PREF_AUTO_FILE_RENAMING, PREF_FILE_ALLOCATION, PREF_MAX_DOWNLOAD_LIMIT, PREF_NO_FILE_ALLOCATION_LIMIT, PREF_PARAMETERIZED_URI, PREF_REALTIME_CHUNK_CHECKSUM, PREF_REMOVE_CONTROL_FILE, PREF_ALWAYS_RESUME, PREF_MAX_RESUME_FAILURE_TRIES, PREF_HTTP_ACCEPT_GZIP }; static std::set requestOptions (vbegin(REQUEST_OPTIONS), vend(REQUEST_OPTIONS)); return requestOptions; } static void unfoldURI (std::vector& result, const std::vector& args) { ParameterizedStringParser p; PStringBuildVisitor v; for(std::vector::const_iterator itr = args.begin(), eoi = args.end(); itr != eoi; ++itr) { v.reset(); p.parse(*itr)->accept(v); result.insert(result.end(), v.getURIs().begin(), v.getURIs().end()); } } template static void splitURI(std::vector& result, InputIterator begin, InputIterator end, size_t numSplit) { size_t numURIs = std::distance(begin, end); if(numURIs >= numSplit) { result.insert(result.end(), begin, end); } else if(numURIs > 0) { for(size_t i = 0; i < numSplit/numURIs; ++i) { result.insert(result.end(), begin, end); } result.insert(result.end(), begin, begin+(numSplit%numURIs)); } } static SharedHandle createRequestGroup (const SharedHandle