diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2008-09-14 14:31:19 +0000 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2008-09-14 14:31:19 +0000 |
| commit | c921529d68a74fe6af34023d530763673aa1972e (patch) | |
| tree | d11d91184a610cac1455eadf3ff8536a8d6c246a /src/AbstractCommand.cc | |
| parent | 8687877139a39b4f8ddb2aba707d879c187443a1 (diff) | |
2008-09-14 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
If establishing conneciton to a server is failed, then mark
error on
its ServerStat.
Added the cause of error to log when error event occurred.
Moved message string to message.h for translation.
* src/AbstractCommand.cc
* src/AbstractCommand.h
* src/FtpNegotiationCommand.cc
* src/HttpRequestCommand.cc
* src/PeerAbstractCommand.cc
* src/message.h
Diffstat (limited to 'src/AbstractCommand.cc')
| -rw-r--r-- | src/AbstractCommand.cc | 46 |
1 files changed, 39 insertions, 7 deletions
diff --git a/src/AbstractCommand.cc b/src/AbstractCommand.cc index fa4d790f..0127c888 100644 --- a/src/AbstractCommand.cc +++ b/src/AbstractCommand.cc @@ -137,17 +137,15 @@ bool AbstractCommand::execute() { } return executeInternal(); } else if(_errorEvent) { - throw DlRetryEx("Network problem has occurred."); + throw DlRetryEx + (StringFormat(MSG_NETWORK_PROBLEM, + socket->getSocketError().c_str()).str()); } else { if(checkPoint.elapsed(timeout)) { // timeout triggers ServerStat error state. SharedHandle<ServerStat> ss = - e->_requestGroupMan->findServerStat(req->getHost(), - req->getProtocol()); - if(ss.isNull()) { - ss.reset(new ServerStat(req->getHost(), req->getProtocol())); - e->_requestGroupMan->addServerStat(ss); - } + e->_requestGroupMan->getOrCreateServerStat(req->getHost(), + req->getProtocol()); ss->setError(); throw DlRetryEx(EX_TIME_OUT); @@ -286,12 +284,29 @@ void AbstractCommand::initAsyncNameResolver(const std::string& hostname) setNameResolverCheck(_asyncNameResolver); } +static bool isProxyGETRequest(const std::string& protocol, const Option* option) +{ + return + // For HTTP/HTTPS + ((protocol == Request::PROTO_HTTP || protocol == Request::PROTO_HTTPS) && + (option->getAsBool(PREF_HTTP_PROXY_ENABLED) && + option->get(PREF_HTTP_PROXY_METHOD) == V_GET)) || + // For FTP + (protocol == Request::PROTO_FTP && + (option->getAsBool(PREF_HTTP_PROXY_ENABLED) && + option->get(PREF_FTP_VIA_HTTP_PROXY) == V_GET)); +} + bool AbstractCommand::asyncResolveHostname() { switch(_asyncNameResolver->getStatus()) { case AsyncNameResolver::STATUS_SUCCESS: return true; case AsyncNameResolver::STATUS_ERROR: + if(!isProxyGETRequest(req->getProtocol(), e->option)) { + e->_requestGroupMan->getOrCreateServerStat + (req->getHost(), req->getProtocol())->setError(); + } throw DlAbortEx(StringFormat(MSG_NAME_RESOLUTION_FAILED, cuid, _asyncNameResolver->getHostname().c_str(), _asyncNameResolver->getError().c_str()).str()); @@ -339,4 +354,21 @@ void AbstractCommand::prepareForNextAction(Command* nextCommand) e->setNoWait(true); } +void AbstractCommand::checkIfConnectionEstablished +(const SharedHandle<SocketCore>& socket) +{ + if(socket->isReadable(0)) { + std::string error = socket->getSocketError(); + if(!error.empty()) { + // Don't set error if proxy server is used and its method is GET. + if(!isProxyGETRequest(req->getProtocol(), e->option)) { + e->_requestGroupMan->getOrCreateServerStat + (req->getHost(), req->getProtocol())->setError(); + } + throw DlRetryEx + (StringFormat(MSG_ESTABLISHING_CONNECTION_FAILED, error.c_str()).str()); + } + } +} + } // namespace aria2 |
