mirror of https://github.com/aria2/aria2
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.netrcpull/1/head
parent
ac63a32c48
commit
10e371c25a
|
@ -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>
|
2009-10-13 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
|
||||||
|
|
||||||
Fixed typo
|
Fixed typo
|
||||||
|
|
99
src/Netrc.cc
99
src/Netrc.cc
|
@ -36,10 +36,12 @@
|
||||||
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include "DlAbortEx.h"
|
#include "DlAbortEx.h"
|
||||||
#include "StringFormat.h"
|
#include "StringFormat.h"
|
||||||
#include "A2STR.h"
|
#include "A2STR.h"
|
||||||
|
#include "Util.h"
|
||||||
|
|
||||||
namespace aria2 {
|
namespace aria2 {
|
||||||
|
|
||||||
|
@ -55,21 +57,9 @@ const std::string Netrc::ACCOUNT("account");
|
||||||
|
|
||||||
const std::string Netrc::MACDEF("macdef");
|
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
|
void Netrc::skipMacdef(std::ifstream& f) const
|
||||||
{
|
{
|
||||||
std::string line;
|
std::string line;
|
||||||
getline(f, line);
|
|
||||||
while(getline(f, line)) {
|
while(getline(f, line)) {
|
||||||
if(line == A2STR::CR_C || line.empty()) {
|
if(line == A2STR::CR_C || line.empty()) {
|
||||||
break;
|
break;
|
||||||
|
@ -87,32 +77,69 @@ void Netrc::parse(const std::string& path)
|
||||||
(StringFormat("File not found: %s", path.c_str()).str());
|
(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;
|
AuthenticatorHandle authenticator;
|
||||||
std::string token;
|
std::string line;
|
||||||
while(f >> token) {
|
STATE state = GET_TOKEN;
|
||||||
if(token == Netrc::MACHINE) {
|
while(getline(f, line)) {
|
||||||
storeAuthenticator(authenticator);
|
if(Util::startsWith(line, "#")) {
|
||||||
authenticator.reset(new Authenticator());
|
continue;
|
||||||
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::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);
|
storeAuthenticator(authenticator);
|
||||||
}
|
}
|
||||||
|
|
31
src/Util.h
31
src/Util.h
|
@ -140,6 +140,37 @@ public:
|
||||||
static void slice(std::deque<std::string>& result, const std::string& src,
|
static void slice(std::deque<std::string>& result, const std::string& src,
|
||||||
char delim, bool trim = false);
|
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 const std::string DEFAULT_TRIM_CHARSET;
|
||||||
|
|
||||||
static std::string trim(const std::string& src,
|
static std::string trim(const std::string& src,
|
||||||
|
|
|
@ -1,8 +1,10 @@
|
||||||
#include "Netrc.h"
|
#include "Netrc.h"
|
||||||
#include "Exception.h"
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <cppunit/extensions/HelperMacros.h>
|
#include <cppunit/extensions/HelperMacros.h>
|
||||||
|
|
||||||
|
#include "Exception.h"
|
||||||
|
|
||||||
namespace aria2 {
|
namespace aria2 {
|
||||||
|
|
||||||
class NetrcTest : public CppUnit::TestFixture {
|
class NetrcTest : public CppUnit::TestFixture {
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
#sample netrc file for unit testing
|
||||||
machine host1
|
machine host1
|
||||||
login tujikawa
|
login tujikawa
|
||||||
password tujikawapassword
|
password tujikawapassword
|
||||||
|
@ -9,5 +10,7 @@ machine host2
|
||||||
login aria2
|
login aria2
|
||||||
password aria2password
|
password aria2password
|
||||||
account aria2account
|
account aria2account
|
||||||
|
macdef init
|
||||||
|
|
||||||
|
#another comment line
|
||||||
default login anonymous password ARIA2@USER account ARIA2@ACCT
|
default login anonymous password ARIA2@USER account ARIA2@ACCT
|
Loading…
Reference in New Issue