diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2009-10-17 13:11:03 +0000 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2009-10-17 13:11:03 +0000 |
| commit | 10e371c25a9185d3d2d02ddd3d40dfcbc49967d5 (patch) | |
| tree | 5e2726c3fce612a2c85c6ec0db7d12c1cc4fc216 /src/Netrc.cc | |
| parent | ac63a32c4811803eb892e244a022ae263c0e6e70 (diff) | |
2009-10-17 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Fixed the bug that Netrc::parse() cannot recognize comment line.
* src/Netrc.cc
* src/Util.h
* test/NetrcTest.cc
* test/sample.netrc
Diffstat (limited to 'src/Netrc.cc')
| -rw-r--r-- | src/Netrc.cc | 99 |
1 files changed, 63 insertions, 36 deletions
diff --git a/src/Netrc.cc b/src/Netrc.cc index 96011398..453cddbd 100644 --- a/src/Netrc.cc +++ b/src/Netrc.cc @@ -36,10 +36,12 @@ #include <fstream> #include <algorithm> +#include <vector> #include "DlAbortEx.h" #include "StringFormat.h" #include "A2STR.h" +#include "Util.h" namespace aria2 { @@ -55,21 +57,9 @@ const std::string Netrc::ACCOUNT("account"); const std::string Netrc::MACDEF("macdef"); -std::string Netrc::getRequiredNextToken(std::ifstream& f) const -{ - std::string token; - if(f >> token) { - return token; - } else { - throw DL_ABORT_EX - ("Netrc:parse error. EOF reached where a token expected."); - } -} - void Netrc::skipMacdef(std::ifstream& f) const { std::string line; - getline(f, line); while(getline(f, line)) { if(line == A2STR::CR_C || line.empty()) { break; @@ -87,33 +77,70 @@ void Netrc::parse(const std::string& path) (StringFormat("File not found: %s", path.c_str()).str()); } + enum STATE { + GET_TOKEN, + SET_MACHINE, + SET_LOGIN, + SET_PASSWORD, + SET_ACCOUNT, + SET_MACDEF + }; AuthenticatorHandle authenticator; - std::string token; - while(f >> token) { - if(token == Netrc::MACHINE) { - storeAuthenticator(authenticator); - authenticator.reset(new Authenticator()); - authenticator->setMachine(getRequiredNextToken(f)); - } else if(token == Netrc::DEFAULT) { - storeAuthenticator(authenticator); - authenticator.reset(new DefaultAuthenticator()); - } else { - if(authenticator.isNull()) { - throw DL_ABORT_EX - ("Netrc:parse error. %s encounterd where 'machine' or 'default' expected."); - } - if(token == Netrc::LOGIN) { - authenticator->setLogin(getRequiredNextToken(f)); - } else if(token == Netrc::PASSWORD) { - authenticator->setPassword(getRequiredNextToken(f)); - } else if(token == Netrc::ACCOUNT) { - authenticator->setAccount(getRequiredNextToken(f)); - } else if(token == Netrc::MACDEF) { - getRequiredNextToken(f); - skipMacdef(f); - } + std::string line; + STATE state = GET_TOKEN; + while(getline(f, line)) { + if(Util::startsWith(line, "#")) { + continue; + } + std::vector<std::string> tokens; + Util::split(line, std::back_inserter(tokens), " \t", true); + for(std::vector<std::string>::const_iterator iter = tokens.begin(); + iter != tokens.end(); ++iter) { + const std::string& token = *iter; + if(state == GET_TOKEN) { + if(token == Netrc::MACHINE) { + storeAuthenticator(authenticator); + authenticator.reset(new Authenticator()); + state = SET_MACHINE; + } else if(token == Netrc::DEFAULT) { + storeAuthenticator(authenticator); + authenticator.reset(new DefaultAuthenticator()); + } else { + if(authenticator.isNull()) { + throw DL_ABORT_EX + (StringFormat("Netrc:parse error. %s encounterd where 'machine'" + " or 'default' expected.", token.c_str()).str()); + } + if(token == Netrc::LOGIN) { + state = SET_LOGIN; + } else if(token == Netrc::PASSWORD) { + state = SET_PASSWORD; + } else if(token == Netrc::ACCOUNT) { + state = SET_ACCOUNT; + } else if(token == Netrc::MACDEF) { + state = SET_MACDEF; + } + } + } else { + if(state == SET_MACHINE) { + authenticator->setMachine(token); + } else if(state == SET_LOGIN) { + authenticator->setLogin(token); + } else if(state == SET_PASSWORD) { + authenticator->setPassword(token); + } else if(state == SET_ACCOUNT) { + authenticator->setAccount(token); + } else if(state == SET_MACDEF) { + skipMacdef(f); + } + state = GET_TOKEN; + } } } + if(state != GET_TOKEN) { + throw DL_ABORT_EX + ("Netrc:parse error. EOF reached where a token expected."); + } storeAuthenticator(authenticator); } |
