Add support for parsing port in urls.

This commit is contained in:
Arthur Britto
2012-12-29 14:59:44 -08:00
parent 824a79da85
commit e91ce698f6
3 changed files with 29 additions and 12 deletions

View File

@@ -800,11 +800,13 @@ void UniqueNodeList::getIpsUrl(const RippleAddress& naNodePublic, section secSit
std::string strIpsUrl; std::string strIpsUrl;
std::string strScheme; std::string strScheme;
std::string strDomain; std::string strDomain;
int iPort;
std::string strPath; std::string strPath;
if (sectionSingleB(secSite, SECTION_IPS_URL, strIpsUrl) if (sectionSingleB(secSite, SECTION_IPS_URL, strIpsUrl)
&& !strIpsUrl.empty() && !strIpsUrl.empty()
&& parseUrl(strIpsUrl, strScheme, strDomain, strPath) && parseUrl(strIpsUrl, strScheme, strDomain, iPort, strPath)
&& -1 == iPort
&& strScheme == "https") && strScheme == "https")
{ {
HttpsClient::httpsGet( HttpsClient::httpsGet(
@@ -841,11 +843,13 @@ void UniqueNodeList::getValidatorsUrl(const RippleAddress& naNodePublic, section
std::string strValidatorsUrl; std::string strValidatorsUrl;
std::string strScheme; std::string strScheme;
std::string strDomain; std::string strDomain;
int iPort;
std::string strPath; std::string strPath;
if (sectionSingleB(secSite, SECTION_VALIDATORS_URL, strValidatorsUrl) if (sectionSingleB(secSite, SECTION_VALIDATORS_URL, strValidatorsUrl)
&& !strValidatorsUrl.empty() && !strValidatorsUrl.empty()
&& parseUrl(strValidatorsUrl, strScheme, strDomain, strPath) && parseUrl(strValidatorsUrl, strScheme, strDomain, iPort, strPath)
&& -1 == iPort
&& strScheme == "https") && strScheme == "https")
{ {
HttpsClient::httpsGet( HttpsClient::httpsGet(

View File

@@ -193,21 +193,27 @@ bool parseIpPort(const std::string& strSource, std::string& strIP, int& iPort)
return bValid; return bValid;
} }
bool parseUrl(const std::string& strUrl, std::string& strScheme, std::string& strDomain, std::string& strPath) bool parseUrl(const std::string& strUrl, std::string& strScheme, std::string& strDomain, int& iPort, std::string& strPath)
{ {
// scheme://username:password@hostname:port/rest // scheme://username:password@hostname:port/rest
static boost::regex reUrl("(?i)\\`\\s*([[:alpha:]][-+.[:alpha:][:digit:]]*)://([^/]+)(/.*)?\\s*?\\'"); static boost::regex reUrl("(?i)\\`\\s*([[:alpha:]][-+.[:alpha:][:digit:]]*)://([^:/]+)(?::(\\d+))?(/.*)?\\s*?\\'");
boost::smatch smMatch; boost::smatch smMatch;
bool bMatch = boost::regex_match(strUrl, smMatch, reUrl); // Match status code. bool bMatch = boost::regex_match(strUrl, smMatch, reUrl); // Match status code.
if (bMatch) if (bMatch)
{ {
std::string strPort;
strScheme = smMatch[1]; strScheme = smMatch[1];
strDomain = smMatch[2]; strDomain = smMatch[2];
strPath = smMatch[3]; strPort = smMatch[3];
strPath = smMatch[4];
boost::algorithm::to_lower(strScheme); boost::algorithm::to_lower(strScheme);
iPort = strPort.empty() ? -1 : lexical_cast_s<int>(strPort);
// std::cerr << strUrl << " : " << bMatch << " : '" << strDomain << "' : '" << strPort << "' : " << iPort << " : '" << strPath << "'" << std::endl;
} }
// std::cerr << strUrl << " : " << bMatch << " : '" << strDomain << "' : '" << strPath << "'" << std::endl; // std::cerr << strUrl << " : " << bMatch << " : '" << strDomain << "' : '" << strPath << "'" << std::endl;
@@ -296,9 +302,10 @@ BOOST_AUTO_TEST_CASE( ParseUrl )
{ {
std::string strScheme; std::string strScheme;
std::string strDomain; std::string strDomain;
int iPort;
std::string strPath; std::string strPath;
if (!parseUrl("lower://domain", strScheme, strDomain, strPath)) if (!parseUrl("lower://domain", strScheme, strDomain, iPort, strPath))
BOOST_FAIL("parseUrl: lower://domain failed"); BOOST_FAIL("parseUrl: lower://domain failed");
if (strScheme != "lower") if (strScheme != "lower")
@@ -307,19 +314,25 @@ BOOST_AUTO_TEST_CASE( ParseUrl )
if (strDomain != "domain") if (strDomain != "domain")
BOOST_FAIL("parseUrl: lower://domain : domain failed"); BOOST_FAIL("parseUrl: lower://domain : domain failed");
if (iPort != -1)
BOOST_FAIL("parseUrl: lower://domain : port failed");
if (strPath != "") if (strPath != "")
BOOST_FAIL("parseUrl: lower://domain : path failed"); BOOST_FAIL("parseUrl: lower://domain : path failed");
if (!parseUrl("UPPER://domain/", strScheme, strDomain, strPath)) if (!parseUrl("UPPER://domain:234/", strScheme, strDomain, iPort, strPath))
BOOST_FAIL("parseUrl: UPPER://domain/ failed"); BOOST_FAIL("parseUrl: UPPER://domain:234/ failed");
if (strScheme != "upper") if (strScheme != "upper")
BOOST_FAIL("parseUrl: UPPER://domain : scheme failed"); BOOST_FAIL("parseUrl: UPPER://domain:234/ : scheme failed");
if (iPort != 234)
BOOST_FAIL(boost::str(boost::format("parseUrl: UPPER://domain:234/ : port failed: %d") % iPort));
if (strPath != "/") if (strPath != "/")
BOOST_FAIL("parseUrl: UPPER://domain : scheme failed"); BOOST_FAIL("parseUrl: UPPER://domain:234/ : path failed");
if (!parseUrl("Mixed://domain/path", strScheme, strDomain, strPath)) if (!parseUrl("Mixed://domain/path", strScheme, strDomain, iPort, strPath))
BOOST_FAIL("parseUrl: Mixed://domain/path failed"); BOOST_FAIL("parseUrl: Mixed://domain/path failed");
if (strScheme != "mixed") if (strScheme != "mixed")

View File

@@ -265,7 +265,7 @@ template<typename T, typename U> T range_check_cast(const U& value, const T& min
return static_cast<T>(value); return static_cast<T>(value);
} }
bool parseUrl(const std::string& strUrl, std::string& strScheme, std::string& strDomain, std::string& strPath); bool parseUrl(const std::string& strUrl, std::string& strScheme, std::string& strDomain, int& iPort, std::string& strPath);
#endif #endif