mirror of https://github.com/aria2/aria2
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.pull/28/head
parent
9d294741fd
commit
461a542c5e
|
@ -59,10 +59,7 @@ BtPostDownloadHandler::BtPostDownloadHandler()
|
||||||
{
|
{
|
||||||
SharedHandle<RequestGroupCriteria> cri
|
SharedHandle<RequestGroupCriteria> cri
|
||||||
(new ContentTypeRequestGroupCriteria
|
(new ContentTypeRequestGroupCriteria
|
||||||
(DownloadHandlerConstants::getBtContentTypes().begin(),
|
(getBtContentTypes(), getBtExtensions()));
|
||||||
DownloadHandlerConstants::getBtContentTypes().end(),
|
|
||||||
DownloadHandlerConstants::getBtExtensions().begin(),
|
|
||||||
DownloadHandlerConstants::getBtExtensions().end()));
|
|
||||||
setCriteria(cri);
|
setCriteria(cri);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -34,8 +34,6 @@
|
||||||
/* copyright --> */
|
/* copyright --> */
|
||||||
#include "ContentTypeRequestGroupCriteria.h"
|
#include "ContentTypeRequestGroupCriteria.h"
|
||||||
|
|
||||||
#include <algorithm>
|
|
||||||
|
|
||||||
#include "RequestGroup.h"
|
#include "RequestGroup.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "FileEntry.h"
|
#include "FileEntry.h"
|
||||||
|
@ -43,19 +41,13 @@
|
||||||
|
|
||||||
namespace aria2 {
|
namespace aria2 {
|
||||||
|
|
||||||
namespace {
|
ContentTypeRequestGroupCriteria::ContentTypeRequestGroupCriteria
|
||||||
template<typename InputIterator>
|
(const char** contentTypes, const char** extensions)
|
||||||
bool tailMatch
|
: contentTypes_(contentTypes),
|
||||||
(InputIterator first, InputIterator last, const std::string& target)
|
extensions_(extensions)
|
||||||
{
|
{}
|
||||||
for(; first != last; ++first) {
|
|
||||||
if(util::endsWith(target, *first)) {
|
ContentTypeRequestGroupCriteria::~ContentTypeRequestGroupCriteria() {}
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
bool ContentTypeRequestGroupCriteria::match
|
bool ContentTypeRequestGroupCriteria::match
|
||||||
(const RequestGroup* requestGroup) const
|
(const RequestGroup* requestGroup) const
|
||||||
|
@ -63,15 +55,18 @@ bool ContentTypeRequestGroupCriteria::match
|
||||||
if(requestGroup->getDownloadContext()->getFileEntries().size() != 1) {
|
if(requestGroup->getDownloadContext()->getFileEntries().size() != 1) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if(tailMatch(extensions_.begin(), extensions_.end(),
|
for(size_t i = 0; extensions_[i]; ++i) {
|
||||||
requestGroup->getFirstFilePath())) {
|
if(util::iendsWith(requestGroup->getFirstFilePath(), extensions_[i])) {
|
||||||
return true;
|
return true;
|
||||||
} else {
|
|
||||||
return
|
|
||||||
std::find(contentTypes_.begin(), contentTypes_.end(),
|
|
||||||
requestGroup->getDownloadContext()->getFirstFileEntry()->
|
|
||||||
getContentType()) != contentTypes_.end();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for(size_t i = 0; contentTypes_[i]; ++i) {
|
||||||
|
if(util::strieq(requestGroup->getDownloadContext()->getFirstFileEntry()->
|
||||||
|
getContentType(), contentTypes_[i])) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace aria2
|
} // namespace aria2
|
||||||
|
|
|
@ -44,16 +44,13 @@ namespace aria2 {
|
||||||
class ContentTypeRequestGroupCriteria:public RequestGroupCriteria
|
class ContentTypeRequestGroupCriteria:public RequestGroupCriteria
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
std::vector<std::string> contentTypes_;
|
const char** contentTypes_;
|
||||||
std::vector<std::string> extensions_;
|
const char** extensions_;
|
||||||
public:
|
public:
|
||||||
template<typename InputIterator>
|
ContentTypeRequestGroupCriteria(const char** contentTypes,
|
||||||
ContentTypeRequestGroupCriteria(InputIterator contentTypeFirst,
|
const char** extensions);
|
||||||
InputIterator contentTypeLast,
|
|
||||||
InputIterator extensionFirst,
|
virtual ~ContentTypeRequestGroupCriteria();
|
||||||
InputIterator extensionLast):
|
|
||||||
contentTypes_(contentTypeFirst, contentTypeLast),
|
|
||||||
extensions_(extensionFirst, extensionLast) {}
|
|
||||||
|
|
||||||
virtual bool match(const RequestGroup* requestGroup) const;
|
virtual bool match(const RequestGroup* requestGroup) const;
|
||||||
};
|
};
|
||||||
|
|
|
@ -54,7 +54,7 @@ DownloadContext::DownloadContext():
|
||||||
attrs_(MAX_CTX_ATTR),
|
attrs_(MAX_CTX_ATTR),
|
||||||
downloadStartTime_(0),
|
downloadStartTime_(0),
|
||||||
downloadStopTime_(downloadStartTime_),
|
downloadStopTime_(downloadStartTime_),
|
||||||
metalinkServerContacted_(false) {}
|
acceptMetalink_(true) {}
|
||||||
|
|
||||||
DownloadContext::DownloadContext(int32_t pieceLength,
|
DownloadContext::DownloadContext(int32_t pieceLength,
|
||||||
int64_t totalLength,
|
int64_t totalLength,
|
||||||
|
@ -66,7 +66,7 @@ DownloadContext::DownloadContext(int32_t pieceLength,
|
||||||
attrs_(MAX_CTX_ATTR),
|
attrs_(MAX_CTX_ATTR),
|
||||||
downloadStartTime_(0),
|
downloadStartTime_(0),
|
||||||
downloadStopTime_(0),
|
downloadStopTime_(0),
|
||||||
metalinkServerContacted_(false)
|
acceptMetalink_(true)
|
||||||
{
|
{
|
||||||
SharedHandle<FileEntry> fileEntry(new FileEntry(path, totalLength, 0));
|
SharedHandle<FileEntry> fileEntry(new FileEntry(path, totalLength, 0));
|
||||||
fileEntries_.push_back(fileEntry);
|
fileEntries_.push_back(fileEntry);
|
||||||
|
|
|
@ -84,9 +84,9 @@ private:
|
||||||
Timer downloadStopTime_;
|
Timer downloadStopTime_;
|
||||||
|
|
||||||
SharedHandle<Signature> signature_;
|
SharedHandle<Signature> signature_;
|
||||||
// This member variable is required to avoid to parse Metalink/HTTP
|
// This member variable is required to avoid to use parse Metalink
|
||||||
// Link header fields multiple times.
|
// (including both Metalink XML and Metalink/HTTP) twice.
|
||||||
bool metalinkServerContacted_;
|
bool acceptMetalink_;
|
||||||
public:
|
public:
|
||||||
DownloadContext();
|
DownloadContext();
|
||||||
|
|
||||||
|
@ -226,13 +226,13 @@ public:
|
||||||
|
|
||||||
void releaseRuntimeResource();
|
void releaseRuntimeResource();
|
||||||
|
|
||||||
void setMetalinkServerContacted(bool f)
|
void setAcceptMetalink(bool f)
|
||||||
{
|
{
|
||||||
metalinkServerContacted_ = f;
|
acceptMetalink_ = f;
|
||||||
}
|
}
|
||||||
bool getMetalinkServerContacted() const
|
bool getAcceptMetalink() const
|
||||||
{
|
{
|
||||||
return metalinkServerContacted_;
|
return acceptMetalink_;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
/*
|
/*
|
||||||
* aria2 - The high speed download utility
|
* 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
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -33,54 +33,57 @@
|
||||||
*/
|
*/
|
||||||
/* copyright --> */
|
/* copyright --> */
|
||||||
#include "DownloadHandlerConstants.h"
|
#include "DownloadHandlerConstants.h"
|
||||||
#include "array_fun.h"
|
|
||||||
|
|
||||||
namespace aria2 {
|
namespace aria2 {
|
||||||
|
|
||||||
const char* DownloadHandlerConstants::METALINK_EXTENSIONS[] = {
|
namespace {
|
||||||
|
const char* METALINK_EXTENSIONS[] = {
|
||||||
".metalink", // Metalink3Spec
|
".metalink", // Metalink3Spec
|
||||||
".meta4" // Metalink4Spec
|
".meta4", // Metalink4Spec
|
||||||
|
0
|
||||||
};
|
};
|
||||||
|
} // namespace
|
||||||
|
|
||||||
const char* DownloadHandlerConstants::METALINK_CONTENT_TYPES[] = {
|
const char** getMetalinkExtensions()
|
||||||
|
{
|
||||||
|
return METALINK_EXTENSIONS;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
const char* METALINK_CONTENT_TYPES[] = {
|
||||||
"application/metalink4+xml", // Metalink4Spec
|
"application/metalink4+xml", // Metalink4Spec
|
||||||
"application/metalink+xml" // Metalink3Spec
|
"application/metalink+xml", // Metalink3Spec
|
||||||
|
0
|
||||||
};
|
};
|
||||||
|
} // namespace
|
||||||
|
|
||||||
const char* DownloadHandlerConstants::BT_EXTENSIONS[] = { ".torrent" };
|
const char** getMetalinkContentTypes()
|
||||||
|
{
|
||||||
|
return METALINK_CONTENT_TYPES;
|
||||||
|
}
|
||||||
|
|
||||||
const char* DownloadHandlerConstants::BT_CONTENT_TYPES[] = {
|
namespace {
|
||||||
"application/x-bittorrent"
|
const char* BT_EXTENSIONS[] = {
|
||||||
|
".torrent",
|
||||||
|
0
|
||||||
};
|
};
|
||||||
|
} // namespace
|
||||||
|
|
||||||
const std::vector<std::string>&
|
const char** getBtExtensions()
|
||||||
DownloadHandlerConstants::getMetalinkExtensions()
|
|
||||||
{
|
{
|
||||||
static const std::vector<std::string> l
|
return BT_EXTENSIONS;
|
||||||
(vbegin(METALINK_EXTENSIONS), vend(METALINK_EXTENSIONS));
|
|
||||||
return l;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::vector<std::string>&
|
namespace {
|
||||||
DownloadHandlerConstants::getMetalinkContentTypes()
|
const char* BT_CONTENT_TYPES[] = {
|
||||||
{
|
"application/x-bittorrent",
|
||||||
static const std::vector<std::string> l
|
0
|
||||||
(vbegin(METALINK_CONTENT_TYPES), vend(METALINK_CONTENT_TYPES));
|
};
|
||||||
return l;
|
} // namespace
|
||||||
}
|
|
||||||
|
|
||||||
const std::vector<std::string>& DownloadHandlerConstants::getBtExtensions()
|
const char** getBtContentTypes()
|
||||||
{
|
{
|
||||||
static const std::vector<std::string> l
|
return BT_CONTENT_TYPES;
|
||||||
(vbegin(BT_EXTENSIONS), vend(BT_EXTENSIONS));
|
|
||||||
return l;
|
|
||||||
}
|
|
||||||
|
|
||||||
const std::vector<std::string>& DownloadHandlerConstants::getBtContentTypes()
|
|
||||||
{
|
|
||||||
static const std::vector<std::string> l
|
|
||||||
(vbegin(BT_CONTENT_TYPES), vend(BT_CONTENT_TYPES));
|
|
||||||
return l;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace aria2
|
} // namespace aria2
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
/*
|
/*
|
||||||
* aria2 - The high speed download utility
|
* 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
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -36,30 +36,18 @@
|
||||||
#define D_DOWNLOAD_HANDLER_CONSTANTS_H
|
#define D_DOWNLOAD_HANDLER_CONSTANTS_H
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
namespace aria2 {
|
namespace aria2 {
|
||||||
|
|
||||||
class DownloadHandlerConstants
|
// These methods returns NULL-terminated list of c-strings.
|
||||||
{
|
|
||||||
public:
|
|
||||||
static const char* METALINK_EXTENSIONS[];
|
|
||||||
|
|
||||||
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[];
|
const char** getBtContentTypes();
|
||||||
|
|
||||||
static const std::vector<std::string>& getBtExtensions();
|
|
||||||
|
|
||||||
static const char* BT_CONTENT_TYPES[];
|
|
||||||
|
|
||||||
static const std::vector<std::string>& getBtContentTypes();
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace aria2
|
} // namespace aria2
|
||||||
|
|
||||||
|
|
|
@ -74,10 +74,7 @@ DownloadHandlerFactory::getMetalinkPreDownloadHandler()
|
||||||
|
|
||||||
RequestGroupCriteriaHandle criteria
|
RequestGroupCriteriaHandle criteria
|
||||||
(new ContentTypeRequestGroupCriteria
|
(new ContentTypeRequestGroupCriteria
|
||||||
(DownloadHandlerConstants::getMetalinkContentTypes().begin(),
|
(getMetalinkContentTypes(), getMetalinkExtensions()));
|
||||||
DownloadHandlerConstants::getMetalinkContentTypes().end(),
|
|
||||||
DownloadHandlerConstants::getMetalinkExtensions().begin(),
|
|
||||||
DownloadHandlerConstants::getMetalinkExtensions().end()));
|
|
||||||
metalinkPreDownloadHandler_->setCriteria(criteria);
|
metalinkPreDownloadHandler_->setCriteria(criteria);
|
||||||
}
|
}
|
||||||
return metalinkPreDownloadHandler_;
|
return metalinkPreDownloadHandler_;
|
||||||
|
@ -105,10 +102,7 @@ DownloadHandlerFactory::getBtPreDownloadHandler()
|
||||||
|
|
||||||
RequestGroupCriteriaHandle criteria
|
RequestGroupCriteriaHandle criteria
|
||||||
(new ContentTypeRequestGroupCriteria
|
(new ContentTypeRequestGroupCriteria
|
||||||
(DownloadHandlerConstants::getBtContentTypes().begin(),
|
(getBtContentTypes(), getBtExtensions()));
|
||||||
DownloadHandlerConstants::getBtContentTypes().end(),
|
|
||||||
DownloadHandlerConstants::getBtExtensions().begin(),
|
|
||||||
DownloadHandlerConstants::getBtExtensions().end()));
|
|
||||||
btPreDownloadHandler_->setCriteria(criteria);
|
btPreDownloadHandler_->setCriteria(criteria);
|
||||||
}
|
}
|
||||||
return btPreDownloadHandler_;
|
return btPreDownloadHandler_;
|
||||||
|
|
|
@ -51,6 +51,7 @@
|
||||||
#include "TimeA2.h"
|
#include "TimeA2.h"
|
||||||
#include "array_fun.h"
|
#include "array_fun.h"
|
||||||
#include "Request.h"
|
#include "Request.h"
|
||||||
|
#include "DownloadHandlerConstants.h"
|
||||||
|
|
||||||
namespace aria2 {
|
namespace aria2 {
|
||||||
|
|
||||||
|
@ -58,6 +59,7 @@ const std::string HttpRequest::USER_AGENT("aria2");
|
||||||
|
|
||||||
HttpRequest::HttpRequest():contentEncodingEnabled_(true),
|
HttpRequest::HttpRequest():contentEncodingEnabled_(true),
|
||||||
userAgent_(USER_AGENT),
|
userAgent_(USER_AGENT),
|
||||||
|
acceptMetalink_(false),
|
||||||
noCache_(true),
|
noCache_(true),
|
||||||
acceptGzip_(false),
|
acceptGzip_(false),
|
||||||
endOffsetOverride_(0)
|
endOffsetOverride_(0)
|
||||||
|
@ -164,10 +166,13 @@ std::string HttpRequest::createRequest()
|
||||||
builtinHds.reserve(20);
|
builtinHds.reserve(20);
|
||||||
builtinHds.push_back(std::make_pair("User-Agent:", userAgent_));
|
builtinHds.push_back(std::make_pair("User-Agent:", userAgent_));
|
||||||
std::string acceptTypes = "*/*";
|
std::string acceptTypes = "*/*";
|
||||||
for(std::vector<std::string>::const_iterator i = acceptTypes_.begin(),
|
if(acceptMetalink_) {
|
||||||
eoi = acceptTypes_.end(); i != eoi; ++i) {
|
// The mime types of Metalink are used for "transparent metalink".
|
||||||
|
const char** metalinkTypes = getMetalinkContentTypes();
|
||||||
|
for(size_t i = 0; metalinkTypes[i]; ++i) {
|
||||||
acceptTypes += ",";
|
acceptTypes += ",";
|
||||||
acceptTypes += *i;
|
acceptTypes += metalinkTypes[i];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
builtinHds.push_back(std::make_pair("Accept:", acceptTypes));
|
builtinHds.push_back(std::make_pair("Accept:", acceptTypes));
|
||||||
if(contentEncodingEnabled_) {
|
if(contentEncodingEnabled_) {
|
||||||
|
@ -328,11 +333,6 @@ void HttpRequest::clearHeader()
|
||||||
headers_.clear();
|
headers_.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void HttpRequest::addAcceptType(const std::string& type)
|
|
||||||
{
|
|
||||||
acceptTypes_.push_back(type);
|
|
||||||
}
|
|
||||||
|
|
||||||
void HttpRequest::setCookieStorage
|
void HttpRequest::setCookieStorage
|
||||||
(const SharedHandle<CookieStorage>& cookieStorage)
|
(const SharedHandle<CookieStorage>& cookieStorage)
|
||||||
{
|
{
|
||||||
|
|
|
@ -71,7 +71,8 @@ private:
|
||||||
|
|
||||||
std::vector<std::string> headers_;
|
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_;
|
SharedHandle<CookieStorage> cookieStorage_;
|
||||||
|
|
||||||
|
@ -172,10 +173,9 @@ public:
|
||||||
|
|
||||||
void addAcceptType(const std::string& type);
|
void addAcceptType(const std::string& type);
|
||||||
|
|
||||||
template<typename InputIterator>
|
void setAcceptMetalink(bool f)
|
||||||
void addAcceptType(InputIterator first, InputIterator last)
|
|
||||||
{
|
{
|
||||||
acceptTypes_.insert(acceptTypes_.end(), first, last);
|
acceptMetalink_ = f;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setCookieStorage(const SharedHandle<CookieStorage>& cookieStorage);
|
void setCookieStorage(const SharedHandle<CookieStorage>& cookieStorage);
|
||||||
|
|
|
@ -103,8 +103,8 @@ createHttpRequest(const SharedHandle<Request>& req,
|
||||||
httpRequest->setCookieStorage(cookieStorage);
|
httpRequest->setCookieStorage(cookieStorage);
|
||||||
httpRequest->setAuthConfigFactory(authConfigFactory, option.get());
|
httpRequest->setAuthConfigFactory(authConfigFactory, option.get());
|
||||||
httpRequest->setProxyRequest(proxyRequest);
|
httpRequest->setProxyRequest(proxyRequest);
|
||||||
httpRequest->addAcceptType(rg->getAcceptTypes().begin(),
|
httpRequest->setAcceptMetalink(rg->getDownloadContext()->
|
||||||
rg->getAcceptTypes().end());
|
getAcceptMetalink());
|
||||||
if(option->getAsBool(PREF_HTTP_ACCEPT_GZIP)) {
|
if(option->getAsBool(PREF_HTTP_ACCEPT_GZIP)) {
|
||||||
httpRequest->enableAcceptGZip();
|
httpRequest->enableAcceptGZip();
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -197,9 +197,9 @@ bool HttpResponseCommand::executeInternal()
|
||||||
}
|
}
|
||||||
if(!getPieceStorage()) {
|
if(!getPieceStorage()) {
|
||||||
// Metalink/HTTP
|
// Metalink/HTTP
|
||||||
if(!getDownloadContext()->getMetalinkServerContacted()) {
|
if(getDownloadContext()->getAcceptMetalink()) {
|
||||||
if(httpHeader->defined(HttpHeader::LINK)) {
|
if(httpHeader->defined(HttpHeader::LINK)) {
|
||||||
getDownloadContext()->setMetalinkServerContacted(true);
|
getDownloadContext()->setAcceptMetalink(false);
|
||||||
std::vector<MetalinkHttpEntry> entries;
|
std::vector<MetalinkHttpEntry> entries;
|
||||||
httpResponse->getMetalinKHttpEntries(entries, getOption());
|
httpResponse->getMetalinKHttpEntries(entries, getOption());
|
||||||
for(std::vector<MetalinkHttpEntry>::iterator i = entries.begin(),
|
for(std::vector<MetalinkHttpEntry>::iterator i = entries.begin(),
|
||||||
|
@ -245,7 +245,7 @@ bool HttpResponseCommand::executeInternal()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(!getPieceStorage()) {
|
if(!getPieceStorage()) {
|
||||||
util::removeMetalinkContentTypes(getRequestGroup());
|
getDownloadContext()->setAcceptMetalink(false);
|
||||||
int64_t totalLength = httpResponse->getEntityLength();
|
int64_t totalLength = httpResponse->getEntityLength();
|
||||||
getFileEntry()->setLength(totalLength);
|
getFileEntry()->setLength(totalLength);
|
||||||
if(getFileEntry()->getPath().empty()) {
|
if(getFileEntry()->getPath().empty()) {
|
||||||
|
|
|
@ -229,7 +229,7 @@ Metalink2RequestGroup::createRequestGroup
|
||||||
torrentRg->clearPostDownloadHandler();
|
torrentRg->clearPostDownloadHandler();
|
||||||
// remove "metalink" from Accept Type list to avoid loop in
|
// remove "metalink" from Accept Type list to avoid loop in
|
||||||
// tranparent metalink
|
// tranparent metalink
|
||||||
util::removeMetalinkContentTypes(torrentRg);
|
torrentRg->getDownloadContext()->setAcceptMetalink(false);
|
||||||
// make it in-memory download
|
// make it in-memory download
|
||||||
SharedHandle<PreDownloadHandler> preh
|
SharedHandle<PreDownloadHandler> preh
|
||||||
(new MemoryBufferPreDownloadHandler());
|
(new MemoryBufferPreDownloadHandler());
|
||||||
|
@ -328,7 +328,7 @@ Metalink2RequestGroup::createRequestGroup
|
||||||
removeOneshotOption(option);
|
removeOneshotOption(option);
|
||||||
// remove "metalink" from Accept Type list to avoid loop in
|
// remove "metalink" from Accept Type list to avoid loop in
|
||||||
// tranparent metalink
|
// tranparent metalink
|
||||||
util::removeMetalinkContentTypes(rg);
|
dctx->setAcceptMetalink(false);
|
||||||
#ifdef ENABLE_BITTORRENT
|
#ifdef ENABLE_BITTORRENT
|
||||||
// Inject depenency between rg and torrentRg here if
|
// Inject depenency between rg and torrentRg here if
|
||||||
// torrentRg is true
|
// torrentRg is true
|
||||||
|
|
|
@ -58,10 +58,7 @@ MetalinkPostDownloadHandler::MetalinkPostDownloadHandler()
|
||||||
{
|
{
|
||||||
SharedHandle<RequestGroupCriteria> cri
|
SharedHandle<RequestGroupCriteria> cri
|
||||||
(new ContentTypeRequestGroupCriteria
|
(new ContentTypeRequestGroupCriteria
|
||||||
(DownloadHandlerConstants::getMetalinkContentTypes().begin(),
|
(getMetalinkContentTypes(), getMetalinkExtensions()));
|
||||||
DownloadHandlerConstants::getMetalinkContentTypes().end(),
|
|
||||||
DownloadHandlerConstants::getMetalinkExtensions().begin(),
|
|
||||||
DownloadHandlerConstants::getMetalinkExtensions().end()));
|
|
||||||
setCriteria(cri);
|
setCriteria(cri);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -154,12 +154,6 @@ RequestGroup::RequestGroup(const SharedHandle<Option>& option)
|
||||||
resumeFailureCount_(0)
|
resumeFailureCount_(0)
|
||||||
{
|
{
|
||||||
fileAllocationEnabled_ = option_->get(PREF_FILE_ALLOCATION) != V_NONE;
|
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)) {
|
if(!option_->getAsBool(PREF_DRY_RUN)) {
|
||||||
initializePreDownloadHandler();
|
initializePreDownloadHandler();
|
||||||
initializePostDownloadHandler();
|
initializePostDownloadHandler();
|
||||||
|
@ -1213,19 +1207,6 @@ void RequestGroup::reportDownloadFinished()
|
||||||
#endif // ENABLE_BITTORRENT
|
#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)
|
void RequestGroup::setURISelector(const SharedHandle<URISelector>& uriSelector)
|
||||||
{
|
{
|
||||||
uriSelector_ = uriSelector;
|
uriSelector_ = uriSelector;
|
||||||
|
|
|
@ -138,8 +138,6 @@ private:
|
||||||
|
|
||||||
std::vector<SharedHandle<PostDownloadHandler> > postDownloadHandlers_;
|
std::vector<SharedHandle<PostDownloadHandler> > postDownloadHandlers_;
|
||||||
|
|
||||||
std::vector<std::string> acceptTypes_;
|
|
||||||
|
|
||||||
SharedHandle<URISelector> uriSelector_;
|
SharedHandle<URISelector> uriSelector_;
|
||||||
|
|
||||||
Time lastModifiedTime_;
|
Time lastModifiedTime_;
|
||||||
|
@ -410,26 +408,6 @@ public:
|
||||||
|
|
||||||
void reportDownloadFinished();
|
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);
|
void setURISelector(const SharedHandle<URISelector>& uriSelector);
|
||||||
|
|
||||||
const SharedHandle<URISelector>& getURISelector() const
|
const SharedHandle<URISelector>& getURISelector() const
|
||||||
|
|
|
@ -255,7 +255,7 @@ TrackerWatcherCommand::createRequestGroup(const std::string& uri)
|
||||||
// RequestGroup is not handled by RequestGroupMan.
|
// RequestGroup is not handled by RequestGroupMan.
|
||||||
rg->clearPreDownloadHandler();
|
rg->clearPreDownloadHandler();
|
||||||
rg->clearPostDownloadHandler();
|
rg->clearPostDownloadHandler();
|
||||||
util::removeMetalinkContentTypes(rg);
|
dctx->setAcceptMetalink(false);
|
||||||
A2_LOG_INFO(fmt("Creating tracker request group GID#%" PRId64 "", rg->getGID()));
|
A2_LOG_INFO(fmt("Creating tracker request group GID#%" PRId64 "", rg->getGID()));
|
||||||
return rg;
|
return rg;
|
||||||
}
|
}
|
||||||
|
|
|
@ -197,7 +197,7 @@ createBtRequestGroup(const std::string& metaInfoUri,
|
||||||
rg->setPauseRequested(option->getAsBool(PREF_PAUSE));
|
rg->setPauseRequested(option->getAsBool(PREF_PAUSE));
|
||||||
// Remove "metalink" from Accept Type list to avoid server from
|
// Remove "metalink" from Accept Type list to avoid server from
|
||||||
// responding Metalink file for web-seeding URIs.
|
// responding Metalink file for web-seeding URIs.
|
||||||
util::removeMetalinkContentTypes(rg);
|
dctx->setAcceptMetalink(false);
|
||||||
removeOneshotOption(option);
|
removeOneshotOption(option);
|
||||||
return rg;
|
return rg;
|
||||||
}
|
}
|
||||||
|
|
25
src/util.cc
25
src/util.cc
|
@ -1479,21 +1479,6 @@ bool inSameCidrBlock
|
||||||
return (s1[last] & mask) == (s2[last] & mask);
|
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 {
|
namespace {
|
||||||
|
|
||||||
void executeHook
|
void executeHook
|
||||||
|
@ -1695,6 +1680,16 @@ bool tlsHostnameMatch(const std::string& pattern, const std::string& hostname)
|
||||||
ptWildcard+1, ptLeftLabelEnd);
|
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)
|
bool startsWith(const std::string& a, const char* b)
|
||||||
{
|
{
|
||||||
return startsWith(a.begin(), a.end(), b);
|
return startsWith(a.begin(), a.end(), b);
|
||||||
|
|
|
@ -625,6 +625,9 @@ bool strieq(InputIterator first, InputIterator last, const char* b)
|
||||||
return first == last && *b == '\0';
|
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>
|
template<typename InputIterator1, typename InputIterator2>
|
||||||
bool startsWith
|
bool startsWith
|
||||||
(InputIterator1 first1,
|
(InputIterator1 first1,
|
||||||
|
@ -762,9 +765,6 @@ std::string escapePath(const std::string& s);
|
||||||
bool inSameCidrBlock
|
bool inSameCidrBlock
|
||||||
(const std::string& ip1, const std::string& ip2, size_t bits);
|
(const std::string& ip1, const std::string& ip2, size_t bits);
|
||||||
|
|
||||||
void removeMetalinkContentTypes(const SharedHandle<RequestGroup>& group);
|
|
||||||
void removeMetalinkContentTypes(RequestGroup* group);
|
|
||||||
|
|
||||||
// No throw
|
// No throw
|
||||||
void executeHookByOptName
|
void executeHookByOptName
|
||||||
(const SharedHandle<RequestGroup>& group, const Option* option,
|
(const SharedHandle<RequestGroup>& group, const Option* option,
|
||||||
|
|
|
@ -35,7 +35,7 @@ class HttpRequestTest : public CppUnit::TestFixture {
|
||||||
CPPUNIT_TEST(testIsRangeSatisfied);
|
CPPUNIT_TEST(testIsRangeSatisfied);
|
||||||
CPPUNIT_TEST(testUserAgent);
|
CPPUNIT_TEST(testUserAgent);
|
||||||
CPPUNIT_TEST(testAddHeader);
|
CPPUNIT_TEST(testAddHeader);
|
||||||
CPPUNIT_TEST(testAddAcceptType);
|
CPPUNIT_TEST(testAcceptMetalink);
|
||||||
CPPUNIT_TEST(testEnableAcceptEncoding);
|
CPPUNIT_TEST(testEnableAcceptEncoding);
|
||||||
CPPUNIT_TEST(testConditionalRequest);
|
CPPUNIT_TEST(testConditionalRequest);
|
||||||
CPPUNIT_TEST_SUITE_END();
|
CPPUNIT_TEST_SUITE_END();
|
||||||
|
@ -63,7 +63,7 @@ public:
|
||||||
void testIsRangeSatisfied();
|
void testIsRangeSatisfied();
|
||||||
void testUserAgent();
|
void testUserAgent();
|
||||||
void testAddHeader();
|
void testAddHeader();
|
||||||
void testAddAcceptType();
|
void testAcceptMetalink();
|
||||||
void testEnableAcceptEncoding();
|
void testEnableAcceptEncoding();
|
||||||
void testConditionalRequest();
|
void testConditionalRequest();
|
||||||
};
|
};
|
||||||
|
@ -758,11 +758,8 @@ void HttpRequestTest::testAddHeader()
|
||||||
CPPUNIT_ASSERT_EQUAL(expectedText, httpRequest.createRequest());
|
CPPUNIT_ASSERT_EQUAL(expectedText, httpRequest.createRequest());
|
||||||
}
|
}
|
||||||
|
|
||||||
void HttpRequestTest::testAddAcceptType()
|
void HttpRequestTest::testAcceptMetalink()
|
||||||
{
|
{
|
||||||
std::string acceptTypes[] = { "cream/custard",
|
|
||||||
"muffin/chocolate" };
|
|
||||||
|
|
||||||
SharedHandle<Request> request(new Request());
|
SharedHandle<Request> request(new Request());
|
||||||
request->setUri("http://localhost/archives/aria2-1.0.0.tar.bz2");
|
request->setUri("http://localhost/archives/aria2-1.0.0.tar.bz2");
|
||||||
|
|
||||||
|
@ -770,12 +767,12 @@ void HttpRequestTest::testAddAcceptType()
|
||||||
httpRequest.disableContentEncoding();
|
httpRequest.disableContentEncoding();
|
||||||
httpRequest.setRequest(request);
|
httpRequest.setRequest(request);
|
||||||
httpRequest.setAuthConfigFactory(authConfigFactory_, option_.get());
|
httpRequest.setAuthConfigFactory(authConfigFactory_, option_.get());
|
||||||
httpRequest.addAcceptType(vbegin(acceptTypes), vend(acceptTypes));
|
httpRequest.setAcceptMetalink(true);
|
||||||
|
|
||||||
std::string expectedText =
|
std::string expectedText =
|
||||||
"GET /archives/aria2-1.0.0.tar.bz2 HTTP/1.1\r\n"
|
"GET /archives/aria2-1.0.0.tar.bz2 HTTP/1.1\r\n"
|
||||||
"User-Agent: aria2\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"
|
"Host: localhost\r\n"
|
||||||
"Pragma: no-cache\r\n"
|
"Pragma: no-cache\r\n"
|
||||||
"Cache-Control: no-cache\r\n"
|
"Cache-Control: no-cache\r\n"
|
||||||
|
|
Loading…
Reference in New Issue