summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/AbstractCommand.cc272
-rw-r--r--src/AbstractCommand.h98
-rw-r--r--src/AbstractProxyRequestCommand.cc22
-rw-r--r--src/AbstractProxyRequestCommand.h11
-rw-r--r--src/AbstractProxyResponseCommand.cc8
-rw-r--r--src/AbstractProxyResponseCommand.h9
-rw-r--r--src/CreateRequestCommand.cc54
-rw-r--r--src/DownloadCommand.cc119
-rw-r--r--src/DownloadCommand.h31
-rw-r--r--src/FtpDownloadCommand.cc14
-rw-r--r--src/FtpDownloadCommand.h2
-rw-r--r--src/FtpFinishDownloadCommand.cc11
-rw-r--r--src/FtpInitiateConnectionCommand.cc67
-rw-r--r--src/FtpNegotiationCommand.cc338
-rw-r--r--src/FtpNegotiationCommand.h8
-rw-r--r--src/FtpTunnelRequestCommand.cc3
-rw-r--r--src/FtpTunnelResponseCommand.cc5
-rw-r--r--src/HttpDownloadCommand.cc45
-rw-r--r--src/HttpInitiateConnectionCommand.cc63
-rw-r--r--src/HttpProxyRequestCommand.cc3
-rw-r--r--src/HttpProxyResponseCommand.cc5
-rw-r--r--src/HttpRequestCommand.cc63
-rw-r--r--src/HttpResponseCommand.cc156
-rw-r--r--src/HttpResponseCommand.h2
-rw-r--r--src/HttpSkipResponseCommand.cc31
-rw-r--r--src/InitiateConnectionCommand.cc21
26 files changed, 793 insertions, 668 deletions
diff --git a/src/AbstractCommand.cc b/src/AbstractCommand.cc
index 1973020d..038780ef 100644
--- a/src/AbstractCommand.cc
+++ b/src/AbstractCommand.cc
@@ -77,15 +77,16 @@ AbstractCommand::AbstractCommand(cuid_t cuid,
RequestGroup* requestGroup,
DownloadEngine* e,
const SocketHandle& s):
- Command(cuid), checkPoint(global::wallclock), _requestGroup(requestGroup),
- req(req), _fileEntry(fileEntry), e(e), socket(s),
- checkSocketIsReadable(false), checkSocketIsWritable(false),
- nameResolverCheck(false)
+ Command(cuid), _checkPoint(global::wallclock),
+ _timeout(requestGroup->getTimeout()),
+ _requestGroup(requestGroup),
+ _req(req), _fileEntry(fileEntry), _e(e), _socket(s),
+ _checkSocketIsReadable(false), _checkSocketIsWritable(false),
+ _nameResolverCheck(false)
{
- if(!socket.isNull() && socket->isOpen()) {
- setReadCheckSocket(socket);
+ if(!_socket.isNull() && _socket->isOpen()) {
+ setReadCheckSocket(_socket);
}
- timeout = _requestGroup->getTimeout();
_requestGroup->increaseStreamConnection();
_requestGroup->increaseNumCommand();
}
@@ -113,19 +114,19 @@ bool AbstractCommand::execute() {
if(_requestGroup->downloadFinished() || _requestGroup->isHaltRequested()) {
return true;
}
- if(!req.isNull() && req->removalRequested()) {
+ if(!_req.isNull() && _req->removalRequested()) {
if(getLogger()->debug()) {
getLogger()->debug
("CUID#%s - Discard original URI=%s because it is requested.",
- util::itos(getCuid()).c_str(), req->getUri().c_str());
+ util::itos(getCuid()).c_str(), _req->getUri().c_str());
}
return prepareForRetry(0);
}
// TODO it is not needed to check other PeerStats every time.
// Find faster Request when no segment is available.
- if(!req.isNull() && _fileEntry->countPooledRequest() > 0 &&
- !_requestGroup->getPieceStorage()->hasMissingUnusedPiece()) {
- SharedHandle<Request> fasterRequest = _fileEntry->findFasterRequest(req);
+ if(!_req.isNull() && _fileEntry->countPooledRequest() > 0 &&
+ !getPieceStorage()->hasMissingUnusedPiece()) {
+ SharedHandle<Request> fasterRequest = _fileEntry->findFasterRequest(_req);
if(!fasterRequest.isNull()) {
if(getLogger()->info()) {
getLogger()->info("CUID#%s - Use faster Request hostname=%s, port=%u",
@@ -134,29 +135,28 @@ bool AbstractCommand::execute() {
fasterRequest->getPort());
}
// Cancel current Request object and use faster one.
- _fileEntry->removeRequest(req);
+ _fileEntry->removeRequest(_req);
Command* command =
InitiateConnectionCommandFactory::createInitiateConnectionCommand
- (getCuid(), fasterRequest, _fileEntry, _requestGroup, e);
- e->setNoWait(true);
- e->addCommand(command);
+ (getCuid(), fasterRequest, _fileEntry, _requestGroup, _e);
+ _e->setNoWait(true);
+ _e->addCommand(command);
return true;
}
}
- if((checkSocketIsReadable && readEventEnabled()) ||
- (checkSocketIsWritable && writeEventEnabled()) ||
+ if((_checkSocketIsReadable && readEventEnabled()) ||
+ (_checkSocketIsWritable && writeEventEnabled()) ||
hupEventEnabled() ||
#ifdef ENABLE_ASYNC_DNS
- (nameResolverCheck && nameResolveFinished()) ||
+ (_nameResolverCheck && nameResolveFinished()) ||
#endif // ENABLE_ASYNC_DNS
- (!checkSocketIsReadable && !checkSocketIsWritable &&
- !nameResolverCheck)) {
- checkPoint = global::wallclock;
- if(!_requestGroup->getPieceStorage().isNull()) {
+ (!_checkSocketIsReadable && !_checkSocketIsWritable &&
+ !_nameResolverCheck)) {
+ _checkPoint = global::wallclock;
+ if(!getPieceStorage().isNull()) {
_segments.clear();
- _requestGroup->getSegmentMan()->getInFlightSegment
- (_segments, getCuid());
- if(!req.isNull() && _segments.empty()) {
+ getSegmentMan()->getInFlightSegment(_segments, getCuid());
+ if(!_req.isNull() && _segments.empty()) {
// This command previously has assigned segments, but it is
// canceled. So discard current request chain.
if(getLogger()->debug()) {
@@ -166,11 +166,11 @@ bool AbstractCommand::execute() {
}
return prepareForRetry(0);
}
- if(req.isNull() || req->getMaxPipelinedRequest() == 1 ||
+ if(_req.isNull() || _req->getMaxPipelinedRequest() == 1 ||
_requestGroup->getDownloadContext()->getFileEntries().size() == 1) {
if(_segments.empty()) {
SharedHandle<Segment> segment =
- _requestGroup->getSegmentMan()->getSegment(getCuid());
+ getSegmentMan()->getSegment(getCuid());
if(!segment.isNull()) {
_segments.push_back(segment);
}
@@ -183,7 +183,7 @@ bool AbstractCommand::execute() {
}
// When all segments are ignored in SegmentMan, there are
// no URIs available, so don't retry.
- if(_requestGroup->getSegmentMan()->allSegmentsIgnored()) {
+ if(getSegmentMan()->allSegmentsIgnored()) {
if(getLogger()->debug()) {
getLogger()->debug("All segments are ignored.");
}
@@ -193,9 +193,9 @@ bool AbstractCommand::execute() {
}
}
} else {
- size_t maxSegments = req->getMaxPipelinedRequest();
+ size_t maxSegments = _req->getMaxPipelinedRequest();
if(_segments.size() < maxSegments) {
- _requestGroup->getSegmentMan()->getSegment
+ getSegmentMan()->getSegment
(_segments, getCuid(), _fileEntry, maxSegments);
}
if(_segments.empty()) {
@@ -207,23 +207,23 @@ bool AbstractCommand::execute() {
} else if(errorEventEnabled()) {
throw DL_RETRY_EX
(StringFormat(MSG_NETWORK_PROBLEM,
- socket->getSocketError().c_str()).str());
+ _socket->getSocketError().c_str()).str());
} else {
- if(checkPoint.difference(global::wallclock) >= timeout) {
+ if(_checkPoint.difference(global::wallclock) >= _timeout) {
// timeout triggers ServerStat error state.
SharedHandle<ServerStat> ss =
- e->getRequestGroupMan()->getOrCreateServerStat(req->getHost(),
- req->getProtocol());
+ _e->getRequestGroupMan()->getOrCreateServerStat(_req->getHost(),
+ _req->getProtocol());
ss->setError();
throw DL_RETRY_EX2(EX_TIME_OUT, downloadresultcode::TIME_OUT);
}
- e->addCommand(this);
+ _e->addCommand(this);
return false;
}
} catch(DlAbortEx& err) {
- if(req.isNull()) {
+ if(_req.isNull()) {
if(getLogger()->debug()) {
getLogger()->debug(EX_EXCEPTION_CAUGHT, err);
}
@@ -231,10 +231,10 @@ bool AbstractCommand::execute() {
getLogger()->error
(MSG_DOWNLOAD_ABORTED,
DL_ABORT_EX2(StringFormat
- ("URI=%s", req->getCurrentUri().c_str()).str(),err),
- util::itos(getCuid()).c_str(), req->getUri().c_str());
- _fileEntry->addURIResult(req->getUri(), err.getCode());
- _requestGroup->setLastUriResult(req->getUri(), err.getCode());
+ ("URI=%s", _req->getCurrentUri().c_str()).str(),err),
+ util::itos(getCuid()).c_str(), _req->getUri().c_str());
+ _fileEntry->addURIResult(_req->getUri(), err.getCode());
+ _requestGroup->setLastUriResult(_req->getUri(), err.getCode());
if(err.getCode() == downloadresultcode::CANNOT_RESUME) {
_requestGroup->increaseResumeFailureCount();
}
@@ -243,29 +243,29 @@ bool AbstractCommand::execute() {
tryReserved();
return true;
} catch(DlRetryEx& err) {
- assert(!req.isNull());
+ assert(!_req.isNull());
if(getLogger()->info()) {
getLogger()->info
(MSG_RESTARTING_DOWNLOAD,
DL_RETRY_EX2(StringFormat
- ("URI=%s", req->getCurrentUri().c_str()).str(),
+ ("URI=%s", _req->getCurrentUri().c_str()).str(),
err),
- util::itos(getCuid()).c_str(), req->getUri().c_str());
+ util::itos(getCuid()).c_str(), _req->getUri().c_str());
}
- req->addTryCount();
- req->resetRedirectCount();
+ _req->addTryCount();
+ _req->resetRedirectCount();
const unsigned int maxTries = getOption()->getAsInt(PREF_MAX_TRIES);
- bool isAbort = maxTries != 0 && req->getTryCount() >= maxTries;
+ bool isAbort = maxTries != 0 && _req->getTryCount() >= maxTries;
if(isAbort) {
if(getLogger()->info()) {
getLogger()->info(MSG_MAX_TRY,
- util::itos(getCuid()).c_str(), req->getTryCount());
+ util::itos(getCuid()).c_str(), _req->getTryCount());
}
getLogger()->error(MSG_DOWNLOAD_ABORTED, err,
util::itos(getCuid()).c_str(),
- req->getUri().c_str());
- _fileEntry->addURIResult(req->getUri(), err.getCode());
- _requestGroup->setLastUriResult(req->getUri(), err.getCode());
+ _req->getUri().c_str());
+ _fileEntry->addURIResult(_req->getUri(), err.getCode());
+ _requestGroup->setLastUriResult(_req->getUri(), err.getCode());
if(err.getCode() == downloadresultcode::CANNOT_RESUME) {
_requestGroup->increaseResumeFailureCount();
}
@@ -277,9 +277,9 @@ bool AbstractCommand::execute() {
}
} catch(DownloadFailureException& err) {
getLogger()->error(EX_EXCEPTION_CAUGHT, err);
- if(!req.isNull()) {
- _fileEntry->addURIResult(req->getUri(), err.getCode());
- _requestGroup->setLastUriResult(req->getUri(), err.getCode());
+ if(!_req.isNull()) {
+ _fileEntry->addURIResult(_req->getUri(), err.getCode());
+ _requestGroup->setLastUriResult(_req->getUri(), err.getCode());
}
_requestGroup->setHaltRequested(true);
return true;
@@ -308,59 +308,58 @@ void AbstractCommand::tryReserved() {
util::itos(getCuid()).c_str());
}
std::vector<Command*> commands;
- _requestGroup->createNextCommand(commands, e, 1);
- e->setNoWait(true);
- e->addCommand(commands);
+ _requestGroup->createNextCommand(commands, _e, 1);
+ _e->setNoWait(true);
+ _e->addCommand(commands);
}
bool AbstractCommand::prepareForRetry(time_t wait) {
- if(!_requestGroup->getPieceStorage().isNull()) {
- _requestGroup->getSegmentMan()->cancelSegment(getCuid());
+ if(!getPieceStorage().isNull()) {
+ getSegmentMan()->cancelSegment(getCuid());
}
- if(!req.isNull()) {
- _fileEntry->poolRequest(req);
+ if(!_req.isNull()) {
+ _fileEntry->poolRequest(_req);
if(getLogger()->debug()) {
getLogger()->debug("CUID#%s - Pooling request URI=%s",
- util::itos(getCuid()).c_str(), req->getUri().c_str());
+ util::itos(getCuid()).c_str(), _req->getUri().c_str());
}
- if(!_requestGroup->getSegmentMan().isNull()) {
- _requestGroup->getSegmentMan()->recognizeSegmentFor(_fileEntry);
+ if(!getSegmentMan().isNull()) {
+ getSegmentMan()->recognizeSegmentFor(_fileEntry);
}
}
- Command* command = new CreateRequestCommand(getCuid(), _requestGroup, e);
+ Command* command = new CreateRequestCommand(getCuid(), _requestGroup, _e);
if(wait == 0) {
- e->setNoWait(true);
- e->addCommand(command);
+ _e->setNoWait(true);
+ _e->addCommand(command);
} else {
- SleepCommand* scom = new SleepCommand(getCuid(), e, _requestGroup,
+ SleepCommand* scom = new SleepCommand(getCuid(), _e, _requestGroup,
command, wait);
- e->addCommand(scom);
+ _e->addCommand(scom);
}
return true;
}
void AbstractCommand::onAbort() {
- if(!req.isNull()) {
+ if(!_req.isNull()) {
// TODO This might be a problem if the failure is caused by proxy.
- e->getRequestGroupMan()->getOrCreateServerStat
- (req->getHost(), req->getProtocol())->setError();
- _fileEntry->removeIdenticalURI(req->getUri());
- _fileEntry->removeRequest(req);
+ _e->getRequestGroupMan()->getOrCreateServerStat
+ (_req->getHost(), _req->getProtocol())->setError();
+ _fileEntry->removeIdenticalURI(_req->getUri());
+ _fileEntry->removeRequest(_req);
}
if(getLogger()->debug()) {
getLogger()->debug("CUID#%s - Aborting download",
util::itos(getCuid()).c_str());
}
- if(!_requestGroup->getPieceStorage().isNull()) {
- SharedHandle<SegmentMan> segmentMan = _requestGroup->getSegmentMan();
- segmentMan->cancelSegment(getCuid());
+ if(!getPieceStorage().isNull()) {
+ getSegmentMan()->cancelSegment(getCuid());
// Don't do following process if BitTorrent is involved or files
// in DownloadContext is more than 1. The latter condition is
// limitation of current implementation.
if(!getOption()->getAsBool(PREF_ALWAYS_RESUME) &&
!_fileEntry.isNull() &&
- segmentMan->calculateSessionDownloadLength() == 0 &&
+ getSegmentMan()->calculateSessionDownloadLength() == 0 &&
!_requestGroup->p2pInvolved() &&
_requestGroup->getDownloadContext()->getFileEntries().size() == 1) {
const int maxTries = getOption()->getAsInt(PREF_MAX_RESUME_FAILURE_TRIES);
@@ -383,9 +382,9 @@ void AbstractCommand::onAbort() {
std::deque<URIResult> res;
_fileEntry->extractURIResult(res, downloadresultcode::CANNOT_RESUME);
if(!res.empty()) {
- segmentMan->cancelAllSegments();
- segmentMan->eraseSegmentWrittenLengthMemo();
- _requestGroup->getPieceStorage()->markPiecesDone(0);
+ getSegmentMan()->cancelAllSegments();
+ getSegmentMan()->eraseSegmentWrittenLengthMemo();
+ getPieceStorage()->markPiecesDone(0);
std::vector<std::string> uris;
uris.reserve(res.size());
std::transform(res.begin(), res.end(), std::back_inserter(uris),
@@ -396,7 +395,7 @@ void AbstractCommand::onAbort() {
static_cast<unsigned long int>(uris.size()));
}
_fileEntry->addUris(uris.begin(), uris.end());
- segmentMan->recognizeSegmentFor(_fileEntry);
+ getSegmentMan()->recognizeSegmentFor(_fileEntry);
}
}
}
@@ -404,10 +403,10 @@ void AbstractCommand::onAbort() {
}
void AbstractCommand::disableReadCheckSocket() {
- if(checkSocketIsReadable) {
- e->deleteSocketForReadCheck(readCheckTarget, this);
- checkSocketIsReadable = false;
- readCheckTarget = SocketHandle();
+ if(_checkSocketIsReadable) {
+ _e->deleteSocketForReadCheck(_readCheckTarget, this);
+ _checkSocketIsReadable = false;
+ _readCheckTarget.reset();
}
}
@@ -415,16 +414,16 @@ void AbstractCommand::setReadCheckSocket(const SocketHandle& socket) {
if(!socket->isOpen()) {
disableReadCheckSocket();
} else {
- if(checkSocketIsReadable) {
- if(readCheckTarget != socket) {
- e->deleteSocketForReadCheck(readCheckTarget, this);
- e->addSocketForReadCheck(socket, this);
- readCheckTarget = socket;
+ if(_checkSocketIsReadable) {
+ if(_readCheckTarget != socket) {
+ _e->deleteSocketForReadCheck(_readCheckTarget, this);
+ _e->addSocketForReadCheck(socket, this);
+ _readCheckTarget = socket;
}
} else {
- e->addSocketForReadCheck(socket, this);
- checkSocketIsReadable = true;
- readCheckTarget = socket;
+ _e->addSocketForReadCheck(socket, this);
+ _checkSocketIsReadable = true;
+ _readCheckTarget = socket;
}
}
}
@@ -440,10 +439,10 @@ void AbstractCommand::setReadCheckSocketIf
}
void AbstractCommand::disableWriteCheckSocket() {
- if(checkSocketIsWritable) {
- e->deleteSocketForWriteCheck(writeCheckTarget, this);
- checkSocketIsWritable = false;
- writeCheckTarget = SocketHandle();
+ if(_checkSocketIsWritable) {
+ _e->deleteSocketForWriteCheck(_writeCheckTarget, this);
+ _checkSocketIsWritable = false;
+ _writeCheckTarget.reset();
}
}
@@ -451,16 +450,16 @@ void AbstractCommand::setWriteCheckSocket(const SocketHandle& socket) {
if(!socket->isOpen()) {
disableWriteCheckSocket();
} else {
- if(checkSocketIsWritable) {
- if(writeCheckTarget != socket) {
- e->deleteSocketForWriteCheck(writeCheckTarget, this);
- e->addSocketForWriteCheck(socket, this);
- writeCheckTarget = socket;
+ if(_checkSocketIsWritable) {
+ if(_writeCheckTarget != socket) {
+ _e->deleteSocketForWriteCheck(_writeCheckTarget, this);
+ _e->addSocketForWriteCheck(socket, this);
+ _writeCheckTarget = socket;
}
} else {
- e->addSocketForWriteCheck(socket, this);
- checkSocketIsWritable = true;
- writeCheckTarget = socket;
+ _e->addSocketForWriteCheck(socket, this);
+ _checkSocketIsWritable = true;
+ _writeCheckTarget = socket;
}
}
}
@@ -570,17 +569,17 @@ static bool inNoProxy(const SharedHandle<Request>& req,
bool AbstractCommand::isProxyDefined() const
{
- return isProxyRequest(req->getProtocol(), getOption()) &&
- !inNoProxy(req, getOption()->get(PREF_NO_PROXY));
+ return isProxyRequest(_req->getProtocol(), getOption()) &&
+ !inNoProxy(_req, getOption()->get(PREF_NO_PROXY));
}
SharedHandle<Request> AbstractCommand::createProxyRequest() const
{
SharedHandle<Request> proxyRequest;
- if(inNoProxy(req, getOption()->get(PREF_NO_PROXY))) {
+ if(inNoProxy(_req, getOption()->get(PREF_NO_PROXY))) {
return proxyRequest;
}
- std::string proxy = getProxyUri(req->getProtocol(), getOption());
+ std::string proxy = getProxyUri(_req->getProtocol(), getOption());
if(!proxy.empty()) {
proxyRequest.reset(new Request());
if(proxyRequest->setUri(proxy)) {
@@ -625,9 +624,9 @@ bool AbstractCommand::asyncResolveHostname()
return true;
case AsyncNameResolver::STATUS_ERROR:
disableNameResolverCheck(_asyncNameResolver);
- if(!isProxyRequest(req->getProtocol(), getOption())) {
- e->getRequestGroupMan()->getOrCreateServerStat
- (req->getHost(), req->getProtocol())->setError();
+ if(!isProxyRequest(_req->getProtocol(), getOption())) {
+ _e->getRequestGroupMan()->getOrCreateServerStat
+ (_req->getHost(), _req->getProtocol())->setError();
}
throw DL_ABORT_EX
(StringFormat(MSG_NAME_RESOLUTION_FAILED,
@@ -647,16 +646,16 @@ const std::vector<std::string>& AbstractCommand::getResolvedAddresses()
void AbstractCommand::setNameResolverCheck
(const SharedHandle<AsyncNameResolver>& resolver) {
if(!resolver.isNull()) {
- nameResolverCheck = true;
- e->addNameResolverCheck(resolver, this);
+ _nameResolverCheck = true;
+ _e->addNameResolverCheck(resolver, this);
}
}
void AbstractCommand::disableNameResolverCheck
(const SharedHandle<AsyncNameResolver>& resolver) {
if(!resolver.isNull()) {
- nameResolverCheck = false;
- e->deleteNameResolverCheck(resolver, this);
+ _nameResolverCheck = false;
+ _e->deleteNameResolverCheck(resolver, this);
}
}
@@ -670,7 +669,7 @@ bool AbstractCommand::nameResolveFinished() const {
std::string AbstractCommand::resolveHostname
(std::vector<std::string>& addrs, const std::string& hostname, uint16_t port)
{
- e->findAllCachedIPAddresses(std::back_inserter(addrs), hostname, port);
+ _e->findAllCachedIPAddresses(std::back_inserter(addrs), hostname, port);
std::string ipaddr;
if(addrs.empty()) {
#ifdef ENABLE_ASYNC_DNS
@@ -688,7 +687,7 @@ std::string AbstractCommand::resolveHostname
{
NameResolver res;
res.setSocktype(SOCK_STREAM);
- if(e->getOption()->getAsBool(PREF_DISABLE_IPV6)) {
+ if(_e->getOption()->getAsBool(PREF_DISABLE_IPV6)) {
res.setFamily(AF_INET);
}
res.resolve(addrs, hostname);
@@ -701,9 +700,9 @@ std::string AbstractCommand::resolveHostname
}
for(std::vector<std::string>::const_iterator i = addrs.begin(),
eoi = addrs.end(); i != eoi; ++i) {
- e->cacheIPAddress(hostname, *i, port);
+ _e->cacheIPAddress(hostname, *i, port);
}
- ipaddr = e->findCachedIPAddress(hostname, port);
+ ipaddr = _e->findCachedIPAddress(hostname, port);
} else {
ipaddr = addrs.front();
if(getLogger()->info()) {
@@ -725,13 +724,13 @@ void AbstractCommand::prepareForNextAction(Command* nextCommand)
std::vector<Command*> commands;
try {
- _requestGroup->processCheckIntegrityEntry(commands, entry, e);
+ _requestGroup->processCheckIntegrityEntry(commands, entry, _e);
} catch(RecoverableException& e) {
std::for_each(commands.begin(), commands.end(), Deleter());
throw;
}
- e->addCommand(commands);
- e->setNoWait(true);
+ _e->addCommand(commands);
+ _e->setNoWait(true);
}
bool AbstractCommand::checkIfConnectionEstablished
@@ -744,8 +743,8 @@ bool AbstractCommand::checkIfConnectionEstablished
std::string error = socket->getSocketError();
if(!error.empty()) {
// See also InitiateConnectionCommand::executeInternal()
- e->markBadIPAddress(connectedHostname, connectedAddr, connectedPort);
- if(!e->findCachedIPAddress(connectedHostname, connectedPort).empty()) {
+ _e->markBadIPAddress(connectedHostname, connectedAddr, connectedPort);
+ if(!_e->findCachedIPAddress(connectedHostname, connectedPort).empty()) {
if(getLogger()->info()) {
getLogger()->info(MSG_CONNECT_FAILED_AND_RETRY,
util::itos(getCuid()).c_str(),
@@ -753,17 +752,17 @@ bool AbstractCommand::checkIfConnectionEstablished
}
Command* command =
InitiateConnectionCommandFactory::createInitiateConnectionCommand
- (getCuid(), req, _fileEntry, _requestGroup, e);
- e->setNoWait(true);
- e->addCommand(command);
+ (getCuid(), _req, _fileEntry, _requestGroup, _e);
+ _e->setNoWait(true);
+ _e->addCommand(command);
return false;
}
- e->removeCachedIPAddress(connectedHostname, connectedPort);
+ _e->removeCachedIPAddress(connectedHostname, connectedPort);
// Don't set error if proxy server is used and its method is GET.
- if(resolveProxyMethod(req->getProtocol()) != V_GET ||
- !isProxyRequest(req->getProtocol(), getOption())) {
- e->getRequestGroupMan()->getOrCreateServerStat
- (req->getHost(), req->getProtocol())->setError();
+ if(resolveProxyMethod(_req->getProtocol()) != V_GET ||
+ !isProxyRequest(_req->getProtocol(), getOption())) {
+ _e->getRequestGroupMan()->getOrCreateServerStat
+ (_req->getHost(), _req->getProtocol())->setError();
}
throw DL_RETRY_EX
(StringFormat(MSG_ESTABLISHING_CONNECTION_FAILED, error.c_str()).str());
@@ -788,4 +787,9 @@ const SharedHandle<Option>& AbstractCommand::getOption() const
return _requestGroup->getOption();
}
+void AbstractCommand::createSocket()
+{
+ _socket.reset(new SocketCore());
+}
+
} // namespace aria2
diff --git a/src/AbstractCommand.h b/src/AbstractCommand.h
index fc793cee..577eeedc 100644
--- a/src/AbstractCommand.h
+++ b/src/AbstractCommand.h
@@ -55,19 +55,83 @@ class AsyncNameResolver;
class AbstractCommand : public Command {
private:
- Timer checkPoint;
- time_t timeout;
-protected:
+ Timer _checkPoint;
+ time_t _timeout;
+
RequestGroup* _requestGroup;
- SharedHandle<Request> req;
+ SharedHandle<Request> _req;
SharedHandle<FileEntry> _fileEntry;
- DownloadEngine* e;
- SharedHandle<SocketCore> socket;
+ DownloadEngine* _e;
+ SharedHandle<SocketCore> _socket;
std::vector<SharedHandle<Segment> > _segments;
#ifdef ENABLE_ASYNC_DNS
SharedHandle<AsyncNameResolver> _asyncNameResolver;
+#endif // ENABLE_ASYNC_DNS
+
+ bool _checkSocketIsReadable;
+ bool _checkSocketIsWritable;
+ SharedHandle<SocketCore> _readCheckTarget;
+ SharedHandle<SocketCore> _writeCheckTarget;
+ bool _nameResolverCheck;
+
+#ifdef ENABLE_ASYNC_DNS
+ void setNameResolverCheck(const SharedHandle<AsyncNameResolver>& resolver);
+
+ void disableNameResolverCheck
+ (const SharedHandle<AsyncNameResolver>& resolver);
+
+ bool nameResolveFinished() const;
+#endif // ENABLE_ASYNC_DNS
+protected:
+ RequestGroup* getRequestGroup() const
+ {
+ return _requestGroup;
+ }
+
+ const SharedHandle<Request>& getRequest() const
+ {
+ return _req;
+ }
+
+ void setRequest(const SharedHandle<Request>& request)
+ {
+ _req = request;
+ }
+
+ const SharedHandle<FileEntry>& getFileEntry() const
+ {
+ return _fileEntry;
+ }
+
+ void setFileEntry(const SharedHandle<FileEntry>& fileEntry)
+ {
+ _fileEntry = fileEntry;
+ }
+
+ DownloadEngine* getDownloadEngine() const
+ {
+ return _e;
+ }
+
+ const SharedHandle<SocketCore>& getSocket() const
+ {
+ return _socket;
+ }
+ void setSocket(const SharedHandle<SocketCore>& s)
+ {
+ _socket = s;
+ }
+
+ void createSocket();
+
+ const std::vector<SharedHandle<Segment> >& getSegments() const
+ {
+ return _segments;
+ }
+
+#ifdef ENABLE_ASYNC_DNS
bool isAsyncNameResolverInitialized() const;
void initAsyncNameResolver(const std::string& hostname);
@@ -106,7 +170,7 @@ protected:
*/
void setWriteCheckSocketIf(const SharedHandle<SocketCore>& socket, bool pred);
- void setTimeout(time_t timeout) { this->timeout = timeout; }
+ void setTimeout(time_t timeout) { _timeout = timeout; }
void prepareForNextAction(Command* nextCommand = 0);
@@ -143,20 +207,16 @@ protected:
{
return _requestGroup->getDownloadContext();
}
-private:
- bool checkSocketIsReadable;
- bool checkSocketIsWritable;
- SharedHandle<SocketCore> readCheckTarget;
- SharedHandle<SocketCore> writeCheckTarget;
- bool nameResolverCheck;
-#ifdef ENABLE_ASYNC_DNS
-
- void setNameResolverCheck(const SharedHandle<AsyncNameResolver>& resolver);
+ const SharedHandle<SegmentMan>& getSegmentMan() const
+ {
+ return _requestGroup->getSegmentMan();
+ }
- void disableNameResolverCheck(const SharedHandle<AsyncNameResolver>& resolver);
- bool nameResolveFinished() const;
-#endif // ENABLE_ASYNC_DNS
+ const SharedHandle<PieceStorage>& getPieceStorage() const
+ {
+ return _requestGroup->getPieceStorage();
+ }
public:
AbstractCommand(cuid_t cuid, const SharedHandle<Request>& req,
const SharedHandle<FileEntry>& fileEntry,
diff --git a/src/AbstractProxyRequestCommand.cc b/src/AbstractProxyRequestCommand.cc
index d15d9dfc..02b1850f 100644
--- a/src/AbstractProxyRequestCommand.cc
+++ b/src/AbstractProxyRequestCommand.cc
@@ -64,37 +64,37 @@ AbstractProxyRequestCommand::AbstractProxyRequestCommand
:
AbstractCommand(cuid, req, fileEntry, requestGroup, e, s),
_proxyRequest(proxyRequest),
- httpConnection(new HttpConnection(cuid, s, getOption().get()))
+ _httpConnection(new HttpConnection(cuid, s, getOption().get()))
{
setTimeout(getOption()->getAsInt(PREF_CONNECT_TIMEOUT));
disableReadCheckSocket();
- setWriteCheckSocket(socket);
+ setWriteCheckSocket(getSocket());
}
AbstractProxyRequestCommand::~AbstractProxyRequestCommand() {}
bool AbstractProxyRequestCommand::executeInternal() {
//socket->setBlockingMode();
- if(httpConnection->sendBufferIsEmpty()) {
+ if(_httpConnection->sendBufferIsEmpty()) {
if(!checkIfConnectionEstablished
- (socket, _connectedHostname, _connectedAddr, _connectedPort)) {
+ (getSocket(), _connectedHostname, _connectedAddr, _connectedPort)) {
return true;
}
SharedHandle<HttpRequest> httpRequest(new HttpRequest());
httpRequest->setUserAgent(getOption()->get(PREF_USER_AGENT));
- httpRequest->setRequest(req);
+ httpRequest->setRequest(getRequest());
httpRequest->setProxyRequest(_proxyRequest);
- httpConnection->sendProxyRequest(httpRequest);
+ _httpConnection->sendProxyRequest(httpRequest);
} else {
- httpConnection->sendPendingData();
+ _httpConnection->sendPendingData();
}
- if(httpConnection->sendBufferIsEmpty()) {
- e->addCommand(getNextCommand());
+ if(_httpConnection->sendBufferIsEmpty()) {
+ getDownloadEngine()->addCommand(getNextCommand());
return true;
} else {
- setWriteCheckSocket(socket);
- e->addCommand(this);
+ setWriteCheckSocket(getSocket());
+ getDownloadEngine()->addCommand(this);
return false;
}
}
diff --git a/src/AbstractProxyRequestCommand.h b/src/AbstractProxyRequestCommand.h
index 4ffad746..0dfabbd3 100644
--- a/src/AbstractProxyRequestCommand.h
+++ b/src/AbstractProxyRequestCommand.h
@@ -43,16 +43,21 @@ class HttpConnection;
class SocketCore;
class AbstractProxyRequestCommand : public AbstractCommand {
-protected:
+private:
SharedHandle<Request> _proxyRequest;
- SharedHandle<HttpConnection> httpConnection;
+ SharedHandle<HttpConnection> _httpConnection;
std::string _connectedHostname;
std::string _connectedAddr;
uint16_t _connectedPort;
-
+protected:
virtual bool executeInternal();
+
+ const SharedHandle<HttpConnection>& getHttpConnection() const
+ {
+ return _httpConnection;
+ }
public:
AbstractProxyRequestCommand(cuid_t cuid,
const SharedHandle<Request>& req,
diff --git a/src/AbstractProxyResponseCommand.cc b/src/AbstractProxyResponseCommand.cc
index e0e5b16a..3806507c 100644
--- a/src/AbstractProxyResponseCommand.cc
+++ b/src/AbstractProxyResponseCommand.cc
@@ -62,21 +62,21 @@ AbstractProxyResponseCommand::AbstractProxyResponseCommand
DownloadEngine* e,
const SocketHandle& s)
:AbstractCommand(cuid, req, fileEntry, requestGroup, e, s),
- httpConnection(httpConnection) {}
+ _httpConnection(httpConnection) {}
AbstractProxyResponseCommand::~AbstractProxyResponseCommand() {}
bool AbstractProxyResponseCommand::executeInternal() {
- SharedHandle<HttpResponse> httpResponse = httpConnection->receiveResponse();
+ SharedHandle<HttpResponse> httpResponse = _httpConnection->receiveResponse();
if(httpResponse.isNull()) {
// the server has not responded our request yet.
- e->addCommand(this);
+ getDownloadEngine()->addCommand(this);
return false;
}
if(httpResponse->getResponseStatus() != HttpHeader::S200) {
throw DL_RETRY_EX(EX_PROXY_CONNECTION_FAILED);
}
- e->addCommand(getNextCommand());
+ getDownloadEngine()->addCommand(getNextCommand());
return true;
}
diff --git a/src/AbstractProxyResponseCommand.h b/src/AbstractProxyResponseCommand.h
index e0b06a8f..8e391574 100644
--- a/src/AbstractProxyResponseCommand.h
+++ b/src/AbstractProxyResponseCommand.h
@@ -43,10 +43,15 @@ class HttpConnection;
class SocketCore;
class AbstractProxyResponseCommand : public AbstractCommand {
+private:
+ SharedHandle<HttpConnection> _httpConnection;
protected:
- SharedHandle<HttpConnection> httpConnection;
-
virtual bool executeInternal();
+
+ const SharedHandle<HttpConnection>& getHttpConnection() const
+ {
+ return _httpConnection;
+ }
public:
AbstractProxyResponseCommand
(cuid_t cuid,
diff --git a/src/CreateRequestCommand.cc b/src/CreateRequestCommand.cc
index 40a6c6f6..e519c017 100644
--- a/src/CreateRequestCommand.cc
+++ b/src/CreateRequestCommand.cc
@@ -67,39 +67,41 @@ CreateRequestCommand::CreateRequestCommand(cuid_t cuid,
bool CreateRequestCommand::executeInternal()
{
- if(_segments.empty()) {
- _fileEntry = _requestGroup->getDownloadContext()->findFileEntryByOffset(0);
+ if(getSegments().empty()) {
+ setFileEntry(getDownloadContext()->findFileEntryByOffset(0));
} else {
// We assume all segments belongs to same file.
- _fileEntry = _requestGroup->getDownloadContext()->findFileEntryByOffset
- (_segments.front()->getPositionToWrite());
+ setFileEntry(getDownloadContext()->findFileEntryByOffset
+ (getSegments().front()->getPositionToWrite()));
}
- if(_fileEntry->getRemainingUris().empty() &&
+ if(getFileEntry()->getRemainingUris().empty() &&
getOption()->getAsBool(PREF_REUSE_URI) &&
- _fileEntry->countPooledRequest() == 0) {
- _fileEntry->reuseUri(_requestGroup->getNumConcurrentCommand());
+ getFileEntry()->countPooledRequest() == 0) {
+ getFileEntry()->reuseUri(getRequestGroup()->getNumConcurrentCommand());
}
- req = _fileEntry->getRequest(_requestGroup->getURISelector(),
- getOption()->get(PREF_REFERER),
- // Don't use HEAD request when file
- // size is known.
- // Use HEAD for dry-run mode.
- (_fileEntry->getLength() == 0 &&
- getOption()->getAsBool(PREF_USE_HEAD)) ||
- getOption()->getAsBool(PREF_DRY_RUN)?
- Request::METHOD_HEAD:Request::METHOD_GET);
- if(req.isNull()) {
- if(!_requestGroup->getSegmentMan().isNull()) {
- _requestGroup->getSegmentMan()->ignoreSegmentFor(_fileEntry);
+ setRequest
+ (getFileEntry()->getRequest(getRequestGroup()->getURISelector(),
+ getOption()->get(PREF_REFERER),
+ // Don't use HEAD request when file
+ // size is known.
+ // Use HEAD for dry-run mode.
+ (getFileEntry()->getLength() == 0 &&
+ getOption()->getAsBool(PREF_USE_HEAD)) ||
+ getOption()->getAsBool(PREF_DRY_RUN)?
+ Request::METHOD_HEAD:Request::METHOD_GET));
+ if(getRequest().isNull()) {
+ if(!getSegmentMan().isNull()) {
+ getSegmentMan()->ignoreSegmentFor(getFileEntry());
}
throw DL_ABORT_EX("No URI available.");
}
Command* command =
InitiateConnectionCommandFactory::createInitiateConnectionCommand
- (getCuid(), req, _fileEntry, _requestGroup, e);
- e->setNoWait(true);
- e->addCommand(command);
+ (getCuid(), getRequest(), getFileEntry(), getRequestGroup(),
+ getDownloadEngine());
+ getDownloadEngine()->setNoWait(true);
+ getDownloadEngine()->addCommand(command);
return true;
}
@@ -113,16 +115,16 @@ bool CreateRequestCommand::prepareForRetry(time_t wait)
// called repeatedly. This means that newly created
// CreateRequestCommand is deleted one second later: This is not
// efficient. For this reason, reuse current CreateRequestCommand.
- if(!_requestGroup->getPieceStorage().isNull()) {
- _requestGroup->getSegmentMan()->cancelSegment(getCuid());
+ if(!getPieceStorage().isNull()) {
+ getSegmentMan()->cancelSegment(getCuid());
}
if(getLogger()->debug()) {
getLogger()->debug("CUID#%s - Reusing CreateRequestCommand",
util::itos(getCuid()).c_str());
}
SleepCommand* scom = new SleepCommand
- (getCuid(), e, _requestGroup, this, wait);
- e->addCommand(scom);
+ (getCuid(), getDownloadEngine(), getRequestGroup(), this, wait);
+ getDownloadEngine()->addCommand(scom);
return false;
}
diff --git a/src/DownloadCommand.cc b/src/DownloadCommand.cc
index 96b12d97..a9cfd24a 100644
--- a/src/DownloadCommand.cc
+++ b/src/DownloadCommand.cc
@@ -76,7 +76,9 @@ DownloadCommand::DownloadCommand(cuid_t cuid,
DownloadEngine* e,
const SocketHandle& s):
AbstractCommand(cuid, req, fileEntry, requestGroup, e, s),
- _buf(new unsigned char[BUFSIZE])
+ _buf(new unsigned char[BUFSIZE]),
+ _startupIdleTime(10),
+ _lowestDownloadSpeedLimit(0)
#ifdef ENABLE_MESSAGE_DIGEST
, _pieceHashValidationEnabled(false)
#endif // ENABLE_MESSAGE_DIGEST
@@ -84,8 +86,7 @@ DownloadCommand::DownloadCommand(cuid_t cuid,
#ifdef ENABLE_MESSAGE_DIGEST
{
if(getOption()->getAsBool(PREF_REALTIME_CHUNK_CHECKSUM)) {
- std::string algo =
- _requestGroup->getDownloadContext()->getPieceHashAlgo();
+ const std::string& algo = getDownloadContext()->getPieceHashAlgo();
if(MessageDigestContext::supports(algo)) {
_messageDigestContext.reset(new MessageDigestContext());
_messageDigestContext->trySetAlgo(algo);
@@ -97,46 +98,47 @@ DownloadCommand::DownloadCommand(cuid_t cuid,
}
#endif // ENABLE_MESSAGE_DIGEST
- peerStat = req->initPeerStat();
- peerStat->downloadStart();
- _requestGroup->getSegmentMan()->registerPeerStat(peerStat);
+ _peerStat = req->initPeerStat();
+ _peerStat->downloadStart();
+ getSegmentMan()->registerPeerStat(_peerStat);
}
DownloadCommand::~DownloadCommand() {
- peerStat->downloadStop();
- _requestGroup->getSegmentMan()->updateFastestPeerStat(peerStat);
+ _peerStat->downloadStop();
+ getSegmentMan()->updateFastestPeerStat(_peerStat);
delete [] _buf;
}
bool DownloadCommand::executeInternal() {
- if(e->getRequestGroupMan()->doesOverallDownloadSpeedExceed() ||
- _requestGroup->doesDownloadSpeedExceed()) {
- e->addCommand(this);
+ if(getDownloadEngine()->getRequestGroupMan()->doesOverallDownloadSpeedExceed()
+ || getRequestGroup()->doesDownloadSpeedExceed()) {
+ getDownloadEngine()->addCommand(this);
disableReadCheckSocket();
return false;
}
- setReadCheckSocket(socket);
- SharedHandle<Segment> segment = _segments.front();
+ setReadCheckSocket(getSocket());
+ SharedHandle<Segment> segment = getSegments().front();
size_t bufSize;
if(segment->getLength() > 0) {
if(static_cast<uint64_t>(segment->getPosition()+segment->getLength()) <=
- static_cast<uint64_t>(_fileEntry->getLastOffset())) {
+ static_cast<uint64_t>(getFileEntry()->getLastOffset())) {
bufSize = std::min(segment->getLength()-segment->getWrittenLength(),
BUFSIZE);
} else {
bufSize =
- std::min(static_cast<size_t>
- (_fileEntry->getLastOffset()-segment->getPositionToWrite()),
- BUFSIZE);
+ std::min
+ (static_cast<size_t>
+ (getFileEntry()->getLastOffset()-segment->getPositionToWrite()),
+ BUFSIZE);
}
} else {
bufSize = BUFSIZE;
}
- socket->readData(_buf, bufSize);
+ getSocket()->readData(_buf, bufSize);
const SharedHandle<DiskAdaptor>& diskAdaptor =
- _requestGroup->getPieceStorage()->getDiskAdaptor();
+ getPieceStorage()->getDiskAdaptor();
const unsigned char* bufFinal;
size_t bufSizeFinal;
@@ -173,24 +175,21 @@ bool DownloadCommand::executeInternal() {
if(bufSizeFinal > 0) {
segment->updateWrittenLength(bufSizeFinal);
}
-
- peerStat->updateDownloadLength(bufSize);
-
- _requestGroup->getSegmentMan()->updateDownloadSpeedFor(peerStat);
-
+ _peerStat->updateDownloadLength(bufSize);
+ getSegmentMan()->updateDownloadSpeedFor(_peerStat);
bool segmentPartComplete = false;
// Note that GrowSegment::complete() always returns false.
if(_transferEncodingDecoder.isNull() && _contentEncodingDecoder.isNull()) {
if(segment->complete() ||
- segment->getPositionToWrite() == _fileEntry->getLastOffset()) {
+ segment->getPositionToWrite() == getFileEntry()->getLastOffset()) {
segmentPartComplete = true;
} else if(segment->getLength() == 0 && bufSize == 0 &&
- !socket->wantRead() && !socket->wantWrite()) {
+ !getSocket()->wantRead() && !getSocket()->wantWrite()) {
segmentPartComplete = true;
}
} else if(!_transferEncodingDecoder.isNull() &&
(segment->complete() ||
- segment->getPositionToWrite() == _fileEntry->getLastOffset())) {
+ segment->getPositionToWrite() == getFileEntry()->getLastOffset())){
// In this case, transferEncodingDecoder is used and
// Content-Length is known.
segmentPartComplete = true;
@@ -202,7 +201,7 @@ bool DownloadCommand::executeInternal() {
}
if(!segmentPartComplete && bufSize == 0 &&
- !socket->wantRead() && !socket->wantWrite()) {
+ !getSocket()->wantRead() && !getSocket()->wantWrite()) {
throw DL_RETRY_EX(EX_GOT_EOF);
}
@@ -219,8 +218,7 @@ bool DownloadCommand::executeInternal() {
{
const std::string& expectedPieceHash =
- _requestGroup->getDownloadContext()->getPieceHash
- (segment->getIndex());
+ getDownloadContext()->getPieceHash(segment->getIndex());
if(_pieceHashValidationEnabled && !expectedPieceHash.empty()) {
if(segment->isHashCalculated()) {
if(getLogger()->debug()) {
@@ -236,31 +234,31 @@ bool DownloadCommand::executeInternal() {
(segment, expectedPieceHash,
MessageDigestHelper::digest
(_messageDigestContext.get(),
- _requestGroup->getPieceStorage()->getDiskAdaptor(),
+ getPieceStorage()->getDiskAdaptor(),
segment->getPosition(),
segment->getLength()));
}
} else {
- _requestGroup->getSegmentMan()->completeSegment(getCuid(), segment);
+ getSegmentMan()->completeSegment(getCuid(), segment);
}
}
#else // !ENABLE_MESSAGE_DIGEST
- _requestGroup->getSegmentMan()->completeSegment(getCuid(), segment);
+ getSegmentMan()->completeSegment(getCuid(), segment);
#endif // !ENABLE_MESSAGE_DIGEST
} else {
// If segment is not canceled here, in the next pipelining
// request, aria2 requests bad range
// [FileEntry->getLastOffset(), FileEntry->getLastOffset())
- _requestGroup->getSegmentMan()->cancelSegment(getCuid(), segment);
+ getSegmentMan()->cancelSegment(getCuid(), segment);
}
checkLowestDownloadSpeed();
// this unit is going to download another segment.
return prepareForNextSegment();
} else {
checkLowestDownloadSpeed();
- setWriteCheckSocketIf(socket, socket->wantWrite());
- e->addCommand(this);
+ setWriteCheckSocketIf(getSocket(), getSocket()->wantWrite());
+ getDownloadEngine()->addCommand(this);
return false;
}
}
@@ -268,67 +266,62 @@ bool DownloadCommand::executeInternal() {
void DownloadCommand::checkLowestDownloadSpeed() const
{
// calculate downloading speed
- if(peerStat->getDownloadStartTime().difference(global::wallclock) >=
- startupIdleTime) {
- unsigned int nowSpeed = peerStat->calculateDownloadSpeed();
- if(lowestDownloadSpeedLimit > 0 && nowSpeed <= lowestDownloadSpeedLimit) {
+ if(_peerStat->getDownloadStartTime().difference(global::wallclock) >=
+ _startupIdleTime) {
+ unsigned int nowSpeed = _peerStat->calculateDownloadSpeed();
+ if(_lowestDownloadSpeedLimit > 0 && nowSpeed <= _lowestDownloadSpeedLimit) {
throw DL_ABORT_EX2(StringFormat(EX_TOO_SLOW_DOWNLOAD_SPEED,
nowSpeed,
- lowestDownloadSpeedLimit,
- req->getHost().c_str()).str(),
+ _lowestDownloadSpeedLimit,
+ getRequest()->getHost().c_str()).str(),
downloadresultcode::TOO_SLOW_DOWNLOAD_SPEED);
}
}
}
bool DownloadCommand::prepareForNextSegment() {
- if(_requestGroup->downloadFinished()) {
- const SharedHandle<DownloadContext>& dctx =
- _requestGroup->getDownloadContext();
+ if(getRequestGroup()->downloadFinished()) {
// Remove in-flight request here.
- _fileEntry->poolRequest(req);
+ getFileEntry()->poolRequest(getRequest());
// If this is a single file download, and file size becomes known
// just after downloading, set total length to FileEntry object
// here.
- if(dctx->getFileEntries().size() == 1) {
- const SharedHandle<FileEntry>& fileEntry = dctx->getFirstFileEntry();
- if(fileEntry->getLength() == 0) {
- fileEntry->setLength
- (_requestGroup->getPieceStorage()->getCompletedLength());
+ if(getDownloadContext()->getFileEntries().size() == 1) {
+ if(getFileEntry()->getLength() == 0) {
+ getFileEntry()->setLength(getPieceStorage()->getCompletedLength());
}
}
#ifdef ENABLE_MESSAGE_DIGEST
- if(dctx->getPieceHashAlgo().empty()) {
+ if(getDownloadContext()->getPieceHashAlgo().empty()) {
SharedHandle<CheckIntegrityEntry> entry
- (new ChecksumCheckIntegrityEntry(_requestGroup));
+ (new ChecksumCheckIntegrityEntry(getRequestGroup()));
if(entry->isValidationReady()) {
entry->initValidator();
// TODO do we need cuttrailinggarbage here?
- e->getCheckIntegrityMan()->pushEntry(entry);
+ getDownloadEngine()->getCheckIntegrityMan()->pushEntry(entry);
}
}
// Following 2lines are needed for DownloadEngine to detect
// completed RequestGroups without 1sec delay.
- e->setNoWait(true);
- e->setRefreshInterval(0);
+ getDownloadEngine()->setNoWait(true);
+ getDownloadEngine()->setRefreshInterval(0);
#endif // ENABLE_MESSAGE_DIGEST
return true;
} else {
// The number of segments should be 1 in order to pass through the next
// segment.
- if(_segments.size() == 1) {
- SharedHandle<Segment> tempSegment = _segments.front();
+ if(getSegments().size() == 1) {
+ SharedHandle<Segment> tempSegment = getSegments().front();
if(!tempSegment->complete()) {
return prepareForRetry(0);
}
- SharedHandle<SegmentMan> segmentMan = _requestGroup->getSegmentMan();
SharedHandle<Segment> nextSegment =
- segmentMan->getCleanSegmentIfOwnerIsIdle
+ getSegmentMan()->getCleanSegmentIfOwnerIsIdle
(getCuid(), tempSegment->getIndex()+1);
if(nextSegment.isNull()) {
return prepareForRetry(0);
} else {
- e->addCommand(this);
+ getDownloadEngine()->addCommand(this);
return false;
}
} else {
@@ -345,7 +338,7 @@ void DownloadCommand::validatePieceHash(const SharedHandle<Segment>& segment,
{
if(actualPieceHash == expectedPieceHash) {
getLogger()->info(MSG_GOOD_CHUNK_CHECKSUM, actualPieceHash.c_str());
- _requestGroup->getSegmentMan()->completeSegment(getCuid(), segment);
+ getSegmentMan()->completeSegment(getCuid(), segment);
} else {
getLogger()->info(EX_INVALID_CHUNK_CHECKSUM,
segment->getIndex(),
@@ -353,7 +346,7 @@ void DownloadCommand::validatePieceHash(const SharedHandle<Segment>& segment,
expectedPieceHash.c_str(),
actualPieceHash.c_str());
segment->clear();
- _requestGroup->getSegmentMan()->cancelSegment(getCuid());
+ getSegmentMan()->cancelSegment(getCuid());
throw DL_RETRY_EX
(StringFormat("Invalid checksum index=%d", segment->getIndex()).str());
}
diff --git a/src/DownloadCommand.h b/src/DownloadCommand.h
index af63c093..1abe4b58 100644
--- a/src/DownloadCommand.h
+++ b/src/DownloadCommand.h
@@ -49,9 +49,9 @@ class DownloadCommand : public AbstractCommand {
private:
unsigned char* _buf;
- time_t startupIdleTime;
- unsigned int lowestDownloadSpeedLimit;
- SharedHandle<PeerStat> peerStat;
+ time_t _startupIdleTime;
+ unsigned int _lowestDownloadSpeedLimit;
+ SharedHandle<PeerStat> _peerStat;
#ifdef ENABLE_MESSAGE_DIGEST
@@ -66,15 +66,14 @@ private:
const std::string& actualPieceHash);
void checkLowestDownloadSpeed() const;
-protected:
+
SharedHandle<Decoder> _transferEncodingDecoder;
SharedHandle<Decoder> _contentEncodingDecoder;
-
+protected:
virtual bool executeInternal();
virtual bool prepareForNextSegment();
-
public:
DownloadCommand(cuid_t cuid,
const SharedHandle<Request>& req,
@@ -84,16 +83,28 @@ public:
const SharedHandle<SocketCore>& s);
virtual ~DownloadCommand();
+ const SharedHandle<Decoder>& getTransferEncodingDecoder() const
+ {
+ return _transferEncodingDecoder;
+ }
+
void setTransferEncodingDecoder(const SharedHandle<Decoder>& decoder);
+ const SharedHandle<Decoder>& getContentEncodingDecoder() const
+ {
+ return _contentEncodingDecoder;
+ }
+
void setContentEncodingDecoder(const SharedHandle<Decoder>& decoder);
- void setStartupIdleTime(time_t startupIdleTime) {
- this->startupIdleTime = startupIdleTime;
+ void setStartupIdleTime(time_t startupIdleTime)
+ {
+ _startupIdleTime = startupIdleTime;
}
- void setLowestDownloadSpeedLimit(unsigned int lowestDownloadSpeedLimit) {
- this->lowestDownloadSpeedLimit = lowestDownloadSpeedLimit;
+ void setLowestDownloadSpeedLimit(unsigned int lowestDownloadSpeedLimit)
+ {
+ _lowestDownloadSpeedLimit = lowestDownloadSpeedLimit;
}
};
diff --git a/src/FtpDownloadCommand.cc b/src/FtpDownloadCommand.cc
index cb735f3a..02023277 100644
--- a/src/FtpDownloadCommand.cc
+++ b/src/FtpDownloadCommand.cc
@@ -62,7 +62,7 @@ FtpDownloadCommand::FtpDownloadCommand
const SocketHandle& ctrlSocket)
:DownloadCommand(cuid, req, fileEntry, requestGroup, e, dataSocket),
_ftpConnection(ftpConnection),
- ctrlSocket(ctrlSocket) {}
+ _ctrlSocket(ctrlSocket) {}
FtpDownloadCommand::~FtpDownloadCommand() {}
@@ -71,14 +71,14 @@ bool FtpDownloadCommand::prepareForNextSegment()
{
if(getOption()->getAsBool(PREF_FTP_REUSE_CONNECTION) &&
static_cast<uint64_t>
- (_fileEntry->gtoloff(_segments.front()->getPositionToWrite())) ==
- _fileEntry->getLength()) {
+ (getFileEntry()->gtoloff(getSegments().front()->getPositionToWrite())) ==
+ getFileEntry()->getLength()) {
Command* command = new FtpFinishDownloadCommand
- (getCuid(), req, _fileEntry, _requestGroup, _ftpConnection, e,
- ctrlSocket);
- e->addCommand(command);
+ (getCuid(), getRequest(), getFileEntry(), getRequestGroup(),
+ _ftpConnection, getDownloadEngine(), _ctrlSocket);
+ getDownloadEngine()->addCommand(command);
- if(_requestGroup->downloadFinished()) {
+ if(getRequestGroup()->downloadFinished()) {
// To run checksum checking, we had to call following function here.
DownloadCommand::prepareForNextSegment();
}
diff --git a/src/FtpDownloadCommand.h b/src/FtpDownloadCommand.h
index 194b0345..bd5b4d0a 100644
--- a/src/FtpDownloadCommand.h
+++ b/src/FtpDownloadCommand.h
@@ -45,7 +45,7 @@ class FtpDownloadCommand : public DownloadCommand {
private:
SharedHandle<FtpConnection> _ftpConnection;
- SharedHandle<SocketCore> ctrlSocket;
+ SharedHandle<SocketCore> _ctrlSocket;
protected:
virtual bool prepareForNextSegment();
public:
diff --git a/src/FtpFinishDownloadCommand.cc b/src/FtpFinishDownloadCommand.cc
index e143743a..f3090eec 100644
--- a/src/FtpFinishDownloadCommand.cc
+++ b/src/FtpFinishDownloadCommand.cc
@@ -71,13 +71,13 @@ FtpFinishDownloadCommand::FtpFinishDownloadCommand
// AbstractCommand::_segments is empty.
bool FtpFinishDownloadCommand::execute()
{
- if(_requestGroup->isHaltRequested()) {
+ if(getRequestGroup()->isHaltRequested()) {
return true;
}
try {
unsigned int status = _ftpConnection->receiveResponse();
if(status == 0) {
- e->addCommand(this);
+ getDownloadEngine()->addCommand(this);
return false;
}
if(status != 226) {
@@ -86,13 +86,14 @@ bool FtpFinishDownloadCommand::execute()
if(getOption()->getAsBool(PREF_FTP_REUSE_CONNECTION)) {
std::map<std::string, std::string> options;
options["baseWorkingDir"] = _ftpConnection->getBaseWorkingDir();
- e->poolSocket(req, _ftpConnection->getUser(), createProxyRequest(),
- socket, options);
+ getDownloadEngine()->poolSocket
+ (getRequest(), _ftpConnection->getUser(), createProxyRequest(),
+ getSocket(), options);
}
} catch(RecoverableException& e) {
getLogger()->info(EX_EXCEPTION_CAUGHT, e);
}
- if(_requestGroup->downloadFinished()) {
+ if(getRequestGroup()->downloadFinished()) {
return true;
} else {
return prepareForRetry(0);
diff --git a/src/FtpInitiateConnectionCommand.cc b/src/FtpInitiateConnectionCommand.cc
index 3fd52954..bbd6503d 100644
--- a/src/FtpInitiateConnectionCommand.cc
+++ b/src/FtpInitiateConnectionCommand.cc
@@ -80,16 +80,16 @@ Command* FtpInitiateConnectionCommand::createNextCommand
if(!proxyRequest.isNull()) {
std::map<std::string, std::string> options;
SharedHandle<SocketCore> pooledSocket;
- std::string proxyMethod = resolveProxyMethod(req->getProtocol());
+ std::string proxyMethod = resolveProxyMethod(getRequest()->getProtocol());
if(proxyMethod == V_GET) {
- pooledSocket = e->popPooledSocket
- (req->getHost(), req->getPort(),
+ pooledSocket = getDownloadEngine()->popPooledSocket
+ (getRequest()->getHost(), getRequest()->getPort(),
proxyRequest->getHost(), proxyRequest->getPort());
} else {
- pooledSocket = e->popPooledSocket
- (options, req->getHost(), req->getPort(),
- e->getAuthConfigFactory()->createAuthConfig
- (req, getOption().get())->getUser(),
+ pooledSocket = getDownloadEngine()->popPooledSocket
+ (options, getRequest()->getHost(), getRequest()->getPort(),
+ getDownloadEngine()->getAuthConfigFactory()->createAuthConfig
+ (getRequest(), getOption().get())->getUser(),
proxyRequest->getHost(), proxyRequest->getPort());
}
if(pooledSocket.isNull()) {
@@ -97,26 +97,27 @@ Command* FtpInitiateConnectionCommand::createNextCommand
getLogger()->info(MSG_CONNECTING_TO_SERVER,
util::itos(getCuid()).c_str(), addr.c_str(), port);
}
- socket.reset(new SocketCore());
- socket->establishConnection(addr, port);
+ createSocket();
+ getSocket()->establishConnection(addr, port);
if(proxyMethod == V_GET) {
// Use GET for FTP via HTTP proxy.
- req->setMethod(Request::METHOD_GET);
+ getRequest()->setMethod(Request::METHOD_GET);
SharedHandle<HttpConnection> hc
- (new HttpConnection(getCuid(), socket, getOption().get()));
+ (new HttpConnection(getCuid(), getSocket(), getOption().get()));
HttpRequestCommand* c =
- new HttpRequestCommand(getCuid(), req, _fileEntry,
- _requestGroup, hc, e, socket);
+ new HttpRequestCommand(getCuid(), getRequest(), getFileEntry(),
+ getRequestGroup(), hc, getDownloadEngine(),
+ getSocket());
c->setConnectedAddr(hostname, addr, port);
c->setProxyRequest(proxyRequest);
command = c;
} else if(proxyMethod == V_TUNNEL) {
FtpTunnelRequestCommand* c =
- new FtpTunnelRequestCommand(getCuid(), req, _fileEntry,
- _requestGroup, e,
- proxyRequest, socket);
+ new FtpTunnelRequestCommand(getCuid(), getRequest(), getFileEntry(),
+ getRequestGroup(), getDownloadEngine(),
+ proxyRequest, getSocket());
c->setConnectedAddr(hostname, addr, port);
command = c;
} else {
@@ -126,19 +127,21 @@ Command* FtpInitiateConnectionCommand::createNextCommand
} else {
if(proxyMethod == V_TUNNEL) {
command =
- new FtpNegotiationCommand(getCuid(), req, _fileEntry,
- _requestGroup, e, pooledSocket,
+ new FtpNegotiationCommand(getCuid(), getRequest(), getFileEntry(),
+ getRequestGroup(), getDownloadEngine(),
+ pooledSocket,
FtpNegotiationCommand::SEQ_SEND_CWD,
options["baseWorkingDir"]);
} else if(proxyMethod == V_GET) {
// Use GET for FTP via HTTP proxy.
- req->setMethod(Request::METHOD_GET);
+ getRequest()->setMethod(Request::METHOD_GET);
SharedHandle<HttpConnection> hc
(new HttpConnection(getCuid(), pooledSocket, getOption().get()));
HttpRequestCommand* c =
- new HttpRequestCommand(getCuid(), req, _fileEntry,
- _requestGroup, hc, e, pooledSocket);
+ new HttpRequestCommand(getCuid(), getRequest(), getFileEntry(),
+ getRequestGroup(), hc, getDownloadEngine(),
+ pooledSocket);
c->setProxyRequest(proxyRequest);
command = c;
} else {
@@ -149,25 +152,29 @@ Command* FtpInitiateConnectionCommand::createNextCommand
} else {
std::map<std::string, std::string> options;
SharedHandle<SocketCore> pooledSocket =
- e->popPooledSocket(options, resolvedAddresses, req->getPort(),
- e->getAuthConfigFactory()->createAuthConfig
- (req, getOption().get())->getUser());
+ getDownloadEngine()->popPooledSocket
+ (options, resolvedAddresses,
+ getRequest()->getPort(),
+ getDownloadEngine()->getAuthConfigFactory()->createAuthConfig
+ (getRequest(), getOption().get())->getUser());
if(pooledSocket.isNull()) {
if(getLogger()->info()) {
getLogger()->info(MSG_CONNECTING_TO_SERVER,
util::itos(getCuid()).c_str(), addr.c_str(), port);
}
- socket.reset(new SocketCore());
- socket->establishConnection(addr, port);
+ createSocket();
+ getSocket()->establishConnection(addr, port);
FtpNegotiationCommand* c =
- new FtpNegotiationCommand(getCuid(), req, _fileEntry,
- _requestGroup, e, socket);
+ new FtpNegotiationCommand(getCuid(), getRequest(), getFileEntry(),
+ getRequestGroup(), getDownloadEngine(),
+ getSocket());
c->setConnectedAddr(hostname, addr, port);
command = c;
} else {
command =
- new FtpNegotiationCommand(getCuid(), req, _fileEntry,
- _requestGroup, e, pooledSocket,
+ new FtpNegotiationCommand(getCuid(), getRequest(), getFileEntry(),
+ getRequestGroup(), getDownloadEngine(),
+ pooledSocket,
FtpNegotiationCommand::SEQ_SEND_CWD,
options["baseWorkingDir"]);
}
diff --git a/src/FtpNegotiationCommand.cc b/src/FtpNegotiationCommand.cc
index 303de573..aecd0e1e 100644
--- a/src/FtpNegotiationCommand.cc
+++ b/src/FtpNegotiationCommand.cc
@@ -83,104 +83,105 @@ FtpNegotiationCommand::FtpNegotiationCommand
const SharedHandle<FileEntry>& fileEntry,
RequestGroup* requestGroup,
DownloadEngine* e,
- const SocketHandle& s,
+ const SocketHandle& socket,
Seq seq,
const std::string& baseWorkingDir):
- AbstractCommand(cuid, req, fileEntry, requestGroup, e, s), sequence(seq),
- ftp(new FtpConnection(cuid, socket, req,
+ AbstractCommand(cuid, req, fileEntry, requestGroup, e, socket), _sequence(seq),
+ _ftp(new FtpConnection(cuid, socket, req,
e->getAuthConfigFactory()->createAuthConfig
(req, requestGroup->getOption().get()),
getOption().get()))
{
- ftp->setBaseWorkingDir(baseWorkingDir);
+ _ftp->setBaseWorkingDir(baseWorkingDir);
if(seq == SEQ_RECV_GREETING) {
setTimeout(getOption()->getAsInt(PREF_CONNECT_TIMEOUT));
}
disableReadCheckSocket();
- setWriteCheckSocket(socket);
+ setWriteCheckSocket(getSocket());
}
FtpNegotiationCommand::~FtpNegotiationCommand() {}
bool FtpNegotiationCommand::executeInternal() {
- while(processSequence(_segments.front()));
- if(sequence == SEQ_RETRY) {
+ while(processSequence(getSegments().front()));
+ if(_sequence == SEQ_RETRY) {
return prepareForRetry(0);
- } else if(sequence == SEQ_NEGOTIATION_COMPLETED) {
+ } else if(_sequence == SEQ_NEGOTIATION_COMPLETED) {
FtpDownloadCommand* command =
new FtpDownloadCommand
- (getCuid(), req, _fileEntry, _requestGroup, ftp, e, dataSocket, socket);
+ (getCuid(), getRequest(), getFileEntry(), getRequestGroup(), _ftp,
+ getDownloadEngine(), _dataSocket, getSocket());
command->setStartupIdleTime(getOption()->getAsInt(PREF_STARTUP_IDLE_TIME));
command->setLowestDownloadSpeedLimit
(getOption()->getAsInt(PREF_LOWEST_SPEED_LIMIT));
- if(!_fileEntry->isSingleHostMultiConnectionEnabled()) {
- _fileEntry->removeURIWhoseHostnameIs(req->getHost());
+ if(!getFileEntry()->isSingleHostMultiConnectionEnabled()) {
+ getFileEntry()->removeURIWhoseHostnameIs(getRequest()->getHost());
}
- _requestGroup->getURISelector()->tuneDownloadCommand
- (_fileEntry->getRemainingUris(), command);
- e->addCommand(command);
+ getRequestGroup()->getURISelector()->tuneDownloadCommand
+ (getFileEntry()->getRemainingUris(), command);
+ getDownloadEngine()->addCommand(command);
return true;
- } else if(sequence == SEQ_HEAD_OK ||
- sequence == SEQ_DOWNLOAD_ALREADY_COMPLETED) {
+ } else if(_sequence == SEQ_HEAD_OK ||
+ _sequence == SEQ_DOWNLOAD_ALREADY_COMPLETED) {
return true;
- } else if(sequence == SEQ_FILE_PREPARATION) {
+ } else if(_sequence == SEQ_FILE_PREPARATION) {
if(getOption()->getAsBool(PREF_FTP_PASV)) {
- sequence = SEQ_SEND_PASV;
+ _sequence = SEQ_SEND_PASV;
} else {
- sequence = SEQ_PREPARE_SERVER_SOCKET;
+ _sequence = SEQ_PREPARE_SERVER_SOCKET;
}
return false;
- } else if(sequence == SEQ_EXIT) {
+ } else if(_sequence == SEQ_EXIT) {
return true;
} else {
- e->addCommand(this);
+ getDownloadEngine()->addCommand(this);
return false;
}
}
bool FtpNegotiationCommand::recvGreeting() {
if(!checkIfConnectionEstablished
- (socket, _connectedHostname, _connectedAddr, _connectedPort)) {
- sequence = SEQ_EXIT;
+ (getSocket(), _connectedHostname, _connectedAddr, _connectedPort)) {
+ _sequence = SEQ_EXIT;
return false;
}
- setTimeout(_requestGroup->getTimeout());
+ setTimeout(getRequestGroup()->getTimeout());
//socket->setBlockingMode();
disableWriteCheckSocket();
- setReadCheckSocket(socket);
+ setReadCheckSocket(getSocket());
- unsigned int status = ftp->receiveResponse();
+ unsigned int status = _ftp->receiveResponse();
if(status == 0) {
return false;
}
if(status != 220) {
throw DL_ABORT_EX(EX_CONNECTION_FAILED);
}
- sequence = SEQ_SEND_USER;
+ _sequence = SEQ_SEND_USER;
return true;
}
bool FtpNegotiationCommand::sendUser() {
- if(ftp->sendUser()) {
+ if(_ftp->sendUser()) {
disableWriteCheckSocket();
- sequence = SEQ_RECV_USER;
+ _sequence = SEQ_RECV_USER;
} else {
- setWriteCheckSocket(socket);
+ setWriteCheckSocket(getSocket());
}
return false;
}
bool FtpNegotiationCommand::recvUser() {
- unsigned int status = ftp->receiveResponse();
+ unsigned int status = _ftp->receiveResponse();
switch(status) {
case 0:
return false;
case 230:
- sequence = SEQ_SEND_TYPE;
+ _sequence = SEQ_SEND_TYPE;
break;
case 331:
- sequence = SEQ_SEND_PASS;
+ _sequence = SEQ_SEND_PASS;
break;
default:
throw DL_ABORT_EX(StringFormat(EX_BAD_STATUS, status).str());
@@ -189,56 +190,56 @@ bool FtpNegotiationCommand::recvUser() {
}
bool FtpNegotiationCommand::sendPass() {
- if(ftp->sendPass()) {
+ if(_ftp->sendPass()) {
disableWriteCheckSocket();
- sequence = SEQ_RECV_PASS;
+ _sequence = SEQ_RECV_PASS;
} else {
- setWriteCheckSocket(socket);
+ setWriteCheckSocket(getSocket());
}
return false;
}
bool FtpNegotiationCommand::recvPass() {
- unsigned int status = ftp->receiveResponse();
+ unsigned int status = _ftp->receiveResponse();
if(status == 0) {
return false;
}
if(status != 230) {
throw DL_ABORT_EX(StringFormat(EX_BAD_STATUS, status).str());
}
- sequence = SEQ_SEND_TYPE;
+ _sequence = SEQ_SEND_TYPE;
return true;
}
bool FtpNegotiationCommand::sendType() {
- if(ftp->sendType()) {
+ if(_ftp->sendType()) {
disableWriteCheckSocket();
- sequence = SEQ_RECV_TYPE;
+ _sequence = SEQ_RECV_TYPE;
} else {
- setWriteCheckSocket(socket);
+ setWriteCheckSocket(getSocket());
}
return false;
}
bool FtpNegotiationCommand::recvType() {
- unsigned int status = ftp->receiveResponse();
+ unsigned int status = _ftp->receiveResponse();
if(status == 0) {
return false;
}
if(status != 200) {
throw DL_ABORT_EX(StringFormat(EX_BAD_STATUS, status).str());
}
- sequence = SEQ_SEND_PWD;
+ _sequence = SEQ_SEND_PWD;
return true;
}
bool FtpNegotiationCommand::sendPwd()
{
- if(ftp->sendPwd()) {
+ if(_ftp->sendPwd()) {
disableWriteCheckSocket();
- sequence = SEQ_RECV_PWD;
+ _sequence = SEQ_RECV_PWD;
} else {
- setWriteCheckSocket(socket);
+ setWriteCheckSocket(getSocket());
}
return false;
}
@@ -246,42 +247,42 @@ bool FtpNegotiationCommand::sendPwd()
bool FtpNegotiationCommand::recvPwd()
{
std::string pwd;
- unsigned int status = ftp->receivePwdResponse(pwd);
+ unsigned int status = _ftp->receivePwdResponse(pwd);
if(status == 0) {
return false;
}
if(status != 257) {
throw DL_ABORT_EX(StringFormat(EX_BAD_STATUS, status).str());
}
- ftp->setBaseWorkingDir(pwd);
+ _ftp->setBaseWorkingDir(pwd);
if(getLogger()->info()) {
getLogger()->info("CUID#%s - base working directory is '%s'",
util::itos(getCuid()).c_str(), pwd.c_str());
}
- sequence = SEQ_SEND_CWD;
+ _sequence = SEQ_SEND_CWD;
return true;
}
bool FtpNegotiationCommand::sendCwd() {
// Calling setReadCheckSocket() is needed when the socket is reused,
- setReadCheckSocket(socket);
- if(ftp->sendCwd()) {
+ setReadCheckSocket(getSocket());
+ if(_ftp->sendCwd()) {
disableWriteCheckSocket();
- sequence = SEQ_RECV_CWD;
+ _sequence = SEQ_RECV_CWD;
} else {
- setWriteCheckSocket(socket);
+ setWriteCheckSocket(getSocket());
}
return false;
}
bool FtpNegotiationCommand::recvCwd() {
- unsigned int status = ftp->receiveResponse();
+ unsigned int status = _ftp->receiveResponse();
if(status == 0) {
return false;
}
if(status != 250) {
poolConnection();
- _requestGroup->increaseAndValidateFileNotFoundCount();
+ getRequestGroup()->increaseAndValidateFileNotFoundCount();
if (status == 550)
throw DL_ABORT_EX2(MSG_RESOURCE_NOT_FOUND,
downloadresultcode::RESOURCE_NOT_FOUND);
@@ -289,20 +290,20 @@ bool FtpNegotiationCommand::recvCwd() {
throw DL_ABORT_EX(StringFormat(EX_BAD_STATUS, status).str());
}
if(getOption()->getAsBool(PREF_REMOTE_TIME)) {
- sequence = SEQ_SEND_MDTM;
+ _sequence = SEQ_SEND_MDTM;
} else {
- sequence = SEQ_SEND_SIZE;
+ _sequence = SEQ_SEND_SIZE;
}
return true;
}
bool FtpNegotiationCommand::sendMdtm()
{
- if(ftp->sendMdtm()) {
+ if(_ftp->sendMdtm()) {
disableWriteCheckSocket();
- sequence = SEQ_RECV_MDTM;
+ _sequence = SEQ_RECV_MDTM;
} else {
- setWriteCheckSocket(socket);
+ setWriteCheckSocket(getSocket());
}
return false;
}
@@ -310,13 +311,13 @@ bool FtpNegotiationCommand::sendMdtm()
bool FtpNegotiationCommand::recvMdtm()
{
Time lastModifiedTime = Time::null();
- unsigned int status = ftp->receiveMdtmResponse(lastModifiedTime);
+ unsigned int status = _ftp->receiveMdtmResponse(lastModifiedTime);
if(status == 0) {
return false;
}
if(status == 213) {
if(lastModifiedTime.good()) {
- _requestGroup->updateLastModifiedTime(lastModifiedTime);
+ getRequestGroup()->updateLastModifiedTime(lastModifiedTime);
time_t t = lastModifiedTime.getTime();
struct tm* tms = gmtime(&t); // returned struct is statically allocated.
if(tms) {
@@ -340,84 +341,87 @@ bool FtpNegotiationCommand::recvMdtm()
util::itos(getCuid()).c_str());
}
}
- sequence = SEQ_SEND_SIZE;
+ _sequence = SEQ_SEND_SIZE;
return true;
}
bool FtpNegotiationCommand::sendSize() {
- if(ftp->sendSize()) {
+ if(_ftp->sendSize()) {
disableWriteCheckSocket();
- sequence = SEQ_RECV_SIZE;
+ _sequence = SEQ_RECV_SIZE;
} else {
- setWriteCheckSocket(socket);
+ setWriteCheckSocket(getSocket());
}
return false;
}
bool FtpNegotiationCommand::onFileSizeDetermined(uint64_t totalLength)
{
- _fileEntry->setLength(totalLength);
- if(_fileEntry->getPath().empty()) {
- _fileEntry->setPath
+ getFileEntry()->setLength(totalLength);
+ if(getFileEntry()->getPath().empty()) {
+ getFileEntry()->setPath
(util::applyDir
(getDownloadContext()->getDir(),
- util::fixTaintedBasename(util::percentDecode(req->getFile()))));
+ util::fixTaintedBasename
+ (util::percentDecode(getRequest()->getFile()))));
}
- _requestGroup->preDownloadProcessing();
- if(e->getRequestGroupMan()->isSameFileBeingDownloaded(_requestGroup)) {
+ getRequestGroup()->preDownloadProcessing();
+ if(getDownloadEngine()->getRequestGroupMan()->
+ isSameFileBeingDownloaded(getRequestGroup())) {
throw DOWNLOAD_FAILURE_EXCEPTION
(StringFormat(EX_DUPLICATE_FILE_DOWNLOAD,
- _requestGroup->getFirstFilePath().c_str()).str());
+ getRequestGroup()->getFirstFilePath().c_str()).str());
}
if(totalLength == 0) {
if(getOption()->getAsBool(PREF_FTP_PASV)) {
- sequence = SEQ_SEND_PASV;
+ _sequence = SEQ_SEND_PASV;
} else {
- sequence = SEQ_PREPARE_SERVER_SOCKET;
+ _sequence = SEQ_PREPARE_SERVER_SOCKET;
}
if(getOption()->getAsBool(PREF_DRY_RUN)) {
- _requestGroup->initPieceStorage();
+ getRequestGroup()->initPieceStorage();
onDryRunFileFound();
return false;
}
- if(_requestGroup->downloadFinishedByFileLength()) {
- _requestGroup->initPieceStorage();
- _requestGroup->getPieceStorage()->markAllPiecesDone();
- sequence = SEQ_DOWNLOAD_ALREADY_COMPLETED;
+ if(getRequestGroup()->downloadFinishedByFileLength()) {
+ getRequestGroup()->initPieceStorage();
+ getPieceStorage()->markAllPiecesDone();
+ _sequence = SEQ_DOWNLOAD_ALREADY_COMPLETED;
getLogger()->notice(MSG_DOWNLOAD_ALREADY_COMPLETED,
- util::itos(_requestGroup->getGID()).c_str(),
- _requestGroup->getFirstFilePath().c_str());
+ util::itos(getRequestGroup()->getGID()).c_str(),
+ getRequestGroup()->getFirstFilePath().c_str());
poolConnection();
return false;
}
- _requestGroup->shouldCancelDownloadForSafety();
- _requestGroup->initPieceStorage();
- _requestGroup->getPieceStorage()->getDiskAdaptor()->initAndOpenFile();
+ getRequestGroup()->shouldCancelDownloadForSafety();
+ getRequestGroup()->initPieceStorage();
+ getPieceStorage()->getDiskAdaptor()->initAndOpenFile();
if(getDownloadContext()->knowsTotalLength()) {
- sequence = SEQ_DOWNLOAD_ALREADY_COMPLETED;
+ _sequence = SEQ_DOWNLOAD_ALREADY_COMPLETED;
poolConnection();
return false;
}
// We have to make sure that command that has Request object must
// have segment after PieceStorage is initialized. See
// AbstractCommand::execute()
- _requestGroup->getSegmentMan()->getSegment(getCuid(), 0);
+ getSegmentMan()->getSegment(getCuid(), 0);
return true;
} else {
- _requestGroup->adjustFilename
- (SharedHandle<BtProgressInfoFile>(new DefaultBtProgressInfoFile
- (_requestGroup->getDownloadContext(),
- SharedHandle<PieceStorage>(),
- getOption().get())));
- _requestGroup->initPieceStorage();
+ getRequestGroup()->adjustFilename
+ (SharedHandle<BtProgressInfoFile>
+ (new DefaultBtProgressInfoFile
+ (getDownloadContext(),
+ SharedHandle<PieceStorage>(),
+ getOption().get())));
+ getRequestGroup()->initPieceStorage();
if(getOption()->getAsBool(PREF_DRY_RUN)) {
onDryRunFileFound();
@@ -425,27 +429,28 @@ bool FtpNegotiationCommand::onFileSizeDetermined(uint64_t totalLength)
}
BtProgressInfoFileHandle infoFile
- (new DefaultBtProgressInfoFile(_requestGroup->getDownloadContext(),
- _requestGroup->getPieceStorage(),
+ (new DefaultBtProgressInfoFile(getDownloadContext(),
+ getPieceStorage(),
getOption().get()));
- if(!infoFile->exists() && _requestGroup->downloadFinishedByFileLength()) {
- _requestGroup->getPieceStorage()->markAllPiecesDone();
+ if(!infoFile->exists() &&
+ getRequestGroup()->downloadFinishedByFileLength()) {
+ getPieceStorage()->markAllPiecesDone();
- sequence = SEQ_DOWNLOAD_ALREADY_COMPLETED;
+ _sequence = SEQ_DOWNLOAD_ALREADY_COMPLETED;
getLogger()->notice(MSG_DOWNLOAD_ALREADY_COMPLETED,
- util::itos(_requestGroup->getGID()).c_str(),
- _requestGroup->getFirstFilePath().c_str());
+ util::itos(getRequestGroup()->getGID()).c_str(),
+ getRequestGroup()->getFirstFilePath().c_str());
poolConnection();
return false;
}
- _requestGroup->loadAndOpenFile(infoFile);
+ getRequestGroup()->loadAndOpenFile(infoFile);
// We have to make sure that command that has Request object must
// have segment after PieceStorage is initialized. See
// AbstractCommand::execute()
- _requestGroup->getSegmentMan()->getSegment(getCuid(), 0);
+ getSegmentMan()->getSegment(getCuid(), 0);
prepareForNextAction(this);
@@ -456,7 +461,7 @@ bool FtpNegotiationCommand::onFileSizeDetermined(uint64_t totalLength)
bool FtpNegotiationCommand::recvSize() {
uint64_t size = 0;
- unsigned int status = ftp->receiveSizeResponse(size);
+ unsigned int status = _ftp->receiveSizeResponse(size);
if(status == 0) {
return false;
}
@@ -467,13 +472,13 @@ bool FtpNegotiationCommand::recvSize() {
(StringFormat(EX_TOO_LARGE_FILE,
util::uitos(size, true).c_str()).str());
}
- if(_requestGroup->getPieceStorage().isNull()) {
+ if(getPieceStorage().isNull()) {
- sequence = SEQ_FILE_PREPARATION;
+ _sequence = SEQ_FILE_PREPARATION;
return onFileSizeDetermined(size);
} else {
- _requestGroup->validateTotalLength(_fileEntry->getLength(), size);
+ getRequestGroup()->validateTotalLength(getFileEntry()->getLength(), size);
}
} else {
@@ -484,7 +489,7 @@ bool FtpNegotiationCommand::recvSize() {
// Even if one of the other servers waiting in the queue supports SIZE
// command, resuming and segmented downloading are disabled when the first
// contacted FTP server doesn't support it.
- if(_requestGroup->getPieceStorage().isNull()) {
+ if(getPieceStorage().isNull()) {
getDownloadContext()->markTotalLengthIsUnknown();
return onFileSizeDetermined(0);
@@ -493,62 +498,62 @@ bool FtpNegotiationCommand::recvSize() {
// wrong file to be downloaded if user-specified URL is wrong.
}
if(getOption()->getAsBool(PREF_FTP_PASV)) {
- sequence = SEQ_SEND_PASV;
+ _sequence = SEQ_SEND_PASV;
} else {
- sequence = SEQ_PREPARE_SERVER_SOCKET;
+ _sequence = SEQ_PREPARE_SERVER_SOCKET;
}
return true;
}
void FtpNegotiationCommand::afterFileAllocation()
{
- setReadCheckSocket(socket);
+ setReadCheckSocket(getSocket());
}
bool FtpNegotiationCommand::prepareServerSocket()
{
- serverSocket = ftp->createServerSocket();
- sequence = SEQ_SEND_PORT;
+ _serverSocket = _ftp->createServerSocket();
+ _sequence = SEQ_SEND_PORT;
return true;
}
bool FtpNegotiationCommand::sendPort() {
afterFileAllocation();
- if(ftp->sendPort(serverSocket)) {
+ if(_ftp->sendPort(_serverSocket)) {
disableWriteCheckSocket();
- sequence = SEQ_RECV_PORT;
+ _sequence = SEQ_RECV_PORT;
} else {
- setWriteCheckSocket(socket);
+ setWriteCheckSocket(getSocket());
}
return false;
}
bool FtpNegotiationCommand::recvPort() {
- unsigned int status = ftp->receiveResponse();
+ unsigned int status = _ftp->receiveResponse();
if(status == 0) {
return false;
}
if(status != 200) {
throw DL_ABORT_EX(StringFormat(EX_BAD_STATUS, status).str());
}
- sequence = SEQ_SEND_REST;
+ _sequence = SEQ_SEND_REST;
return true;
}
bool FtpNegotiationCommand::sendPasv() {
afterFileAllocation();
- if(ftp->sendPasv()) {
+ if(_ftp->sendPasv()) {
disableWriteCheckSocket();
- sequence = SEQ_RECV_PASV;
+ _sequence = SEQ_RECV_PASV;
} else {
- setWriteCheckSocket(socket);
+ setWriteCheckSocket(getSocket());
}
return false;
}
bool FtpNegotiationCommand::recvPasv() {
std::pair<std::string, uint16_t> dest;
- unsigned int status = ftp->receivePasvResponse(dest);
+ unsigned int status = _ftp->receivePasvResponse(dest);
if(status == 0) {
return false;
}
@@ -558,7 +563,7 @@ bool FtpNegotiationCommand::recvPasv() {
// TODO Should we check to see that dest.first is not in noProxy list?
if(isProxyDefined()) {
_dataConnAddr = dest;
- sequence = SEQ_RESOLVE_PROXY;
+ _sequence = SEQ_RESOLVE_PROXY;
return true;
} else {
// make a data connection to the server.
@@ -567,11 +572,11 @@ bool FtpNegotiationCommand::recvPasv() {
dest.first.c_str(),
dest.second);
}
- dataSocket.reset(new SocketCore());
- dataSocket->establishConnection(dest.first, dest.second);
+ _dataSocket.reset(new SocketCore());
+ _dataSocket->establishConnection(dest.first, dest.second);
disableReadCheckSocket();
- setWriteCheckSocket(dataSocket);
- sequence = SEQ_SEND_REST_PASV;
+ setWriteCheckSocket(_dataSocket);
+ _sequence = SEQ_SEND_REST_PASV;
return false;
}
}
@@ -589,27 +594,29 @@ bool FtpNegotiationCommand::resolveProxy()
getLogger()->info(MSG_CONNECTING_TO_SERVER, util::itos(getCuid()).c_str(),
_proxyAddr.c_str(), proxyReq->getPort());
}
- dataSocket.reset(new SocketCore());
- dataSocket->establishConnection(_proxyAddr, proxyReq->getPort());
+ _dataSocket.reset(new SocketCore());
+ _dataSocket->establishConnection(_proxyAddr, proxyReq->getPort());
disableReadCheckSocket();
- setWriteCheckSocket(dataSocket);
- _http.reset(new HttpConnection(getCuid(), dataSocket, getOption().get()));
- sequence = SEQ_SEND_TUNNEL_REQUEST;
+ setWriteCheckSocket(_dataSocket);
+ _http.reset(new HttpConnection(getCuid(), _dataSocket, getOption().get()));
+ _sequence = SEQ_SEND_TUNNEL_REQUEST;
return false;
}
bool FtpNegotiationCommand::sendTunnelRequest()
{
if(_http->sendBufferIsEmpty()) {
- if(dataSocket->isReadable(0)) {
- std::string error = socket->getSocketError();
+ if(_dataSocket->isReadable(0)) {
+ std::string error = getSocket()->getSocketError();
if(!error.empty()) {
SharedHandle<Request> proxyReq = createProxyRequest();
- e->markBadIPAddress(proxyReq->getHost(),_proxyAddr,proxyReq->getPort());
- std::string nextProxyAddr = e->findCachedIPAddress
+ getDownloadEngine()->markBadIPAddress(proxyReq->getHost(),
+ _proxyAddr,proxyReq->getPort());
+ std::string nextProxyAddr = getDownloadEngine()->findCachedIPAddress
(proxyReq->getHost(), proxyReq->getPort());
if(nextProxyAddr.empty()) {
- e->removeCachedIPAddress(proxyReq->getHost(), proxyReq->getPort());
+ getDownloadEngine()->removeCachedIPAddress(proxyReq->getHost(),
+ proxyReq->getPort());
throw DL_RETRY_EX
(StringFormat(MSG_ESTABLISHING_CONNECTION_FAILED,
error.c_str()).str());
@@ -625,7 +632,7 @@ bool FtpNegotiationCommand::sendTunnelRequest()
util::itos(getCuid()).c_str(),
_proxyAddr.c_str(), proxyReq->getPort());
}
- dataSocket->establishConnection(_proxyAddr, proxyReq->getPort());
+ _dataSocket->establishConnection(_proxyAddr, proxyReq->getPort());
return false;
}
}
@@ -644,11 +651,11 @@ bool FtpNegotiationCommand::sendTunnelRequest()
}
if(_http->sendBufferIsEmpty()) {
disableWriteCheckSocket();
- setReadCheckSocket(dataSocket);
- sequence = SEQ_RECV_TUNNEL_RESPONSE;
+ setReadCheckSocket(_dataSocket);
+ _sequence = SEQ_RECV_TUNNEL_RESPONSE;
return false;
} else {
- setWriteCheckSocket(dataSocket);
+ setWriteCheckSocket(_dataSocket);
return false;
}
}
@@ -662,29 +669,29 @@ bool FtpNegotiationCommand::recvTunnelResponse()
if(httpResponse->getResponseStatus() != HttpHeader::S200) {
throw DL_RETRY_EX(EX_PROXY_CONNECTION_FAILED);
}
- sequence = SEQ_SEND_REST_PASV;
+ _sequence = SEQ_SEND_REST_PASV;
return true;
}
bool FtpNegotiationCommand::sendRestPasv(const SharedHandle<Segment>& segment) {
- //dataSocket->setBlockingMode();
- setReadCheckSocket(socket);
+ //_dataSocket->setBlockingMode();
+ setReadCheckSocket(getSocket());
disableWriteCheckSocket();
return sendRest(segment);
}
bool FtpNegotiationCommand::sendRest(const SharedHandle<Segment>& segment) {
- if(ftp->sendRest(segment)) {
+ if(_ftp->sendRest(segment)) {
disableWriteCheckSocket();
- sequence = SEQ_RECV_REST;
+ _sequence = SEQ_RECV_REST;
} else {
- setWriteCheckSocket(socket);
+ setWriteCheckSocket(getSocket());
}
return false;
}
bool FtpNegotiationCommand::recvRest(const SharedHandle<Segment>& segment) {
- unsigned int status = ftp->receiveResponse();
+ unsigned int status = _ftp->receiveResponse();
if(status == 0) {
return false;
}
@@ -696,27 +703,27 @@ bool FtpNegotiationCommand::recvRest(const SharedHandle<Segment>& segment) {
downloadresultcode::CANNOT_RESUME);
}
}
- sequence = SEQ_SEND_RETR;
+ _sequence = SEQ_SEND_RETR;
return true;
}
bool FtpNegotiationCommand::sendRetr() {
- if(ftp->sendRetr()) {
+ if(_ftp->sendRetr()) {
disableWriteCheckSocket();
- sequence = SEQ_RECV_RETR;
+ _sequence = SEQ_RECV_RETR;
} else {
- setWriteCheckSocket(socket);
+ setWriteCheckSocket(getSocket());
}
return false;
}
bool FtpNegotiationCommand::recvRetr() {
- unsigned int status = ftp->receiveResponse();
+ unsigned int status = _ftp->receiveResponse();
if(status == 0) {
return false;
}
if(status != 150 && status != 125) {
- _requestGroup->increaseAndValidateFileNotFoundCount();
+ getRequestGroup()->increaseAndValidateFileNotFoundCount();
if (status == 550)
throw DL_ABORT_EX2(MSG_RESOURCE_NOT_FOUND,
downloadresultcode::RESOURCE_NOT_FOUND);
@@ -724,12 +731,12 @@ bool FtpNegotiationCommand::recvRetr() {
throw DL_ABORT_EX(StringFormat(EX_BAD_STATUS, status).str());
}
if(getOption()->getAsBool(PREF_FTP_PASV)) {
- sequence = SEQ_NEGOTIATION_COMPLETED;
+ _sequence = SEQ_NEGOTIATION_COMPLETED;
return false;
} else {
disableReadCheckSocket();
- setReadCheckSocket(serverSocket);
- sequence = SEQ_WAIT_CONNECTION;
+ setReadCheckSocket(_serverSocket);
+ _sequence = SEQ_WAIT_CONNECTION;
return false;
}
}
@@ -737,17 +744,17 @@ bool FtpNegotiationCommand::recvRetr() {
bool FtpNegotiationCommand::waitConnection()
{
disableReadCheckSocket();
- setReadCheckSocket(socket);
- dataSocket.reset(serverSocket->acceptConnection());
- dataSocket->setNonBlockingMode();
- sequence = SEQ_NEGOTIATION_COMPLETED;
+ setReadCheckSocket(getSocket());
+ _dataSocket.reset(_serverSocket->acceptConnection());
+ _dataSocket->setNonBlockingMode();
+ _sequence = SEQ_NEGOTIATION_COMPLETED;
return false;
}
bool FtpNegotiationCommand::processSequence
(const SharedHandle<Segment>& segment) {
bool doNextSequence = true;
- switch(sequence) {
+ switch(_sequence) {
case SEQ_RECV_GREETING:
return recvGreeting();
case SEQ_SEND_USER:
@@ -816,16 +823,17 @@ void FtpNegotiationCommand::poolConnection() const
{
if(getOption()->getAsBool(PREF_FTP_REUSE_CONNECTION)) {
std::map<std::string, std::string> options;
- options["baseWorkingDir"] = ftp->getBaseWorkingDir();
- e->poolSocket(req, ftp->getUser(), createProxyRequest(), socket, options);
+ options["baseWorkingDir"] = _ftp->getBaseWorkingDir();
+ getDownloadEngine()->poolSocket(getRequest(), _ftp->getUser(),
+ createProxyRequest(), getSocket(), options);
}
}
void FtpNegotiationCommand::onDryRunFileFound()
{
- _requestGroup->getPieceStorage()->markAllPiecesDone();
+ getPieceStorage()->markAllPiecesDone();
poolConnection();
- sequence = SEQ_HEAD_OK;
+ _sequence = SEQ_HEAD_OK;
}
} // namespace aria2
diff --git a/src/FtpNegotiationCommand.h b/src/FtpNegotiationCommand.h
index 7eb94795..3a9520ca 100644
--- a/src/FtpNegotiationCommand.h
+++ b/src/FtpNegotiationCommand.h
@@ -122,10 +122,10 @@ private:
void onDryRunFileFound();
- SharedHandle<SocketCore> dataSocket;
- SharedHandle<SocketCore> serverSocket;
- Seq sequence;
- SharedHandle<FtpConnection> ftp;
+ SharedHandle<SocketCore> _dataSocket;
+ SharedHandle<SocketCore> _serverSocket;
+ Seq _sequence;
+ SharedHandle<FtpConnection> _ftp;
// For tunneling
SharedHandle<HttpConnection> _http;
// IP, Port pair in pasv response
diff --git a/src/FtpTunnelRequestCommand.cc b/src/FtpTunnelRequestCommand.cc
index 2fcfbcd3..c6ff69fe 100644
--- a/src/FtpTunnelRequestCommand.cc
+++ b/src/FtpTunnelRequestCommand.cc
@@ -58,7 +58,8 @@ FtpTunnelRequestCommand::~FtpTunnelRequestCommand() {}
Command* FtpTunnelRequestCommand::getNextCommand()
{
return new FtpTunnelResponseCommand
- (getCuid(), req, _fileEntry, _requestGroup, httpConnection, e, socket);
+ (getCuid(), getRequest(), getFileEntry(), getRequestGroup(),
+ getHttpConnection(), getDownloadEngine(), getSocket());
}
} // namespace aria2
diff --git a/src/FtpTunnelResponseCommand.cc b/src/FtpTunnelResponseCommand.cc
index d1d1afb1..86084fe2 100644
--- a/src/FtpTunnelResponseCommand.cc
+++ b/src/FtpTunnelResponseCommand.cc
@@ -59,8 +59,9 @@ FtpTunnelResponseCommand::~FtpTunnelResponseCommand() {}
Command* FtpTunnelResponseCommand::getNextCommand()
{
- return new FtpNegotiationCommand(getCuid(), req, _fileEntry,
- _requestGroup, e, socket);
+ return new FtpNegotiationCommand(getCuid(), getRequest(), getFileEntry(),
+ getRequestGroup(), getDownloadEngine(),
+ getSocket());
}
} // namespace aria2
diff --git a/src/HttpDownloadCommand.cc b/src/HttpDownloadCommand.cc
index 3121da3f..7ff66769 100644
--- a/src/HttpDownloadCommand.cc
+++ b/src/HttpDownloadCommand.cc
@@ -71,29 +71,29 @@ HttpDownloadCommand::HttpDownloadCommand
HttpDownloadCommand::~HttpDownloadCommand() {}
bool HttpDownloadCommand::prepareForNextSegment() {
- bool downloadFinished = _requestGroup->downloadFinished();
- if(req->isPipeliningEnabled() && !downloadFinished) {
+ bool downloadFinished = getRequestGroup()->downloadFinished();
+ if(getRequest()->isPipeliningEnabled() && !downloadFinished) {
HttpRequestCommand* command =
- new HttpRequestCommand(getCuid(), req, _fileEntry,
- _requestGroup, _httpConnection, e,
- socket);
+ new HttpRequestCommand(getCuid(), getRequest(), getFileEntry(),
+ getRequestGroup(), _httpConnection,
+ getDownloadEngine(), getSocket());
// Set proxy request here. aria2 sends the HTTP request specialized for
// proxy.
- if(resolveProxyMethod(req->getProtocol()) == V_GET) {
+ if(resolveProxyMethod(getRequest()->getProtocol()) == V_GET) {
command->setProxyRequest(createProxyRequest());
}
- e->addCommand(command);
+ getDownloadEngine()->addCommand(command);
return true;
} else {
- if(req->isPipeliningEnabled() ||
- (req->isKeepAliveEnabled() &&
+ if(getRequest()->isPipeliningEnabled() ||
+ (getRequest()->isKeepAliveEnabled() &&
(
- ((!_transferEncodingDecoder.isNull() &&
- _transferEncodingDecoder->finished()) ||
- (!_contentEncodingDecoder.isNull() &&
- _contentEncodingDecoder->finished())) ||
- _fileEntry->getLastOffset() ==
- _segments.front()->getPositionToWrite()
+ ((!getTransferEncodingDecoder().isNull() &&
+ getTransferEncodingDecoder()->finished()) ||
+ (!getContentEncodingDecoder().isNull() &&
+ getContentEncodingDecoder()->finished())) ||
+ getFileEntry()->getLastOffset() ==
+ getSegments().front()->getPositionToWrite()
)
)
) {
@@ -102,20 +102,23 @@ bool HttpDownloadCommand::prepareForNextSegment() {
// pool terminated socket. In HTTP/1.1, keep-alive is default,
// so closing connection without Connection: close header means
// that server is broken or not configured properly.
- e->poolSocket(req, createProxyRequest(), socket);
+ getDownloadEngine()->poolSocket
+ (getRequest(), createProxyRequest(), getSocket());
}
// The request was sent assuming that server supported pipelining, but
// it turned out that server didn't support it.
// We detect this situation by comparing the end byte in range header
// of the response with the end byte of segment.
// If it is the same, HTTP negotiation is necessary for the next request.
- if(!req->isPipeliningEnabled() && req->isPipeliningHint() &&
+ if(!getRequest()->isPipeliningEnabled() &&
+ getRequest()->isPipeliningHint() &&
!downloadFinished) {
- const SharedHandle<Segment>& segment = _segments.front();
+ const SharedHandle<Segment>& segment = getSegments().front();
- off_t lastOffset =_fileEntry->gtoloff
- (std::min(static_cast<off_t>(segment->getPosition()+segment->getLength()),
- _fileEntry->getLastOffset()));
+ off_t lastOffset =getFileEntry()->gtoloff
+ (std::min(static_cast<off_t>
+ (segment->getPosition()+segment->getLength()),
+ getFileEntry()->getLastOffset()));
if(lastOffset ==
_httpResponse->getHttpHeader()->getRange()->getEndByte()+1) {
diff --git a/src/HttpInitiateConnectionCommand.cc b/src/HttpInitiateConnectionCommand.cc
index c940a071..822e6c24 100644
--- a/src/HttpInitiateConnectionCommand.cc
+++ b/src/HttpInitiateConnectionCommand.cc
@@ -73,32 +73,39 @@ Command* HttpInitiateConnectionCommand::createNextCommand
Command* command;
if(!proxyRequest.isNull()) {
SharedHandle<SocketCore> pooledSocket =
- e->popPooledSocket(req->getHost(), req->getPort(),
- proxyRequest->getHost(), proxyRequest->getPort());
- std::string proxyMethod = resolveProxyMethod(req->getProtocol());
+ getDownloadEngine()->popPooledSocket
+ (getRequest()->getHost(), getRequest()->getPort(),
+ proxyRequest->getHost(), proxyRequest->getPort());
+ std::string proxyMethod = resolveProxyMethod(getRequest()->getProtocol());
if(pooledSocket.isNull()) {
if(getLogger()->info()) {
getLogger()->info(MSG_CONNECTING_TO_SERVER,
util::itos(getCuid()).c_str(), addr.c_str(), port);
}
- socket.reset(new SocketCore());
- socket->establishConnection(addr, port);
+ createSocket();
+ getSocket()->establishConnection(addr, port);
if(proxyMethod == V_TUNNEL) {
HttpProxyRequestCommand* c =
- new HttpProxyRequestCommand(getCuid(), req, _fileEntry,
- _requestGroup, e,
- proxyRequest, socket);
+ new HttpProxyRequestCommand(getCuid(),
+ getRequest(),
+ getFileEntry(),
+ getRequestGroup(),
+ getDownloadEngine(),
+ proxyRequest,
+ getSocket());
c->setConnectedAddr(hostname, addr, port);
command = c;
} else if(proxyMethod == V_GET) {
SharedHandle<HttpConnection> httpConnection
- (new HttpConnection(getCuid(), socket, getOption().get()));
- HttpRequestCommand* c = new HttpRequestCommand(getCuid(), req,
- _fileEntry,
- _requestGroup,
- httpConnection, e,
- socket);
+ (new HttpConnection(getCuid(), getSocket(), getOption().get()));
+ HttpRequestCommand* c = new HttpRequestCommand(getCuid(),
+ getRequest(),
+ getFileEntry(),
+ getRequestGroup(),
+ httpConnection,
+ getDownloadEngine(),
+ getSocket());
c->setConnectedAddr(hostname, addr, port);
c->setProxyRequest(proxyRequest);
command = c;
@@ -109,10 +116,12 @@ Command* HttpInitiateConnectionCommand::createNextCommand
} else {
SharedHandle<HttpConnection> httpConnection
(new HttpConnection(getCuid(), pooledSocket, getOption().get()));
- HttpRequestCommand* c = new HttpRequestCommand(getCuid(), req,
- _fileEntry,
- _requestGroup,
- httpConnection, e,
+ HttpRequestCommand* c = new HttpRequestCommand(getCuid(),
+ getRequest(),
+ getFileEntry(),
+ getRequestGroup(),
+ httpConnection,
+ getDownloadEngine(),
pooledSocket);
if(proxyMethod == V_GET) {
c->setProxyRequest(proxyRequest);
@@ -121,22 +130,26 @@ Command* HttpInitiateConnectionCommand::createNextCommand
}
} else {
SharedHandle<SocketCore> pooledSocket =
- e->popPooledSocket(resolvedAddresses, req->getPort());
+ getDownloadEngine()->popPooledSocket
+ (resolvedAddresses, getRequest()->getPort());
if(pooledSocket.isNull()) {
if(getLogger()->info()) {
getLogger()->info(MSG_CONNECTING_TO_SERVER,
util::itos(getCuid()).c_str(), addr.c_str(), port);
}
- socket.reset(new SocketCore());
- socket->establishConnection(addr, port);
+ createSocket();
+ getSocket()->establishConnection(addr, port);
} else {
- socket = pooledSocket;
+ setSocket(pooledSocket);
}
SharedHandle<HttpConnection> httpConnection
- (new HttpConnection(getCuid(), socket, getOption().get()));
+ (new HttpConnection(getCuid(), getSocket(), getOption().get()));
HttpRequestCommand* c =
- new HttpRequestCommand(getCuid(), req, _fileEntry, _requestGroup,
- httpConnection, e, socket);
+ new HttpRequestCommand(getCuid(), getRequest(), getFileEntry(),
+ getRequestGroup(),
+ httpConnection,
+ getDownloadEngine(),
+ getSocket());
if(pooledSocket.isNull()) {
c->setConnectedAddr(hostname, addr, port);
}
diff --git a/src/HttpProxyRequestCommand.cc b/src/HttpProxyRequestCommand.cc
index 7de74682..90cd0298 100644
--- a/src/HttpProxyRequestCommand.cc
+++ b/src/HttpProxyRequestCommand.cc
@@ -58,7 +58,8 @@ HttpProxyRequestCommand::~HttpProxyRequestCommand() {}
Command* HttpProxyRequestCommand::getNextCommand()
{
return new HttpProxyResponseCommand
- (getCuid(), req, _fileEntry, _requestGroup, httpConnection, e, socket);
+ (getCuid(), getRequest(), getFileEntry(), getRequestGroup(),
+ getHttpConnection(), getDownloadEngine(), getSocket());
}
} // namespace aria2
diff --git a/src/HttpProxyResponseCommand.cc b/src/HttpProxyResponseCommand.cc
index b577017f..e0a23c36 100644
--- a/src/HttpProxyResponseCommand.cc
+++ b/src/HttpProxyResponseCommand.cc
@@ -59,8 +59,9 @@ HttpProxyResponseCommand::~HttpProxyResponseCommand() {}
Command* HttpProxyResponseCommand::getNextCommand()
{
- return new HttpRequestCommand(getCuid(), req, _fileEntry,
- _requestGroup, httpConnection, e, socket);
+ return new HttpRequestCommand(getCuid(), getRequest(), getFileEntry(),
+ getRequestGroup(), getHttpConnection(),
+ getDownloadEngine(), getSocket());
}
} // namespace aria2
diff --git a/src/HttpRequestCommand.cc b/src/HttpRequestCommand.cc
index 85b2a244..9e598adb 100644
--- a/src/HttpRequestCommand.cc
+++ b/src/HttpRequestCommand.cc
@@ -73,7 +73,7 @@ HttpRequestCommand::HttpRequestCommand
{
setTimeout(getOption()->getAsInt(PREF_CONNECT_TIMEOUT));
disableReadCheckSocket();
- setWriteCheckSocket(socket);
+ setWriteCheckSocket(getSocket());
}
HttpRequestCommand::~HttpRequestCommand() {}
@@ -115,47 +115,48 @@ createHttpRequest(const SharedHandle<Request>& req,
bool HttpRequestCommand::executeInternal() {
//socket->setBlockingMode();
- if(req->getProtocol() == Request::PROTO_HTTPS) {
- socket->prepareSecureConnection();
- if(!socket->initiateSecureConnection(req->getHost())) {
- setReadCheckSocketIf(socket, socket->wantRead());
- setWriteCheckSocketIf(socket, socket->wantWrite());
- e->addCommand(this);
+ if(getRequest()->getProtocol() == Request::PROTO_HTTPS) {
+ getSocket()->prepareSecureConnection();
+ if(!getSocket()->initiateSecureConnection(getRequest()->getHost())) {
+ setReadCheckSocketIf(getSocket(), getSocket()->wantRead());
+ setWriteCheckSocketIf(getSocket(), getSocket()->wantWrite());
+ getDownloadEngine()->addCommand(this);
return false;
}
}
if(_httpConnection->sendBufferIsEmpty()) {
if(!checkIfConnectionEstablished
- (socket, _connectedHostname, _connectedAddr, _connectedPort)) {
+ (getSocket(), _connectedHostname, _connectedAddr, _connectedPort)) {
return true;
}
- if(_segments.empty()) {
+ if(getSegments().empty()) {
SharedHandle<HttpRequest> httpRequest
- (createHttpRequest(req,
- _fileEntry,
+ (createHttpRequest(getRequest(),
+ getFileEntry(),
SharedHandle<Segment>(),
- _requestGroup->getTotalLength(),
+ getRequestGroup()->getTotalLength(),
getOption(),
- _requestGroup,
- e->getCookieStorage(),
- e->getAuthConfigFactory(),
+ getRequestGroup(),
+ getDownloadEngine()->getCookieStorage(),
+ getDownloadEngine()->getAuthConfigFactory(),
_proxyRequest));
_httpConnection->sendRequest(httpRequest);
} else {
for(std::vector<SharedHandle<Segment> >::const_iterator itr =
- _segments.begin(), eoi = _segments.end(); itr != eoi; ++itr) {
+ getSegments().begin(), eoi = getSegments().end();
+ itr != eoi; ++itr) {
const SharedHandle<Segment>& segment = *itr;
if(!_httpConnection->isIssued(segment)) {
SharedHandle<HttpRequest> httpRequest
- (createHttpRequest(req,
- _fileEntry,
+ (createHttpRequest(getRequest(),
+ getFileEntry(),
segment,
- _requestGroup->getTotalLength(),
+ getRequestGroup()->getTotalLength(),
getOption(),
- _requestGroup,
- e->getCookieStorage(),
- e->getAuthConfigFactory(),
+ getRequestGroup(),
+ getDownloadEngine()->getCookieStorage(),
+ getDownloadEngine()->getAuthConfigFactory(),
_proxyRequest));
_httpConnection->sendRequest(httpRequest);
}
@@ -165,15 +166,19 @@ bool HttpRequestCommand::executeInternal() {
_httpConnection->sendPendingData();
}
if(_httpConnection->sendBufferIsEmpty()) {
- Command* command = new HttpResponseCommand(getCuid(), req, _fileEntry,
- _requestGroup,
- _httpConnection, e, socket);
- e->addCommand(command);
+ Command* command = new HttpResponseCommand(getCuid(),
+ getRequest(),
+ getFileEntry(),
+ getRequestGroup(),
+ _httpConnection,
+ getDownloadEngine(),
+ getSocket());
+ getDownloadEngine()->addCommand(command);
return true;
} else {
- setReadCheckSocketIf(socket, socket->wantRead());
- setWriteCheckSocketIf(socket, socket->wantWrite());
- e->addCommand(this);
+ setReadCheckSocketIf(getSocket(), getSocket()->wantRead());
+ setWriteCheckSocketIf(getSocket(), getSocket()->wantWrite());
+ getDownloadEngine()->addCommand(this);
return false;
}
}
diff --git a/src/HttpResponseCommand.cc b/src/HttpResponseCommand.cc
index 02991f7d..30f7045a 100644
--- a/src/HttpResponseCommand.cc
+++ b/src/HttpResponseCommand.cc
@@ -87,21 +87,21 @@ HttpResponseCommand::HttpResponseCommand
DownloadEngine* e,
const SocketHandle& s)
:AbstractCommand(cuid, req, fileEntry, requestGroup, e, s),
- httpConnection(httpConnection)
+ _httpConnection(httpConnection)
{}
HttpResponseCommand::~HttpResponseCommand() {}
bool HttpResponseCommand::executeInternal()
{
- SharedHandle<HttpRequest> httpRequest = httpConnection->getFirstHttpRequest();
- SharedHandle<HttpResponse> httpResponse = httpConnection->receiveResponse();
+ SharedHandle<HttpRequest> httpRequest =_httpConnection->getFirstHttpRequest();
+ SharedHandle<HttpResponse> httpResponse = _httpConnection->receiveResponse();
if(httpResponse.isNull()) {
// The server has not responded to our request yet.
// For socket->wantRead() == true, setReadCheckSocket(socket) is already
// done in the constructor.
- setWriteCheckSocketIf(socket, socket->wantWrite());
- e->addCommand(this);
+ setWriteCheckSocketIf(getSocket(), getSocket()->wantWrite());
+ getDownloadEngine()->addCommand(this);
return false;
}
// check HTTP status number
@@ -112,39 +112,40 @@ bool HttpResponseCommand::executeInternal()
// Disable persistent connection if:
// Connection: close is received or the remote server is not HTTP/1.1.
// We don't care whether non-HTTP/1.1 server returns Connection: keep-alive.
- req->supportsPersistentConnection
+ getRequest()->supportsPersistentConnection
(httpResponse->supportsPersistentConnection());
- if(req->isPipeliningEnabled()) {
- req->setMaxPipelinedRequest
+ if(getRequest()->isPipeliningEnabled()) {
+ getRequest()->setMaxPipelinedRequest
(getOption()->getAsInt(PREF_MAX_HTTP_PIPELINING));
}
if(httpResponse->getResponseStatus() >= HttpHeader::S300) {
if(httpResponse->getResponseStatus() == HttpHeader::S404) {
- _requestGroup->increaseAndValidateFileNotFoundCount();
+ getRequestGroup()->increaseAndValidateFileNotFoundCount();
}
return skipResponseBody(httpResponse);
}
- if(!_fileEntry->isSingleHostMultiConnectionEnabled()) {
+ if(!getFileEntry()->isSingleHostMultiConnectionEnabled()) {
// TODO redirection should be considered here. We need to parse
// original URI to get hostname.
- _fileEntry->removeURIWhoseHostnameIs(req->getHost());
+ getFileEntry()->removeURIWhoseHostnameIs(getRequest()->getHost());
}
- if(_requestGroup->getPieceStorage().isNull()) {
+ if(getPieceStorage().isNull()) {
uint64_t totalLength = httpResponse->getEntityLength();
- _fileEntry->setLength(totalLength);
- if(_fileEntry->getPath().empty()) {
- _fileEntry->setPath
+ getFileEntry()->setLength(totalLength);
+ if(getFileEntry()->getPath().empty()) {
+ getFileEntry()->setPath
(util::applyDir
(getDownloadContext()->getDir(),
util::fixTaintedBasename(httpResponse->determinFilename())));
}
- _fileEntry->setContentType(httpResponse->getContentType());
- _requestGroup->preDownloadProcessing();
- if(e->getRequestGroupMan()->isSameFileBeingDownloaded(_requestGroup)) {
+ getFileEntry()->setContentType(httpResponse->getContentType());
+ getRequestGroup()->preDownloadProcessing();
+ if(getDownloadEngine()->getRequestGroupMan()->
+ isSameFileBeingDownloaded(getRequestGroup())) {
throw DOWNLOAD_FAILURE_EXCEPTION
(StringFormat(EX_DUPLICATE_FILE_DOWNLOAD,
- _requestGroup->getFirstFilePath().c_str()).str());
+ getRequestGroup()->getFirstFilePath().c_str()).str());
}
// update last modified time
updateLastModifiedTime(httpResponse->getLastModifiedTime());
@@ -153,8 +154,8 @@ bool HttpResponseCommand::executeInternal()
// assume we can do segmented downloading
if(totalLength == 0 || shouldInflateContentEncoding(httpResponse)) {
// we ignore content-length when inflate is required
- _fileEntry->setLength(0);
- if(req->getMethod() == Request::METHOD_GET &&
+ getFileEntry()->setLength(0);
+ if(getRequest()->getMethod() == Request::METHOD_GET &&
(totalLength != 0 ||
!httpResponse->getHttpHeader()->defined(HttpHeader::CONTENT_LENGTH))){
// DownloadContext::knowsTotalLength() == true only when
@@ -167,22 +168,22 @@ bool HttpResponseCommand::executeInternal()
}
} else {
// validate totalsize
- _requestGroup->validateTotalLength(_fileEntry->getLength(),
+ getRequestGroup()->validateTotalLength(getFileEntry()->getLength(),
httpResponse->getEntityLength());
// update last modified time
updateLastModifiedTime(httpResponse->getLastModifiedTime());
- if(_requestGroup->getTotalLength() == 0) {
+ if(getRequestGroup()->getTotalLength() == 0) {
// Since total length is unknown, the file size in previously
// failed download could be larger than the size this time.
// Also we can't resume in this case too. So truncate the file
// anyway.
- _requestGroup->getPieceStorage()->getDiskAdaptor()->truncate(0);
- e->addCommand
+ getPieceStorage()->getDiskAdaptor()->truncate(0);
+ getDownloadEngine()->addCommand
(createHttpDownloadCommand(httpResponse,
getTransferEncodingDecoder(httpResponse),
getContentEncodingDecoder(httpResponse)));
} else {
- e->addCommand(createHttpDownloadCommand
+ getDownloadEngine()->addCommand(createHttpDownloadCommand
(httpResponse, getTransferEncodingDecoder(httpResponse)));
}
return true;
@@ -192,7 +193,7 @@ bool HttpResponseCommand::executeInternal()
void HttpResponseCommand::updateLastModifiedTime(const Time& lastModified)
{
if(getOption()->getAsBool(PREF_REMOTE_TIME)) {
- _requestGroup->updateLastModifiedTime(lastModified);
+ getRequestGroup()->updateLastModifiedTime(lastModified);
}
}
@@ -215,12 +216,12 @@ bool HttpResponseCommand::handleDefaultEncoding
(const SharedHandle<HttpResponse>& httpResponse)
{
SharedHandle<HttpRequest> httpRequest = httpResponse->getHttpRequest();
- _requestGroup->adjustFilename
+ getRequestGroup()->adjustFilename
(SharedHandle<BtProgressInfoFile>(new DefaultBtProgressInfoFile
- (_requestGroup->getDownloadContext(),
+ (getDownloadContext(),
SharedHandle<PieceStorage>(),
getOption().get())));
- _requestGroup->initPieceStorage();
+ getRequestGroup()->initPieceStorage();
if(getOption()->getAsBool(PREF_DRY_RUN)) {
onDryRunFileFound();
@@ -228,47 +229,44 @@ bool HttpResponseCommand::handleDefaultEncoding
}
BtProgressInfoFileHandle infoFile
- (new DefaultBtProgressInfoFile(_requestGroup->getDownloadContext(),
- _requestGroup->getPieceStorage(),
+ (new DefaultBtProgressInfoFile(getDownloadContext(),
+ getPieceStorage(),
getOption().get()));
- if(!infoFile->exists() && _requestGroup->downloadFinishedByFileLength()) {
- _requestGroup->getPieceStorage()->markAllPiecesDone();
-
+ if(!infoFile->exists() && getRequestGroup()->downloadFinishedByFileLength()) {
+ getPieceStorage()->markAllPiecesDone();
getLogger()->notice(MSG_DOWNLOAD_ALREADY_COMPLETED,
- util::itos(_requestGroup->getGID()).c_str(),
- _requestGroup->getFirstFilePath().c_str());
-
+ util::itos(getRequestGroup()->getGID()).c_str(),
+ getRequestGroup()->getFirstFilePath().c_str());
return true;
}
- _requestGroup->loadAndOpenFile(infoFile);
- File file(_requestGroup->getFirstFilePath());
+ getRequestGroup()->loadAndOpenFile(infoFile);
+ File file(getRequestGroup()->getFirstFilePath());
// We have to make sure that command that has Request object must
// have segment after PieceStorage is initialized. See
// AbstractCommand::execute()
- SharedHandle<Segment> segment =
- _requestGroup->getSegmentMan()->getSegment(getCuid(), 0);
+ SharedHandle<Segment> segment = getSegmentMan()->getSegment(getCuid(), 0);
// pipelining requires implicit range specified. But the request for
// this response most likely dones't contains range header. This means
// we can't continue to use this socket because server sends all entity
// body instead of a segment.
// Therefore, we shutdown the socket here if pipelining is enabled.
DownloadCommand* command = 0;
- if(req->getMethod() == Request::METHOD_GET &&
+ if(getRequest()->getMethod() == Request::METHOD_GET &&
!segment.isNull() && segment->getPositionToWrite() == 0 &&
- !req->isPipeliningEnabled()) {
+ !getRequest()->isPipeliningEnabled()) {
command = createHttpDownloadCommand
(httpResponse, getTransferEncodingDecoder(httpResponse));
} else {
- _requestGroup->getSegmentMan()->cancelSegment(getCuid());
- _fileEntry->poolRequest(req);
+ getSegmentMan()->cancelSegment(getCuid());
+ getFileEntry()->poolRequest(getRequest());
}
// After command is passed to prepareForNextAction(), it is managed
// by CheckIntegrityEntry.
prepareForNextAction(command);
command = 0;
- if(req->getMethod() == Request::METHOD_HEAD) {
+ if(getRequest()->getMethod() == Request::METHOD_HEAD) {
poolConnection();
- req->setMethod(Request::METHOD_GET);
+ getRequest()->setMethod(Request::METHOD_GET);
}
return true;
}
@@ -314,47 +312,43 @@ bool HttpResponseCommand::handleOtherEncoding
SharedHandle<HttpRequest> httpRequest = httpResponse->getHttpRequest();
if(getOption()->getAsBool(PREF_DRY_RUN)) {
- _requestGroup->initPieceStorage();
+ getRequestGroup()->initPieceStorage();
onDryRunFileFound();
return true;
}
- if(req->getMethod() == Request::METHOD_HEAD) {
+ if(getRequest()->getMethod() == Request::METHOD_HEAD) {
poolConnection();
- req->setMethod(Request::METHOD_GET);
+ getRequest()->setMethod(Request::METHOD_GET);
return prepareForRetry(0);
}
// For zero-length file, check existing file comparing its size
- if(_requestGroup->downloadFinishedByFileLength()) {
- _requestGroup->initPieceStorage();
- _requestGroup->getPieceStorage()->markAllPiecesDone();
-
+ if(getRequestGroup()->downloadFinishedByFileLength()) {
+ getRequestGroup()->initPieceStorage();
+ getPieceStorage()->markAllPiecesDone();
getLogger()->notice(MSG_DOWNLOAD_ALREADY_COMPLETED,
- util::itos(_requestGroup->getGID()).c_str(),
- _requestGroup->getFirstFilePath().c_str());
-
+ util::itos(getRequestGroup()->getGID()).c_str(),
+ getRequestGroup()->getFirstFilePath().c_str());
poolConnection();
return true;
}
- _requestGroup->shouldCancelDownloadForSafety();
- _requestGroup->initPieceStorage();
-
- _requestGroup->getPieceStorage()->getDiskAdaptor()->initAndOpenFile();
-
+ getRequestGroup()->shouldCancelDownloadForSafety();
+ getRequestGroup()->initPieceStorage();
+ getPieceStorage()->getDiskAdaptor()->initAndOpenFile();
// In this context, knowsTotalLength() is true only when the file is
// really zero-length.
- if(_requestGroup->getDownloadContext()->knowsTotalLength()) {
+ if(getDownloadContext()->knowsTotalLength()) {
poolConnection();
return true;
}
// We have to make sure that command that has Request object must
// have segment after PieceStorage is initialized. See
// AbstractCommand::execute()
- _requestGroup->getSegmentMan()->getSegment(getCuid(), 0);
+ getSegmentMan()->getSegment(getCuid(), 0);
- e->addCommand
+ getDownloadEngine()->addCommand
(createHttpDownloadCommand(httpResponse,
getTransferEncodingDecoder(httpResponse),
getContentEncodingDecoder(httpResponse)));
@@ -369,22 +363,23 @@ bool HttpResponseCommand::skipResponseBody
// thrown away.
HttpSkipResponseCommand* command = new HttpSkipResponseCommand
- (getCuid(), req, _fileEntry, _requestGroup, httpConnection, httpResponse,
- e, socket);
+ (getCuid(), getRequest(), getFileEntry(), getRequestGroup(),
+ _httpConnection, httpResponse,
+ getDownloadEngine(), getSocket());
command->setTransferEncodingDecoder(decoder);
// If request method is HEAD or the response body is zero-length,
// set command's status to real time so that avoid read check blocking
- if(req->getMethod() == Request::METHOD_HEAD ||
+ if(getRequest()->getMethod() == Request::METHOD_HEAD ||
(httpResponse->getEntityLength() == 0 &&
!httpResponse->isTransferEncodingSpecified())) {
command->setStatusRealtime();
// If entity length == 0, then socket read/write check must be disabled.
command->disableSocketCheck();
- e->setNoWait(true);
+ getDownloadEngine()->setNoWait(true);
}
- e->addCommand(command);
+ getDownloadEngine()->addCommand(command);
return true;
}
@@ -395,8 +390,10 @@ HttpDownloadCommand* HttpResponseCommand::createHttpDownloadCommand
{
HttpDownloadCommand* command =
- new HttpDownloadCommand(getCuid(), req, _fileEntry, _requestGroup,
- httpResponse, httpConnection, e, socket);
+ new HttpDownloadCommand(getCuid(), getRequest(), getFileEntry(),
+ getRequestGroup(),
+ httpResponse, _httpConnection,
+ getDownloadEngine(), getSocket());
command->setStartupIdleTime(getOption()->getAsInt(PREF_STARTUP_IDLE_TIME));
command->setLowestDownloadSpeedLimit
(getOption()->getAsInt(PREF_LOWEST_SPEED_LIMIT));
@@ -407,25 +404,26 @@ HttpDownloadCommand* HttpResponseCommand::createHttpDownloadCommand
// Since the compressed file's length are returned in the response header
// and the decompressed file size is unknown at this point, disable file
// allocation here.
- _requestGroup->setFileAllocationEnabled(false);
+ getRequestGroup()->setFileAllocationEnabled(false);
}
- _requestGroup->getURISelector()->tuneDownloadCommand
- (_fileEntry->getRemainingUris(), command);
+ getRequestGroup()->getURISelector()->tuneDownloadCommand
+ (getFileEntry()->getRemainingUris(), command);
return command;
}
void HttpResponseCommand::poolConnection()
{
- if(req->supportsPersistentConnection()) {
- e->poolSocket(req, createProxyRequest(), socket);
+ if(getRequest()->supportsPersistentConnection()) {
+ getDownloadEngine()->poolSocket(getRequest(), createProxyRequest(),
+ getSocket());
}
}
void HttpResponseCommand::onDryRunFileFound()
{
- _requestGroup->getPieceStorage()->markAllPiecesDone();
+ getPieceStorage()->markAllPiecesDone();
poolConnection();
}
diff --git a/src/HttpResponseCommand.h b/src/HttpResponseCommand.h
index 20371905..a62a7331 100644
--- a/src/HttpResponseCommand.h
+++ b/src/HttpResponseCommand.h
@@ -48,7 +48,7 @@ class SocketCore;
class HttpResponseCommand : public AbstractCommand {
private:
- SharedHandle<HttpConnection> httpConnection;
+ SharedHandle<HttpConnection> _httpConnection;
bool handleDefaultEncoding(const SharedHandle<HttpResponse>& httpResponse);
bool handleOtherEncoding(const SharedHandle<HttpResponse>& httpResponse);
diff --git a/src/HttpSkipResponseCommand.cc b/src/HttpSkipResponseCommand.cc
index 974b4a82..7818d5f0 100644
--- a/src/HttpSkipResponseCommand.cc
+++ b/src/HttpSkipResponseCommand.cc
@@ -87,13 +87,13 @@ void HttpSkipResponseCommand::setTransferEncodingDecoder
bool HttpSkipResponseCommand::executeInternal()
{
- if(req->getMethod() == Request::METHOD_HEAD ||
+ if(getRequest()->getMethod() == Request::METHOD_HEAD ||
(_totalLength == 0 && _transferEncodingDecoder.isNull())) {
// If request method is HEAD or content-length header is present and
// it's value is 0, then pool socket for reuse.
// If content-length header is not present, then EOF is expected in the end.
// In this case, the content is thrown away and socket cannot be pooled.
- if(req->getMethod() == Request::METHOD_HEAD ||
+ if(getRequest()->getMethod() == Request::METHOD_HEAD ||
_httpResponse->getHttpHeader()->defined(HttpHeader::CONTENT_LENGTH)) {
poolConnection();
}
@@ -104,7 +104,7 @@ bool HttpSkipResponseCommand::executeInternal()
size_t bufSize = BUFSIZE;
try {
- socket->readData(buf, bufSize);
+ getSocket()->readData(buf, bufSize);
if(_transferEncodingDecoder.isNull()) {
_receivedBytes += bufSize;
@@ -114,7 +114,7 @@ bool HttpSkipResponseCommand::executeInternal()
_transferEncodingDecoder->decode(buf, bufSize);
}
if(_totalLength != 0 && bufSize == 0 &&
- !socket->wantRead() && !socket->wantWrite()) {
+ !getSocket()->wantRead() && !getSocket()->wantWrite()) {
throw DL_RETRY_EX(EX_GOT_EOF);
}
} catch(RecoverableException& e) {
@@ -127,7 +127,7 @@ bool HttpSkipResponseCommand::executeInternal()
bool finished = false;
if(_transferEncodingDecoder.isNull()) {
if(bufSize == 0) {
- if(!socket->wantRead() && !socket->wantWrite()) {
+ if(!getSocket()->wantRead() && !getSocket()->wantWrite()) {
return processResponse();
}
} else {
@@ -140,16 +140,17 @@ bool HttpSkipResponseCommand::executeInternal()
poolConnection();
return processResponse();
} else {
- setWriteCheckSocketIf(socket, socket->wantWrite());
- e->addCommand(this);
+ setWriteCheckSocketIf(getSocket(), getSocket()->wantWrite());
+ getDownloadEngine()->addCommand(this);
return false;
}
}
void HttpSkipResponseCommand::poolConnection() const
{
- if(req->supportsPersistentConnection()) {
- e->poolSocket(req, createProxyRequest(), socket);
+ if(getRequest()->supportsPersistentConnection()) {
+ getDownloadEngine()->poolSocket
+ (getRequest(), createProxyRequest(), getSocket());
}
}
@@ -159,7 +160,8 @@ bool HttpSkipResponseCommand::processResponse()
unsigned int rnum =
_httpResponse->getHttpRequest()->getRequest()->getRedirectCount();
if(rnum >= Request::MAX_REDIRECT) {
- throw DL_ABORT_EX(StringFormat("Too many redirects: count=%u", rnum).str());
+ throw DL_ABORT_EX
+ (StringFormat("Too many redirects: count=%u", rnum).str());
}
_httpResponse->processRedirect();
return prepareForRetry(0);
@@ -167,8 +169,8 @@ bool HttpSkipResponseCommand::processResponse()
if(_httpResponse->getResponseStatus() == HttpHeader::S401) {
if(getOption()->getAsBool(PREF_HTTP_AUTH_CHALLENGE) &&
!_httpResponse->getHttpRequest()->authenticationUsed() &&
- e->getAuthConfigFactory()->activateBasicCred
- (req->getHost(), req->getDir(), getOption().get())) {
+ getDownloadEngine()->getAuthConfigFactory()->activateBasicCred
+ (getRequest()->getHost(), getRequest()->getDir(), getOption().get())) {
return prepareForRetry(0);
} else {
throw DL_ABORT_EX(EX_AUTH_FAILED);
@@ -177,7 +179,10 @@ bool HttpSkipResponseCommand::processResponse()
throw DL_ABORT_EX2(MSG_RESOURCE_NOT_FOUND,
downloadresultcode::RESOURCE_NOT_FOUND);
} else {
- throw DL_ABORT_EX(StringFormat(EX_BAD_STATUS, util::parseUInt(_httpResponse->getResponseStatus())).str());
+ throw DL_ABORT_EX
+ (StringFormat
+ (EX_BAD_STATUS,
+ util::parseUInt(_httpResponse->getResponseStatus())).str());
}
} else {
return prepareForRetry(0);
diff --git a/src/InitiateConnectionCommand.cc b/src/InitiateConnectionCommand.cc
index 6ef9e9c2..8b57e18e 100644
--- a/src/InitiateConnectionCommand.cc
+++ b/src/InitiateConnectionCommand.cc
@@ -77,8 +77,8 @@ bool InitiateConnectionCommand::executeInternal() {
uint16_t port;
SharedHandle<Request> proxyRequest = createProxyRequest();
if(proxyRequest.isNull()) {
- hostname = req->getHost();
- port = req->getPort();
+ hostname = getRequest()->getHost();
+ port = getRequest()->getPort();
} else {
hostname = proxyRequest->getHost();
port = proxyRequest->getPort();
@@ -86,21 +86,21 @@ bool InitiateConnectionCommand::executeInternal() {
std::vector<std::string> addrs;
std::string ipaddr = resolveHostname(addrs, hostname, port);
if(ipaddr.empty()) {
- e->addCommand(this);
+ getDownloadEngine()->addCommand(this);
return false;
}
try {
Command* command = createNextCommand(hostname, ipaddr, port,
addrs, proxyRequest);
- e->addCommand(command);
+ getDownloadEngine()->addCommand(command);
return true;
} catch(RecoverableException& ex) {
// Catch exception and retry another address.
// See also AbstractCommand::checkIfConnectionEstablished
// TODO ipaddr might not be used if pooled sockt was found.
- e->markBadIPAddress(hostname, ipaddr, port);
- if(!e->findCachedIPAddress(hostname, port).empty()) {
+ getDownloadEngine()->markBadIPAddress(hostname, ipaddr, port);
+ if(!getDownloadEngine()->findCachedIPAddress(hostname, port).empty()) {
if(getLogger()->info()) {
getLogger()->info(EX_EXCEPTION_CAUGHT, ex);
getLogger()->info(MSG_CONNECT_FAILED_AND_RETRY,
@@ -108,12 +108,13 @@ bool InitiateConnectionCommand::executeInternal() {
}
Command* command =
InitiateConnectionCommandFactory::createInitiateConnectionCommand
- (getCuid(), req, _fileEntry, _requestGroup, e);
- e->setNoWait(true);
- e->addCommand(command);
+ (getCuid(), getRequest(), getFileEntry(), getRequestGroup(),
+ getDownloadEngine());
+ getDownloadEngine()->setNoWait(true);
+ getDownloadEngine()->addCommand(command);
return true;
}
- e->removeCachedIPAddress(hostname, port);
+ getDownloadEngine()->removeCachedIPAddress(hostname, port);
throw;
}
}