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 | |
| 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
| -rw-r--r-- | ChangeLog | 8 | ||||
| -rw-r--r-- | src/Netrc.cc | 99 | ||||
| -rw-r--r-- | src/Util.h | 31 | ||||
| -rw-r--r-- | test/NetrcTest.cc | 4 | ||||
| -rw-r--r-- | test/sample.netrc | 3 |
5 files changed, 108 insertions, 37 deletions
@@ -1,3 +1,11 @@ +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 + 2009-10-13 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net> Fixed typo 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); } @@ -140,6 +140,37 @@ public: static void slice(std::deque<std::string>& result, const std::string& src, char delim, bool trim = false); + template<typename OutputIterator> + static OutputIterator split(const std::string& src, OutputIterator out, + const std::string& delims, bool doTrim = false) + { + std::string::size_type p = 0; + while(1) { + std::string::size_type np = src.find_first_of(delims, p); + if(np == std::string::npos) { + std::string term = src.substr(p); + if(doTrim) { + term = trim(term); + } + if(!term.empty()) { + *out = term; + ++out; + } + break; + } + std::string term = src.substr(p, np-p); + if(doTrim) { + term = trim(term); + } + p = np+1; + if(!term.empty()) { + *out = term; + ++out; + } + } + return out; + } + static const std::string DEFAULT_TRIM_CHARSET; static std::string trim(const std::string& src, diff --git a/test/NetrcTest.cc b/test/NetrcTest.cc index 3af084f4..5c2d267c 100644 --- a/test/NetrcTest.cc +++ b/test/NetrcTest.cc @@ -1,8 +1,10 @@ #include "Netrc.h" -#include "Exception.h" + #include <iostream> #include <cppunit/extensions/HelperMacros.h> +#include "Exception.h" + namespace aria2 { class NetrcTest : public CppUnit::TestFixture { diff --git a/test/sample.netrc b/test/sample.netrc index 4df1a244..bdd1737b 100644 --- a/test/sample.netrc +++ b/test/sample.netrc @@ -1,3 +1,4 @@ +#sample netrc file for unit testing machine host1 login tujikawa password tujikawapassword @@ -9,5 +10,7 @@ machine host2 login aria2 password aria2password account aria2account +macdef init +#another comment line default login anonymous password ARIA2@USER account ARIA2@ACCT
\ No newline at end of file |
