Simplify logic of REST request suffix parsing.

This patch changes the way the suffix (giving the requested data format) is
parsed for REST requests.  Before, the string was split at '.'
characters and it was assumed that the second part was the suffix.

Now, we look for the last dot and use that to determine the suffix.
This allows for strings that contain dots (not used now, though), and
seems, in general, to be clearer and more intuitive.
This commit is contained in:
Daniel Kraft 2015-09-07 20:38:03 +02:00
parent 536207f316
commit 9cdc3353c5

View file

@ -71,15 +71,24 @@ static bool RESTERR(HTTPRequest* req, enum HTTPStatusCode status, string message
return false; return false;
} }
static enum RetFormat ParseDataFormat(vector<string>& params, const string& strReq) static enum RetFormat ParseDataFormat(std::string& param, const std::string& strReq)
{ {
boost::split(params, strReq, boost::is_any_of(".")); const std::string::size_type pos = strReq.rfind('.');
if (params.size() > 1) { if (pos == std::string::npos)
for (unsigned int i = 0; i < ARRAYLEN(rf_names); i++) {
if (params[1] == rf_names[i].name) param = strReq;
return rf_names[i].rf; return rf_names[0].rf;
} }
param = strReq.substr(0, pos);
const std::string suff(strReq, pos + 1);
for (unsigned int i = 0; i < ARRAYLEN(rf_names); i++)
if (suff == rf_names[i].name)
return rf_names[i].rf;
/* If no suffix is found, return original string. */
param = strReq;
return rf_names[0].rf; return rf_names[0].rf;
} }
@ -121,10 +130,10 @@ static bool rest_headers(HTTPRequest* req,
{ {
if (!CheckWarmup(req)) if (!CheckWarmup(req))
return false; return false;
vector<string> params; std::string param;
const RetFormat rf = ParseDataFormat(params, strURIPart); const RetFormat rf = ParseDataFormat(param, strURIPart);
vector<string> path; vector<string> path;
boost::split(path, params[0], boost::is_any_of("/")); boost::split(path, param, boost::is_any_of("/"));
if (path.size() != 2) if (path.size() != 2)
return RESTERR(req, HTTP_BAD_REQUEST, "No header count specified. Use /rest/headers/<count>/<hash>.<ext>."); return RESTERR(req, HTTP_BAD_REQUEST, "No header count specified. Use /rest/headers/<count>/<hash>.<ext>.");
@ -196,10 +205,9 @@ static bool rest_block(HTTPRequest* req,
{ {
if (!CheckWarmup(req)) if (!CheckWarmup(req))
return false; return false;
vector<string> params; std::string hashStr;
const RetFormat rf = ParseDataFormat(params, strURIPart); const RetFormat rf = ParseDataFormat(hashStr, strURIPart);
string hashStr = params[0];
uint256 hash; uint256 hash;
if (!ParseHashStr(hashStr, hash)) if (!ParseHashStr(hashStr, hash))
return RESTERR(req, HTTP_BAD_REQUEST, "Invalid hash: " + hashStr); return RESTERR(req, HTTP_BAD_REQUEST, "Invalid hash: " + hashStr);
@ -268,8 +276,8 @@ static bool rest_chaininfo(HTTPRequest* req, const std::string& strURIPart)
{ {
if (!CheckWarmup(req)) if (!CheckWarmup(req))
return false; return false;
vector<string> params; std::string param;
const RetFormat rf = ParseDataFormat(params, strURIPart); const RetFormat rf = ParseDataFormat(param, strURIPart);
switch (rf) { switch (rf) {
case RF_JSON: { case RF_JSON: {
@ -293,8 +301,8 @@ static bool rest_mempool_info(HTTPRequest* req, const std::string& strURIPart)
{ {
if (!CheckWarmup(req)) if (!CheckWarmup(req))
return false; return false;
vector<string> params; std::string param;
const RetFormat rf = ParseDataFormat(params, strURIPart); const RetFormat rf = ParseDataFormat(param, strURIPart);
switch (rf) { switch (rf) {
case RF_JSON: { case RF_JSON: {
@ -318,8 +326,8 @@ static bool rest_mempool_contents(HTTPRequest* req, const std::string& strURIPar
{ {
if (!CheckWarmup(req)) if (!CheckWarmup(req))
return false; return false;
vector<string> params; std::string param;
const RetFormat rf = ParseDataFormat(params, strURIPart); const RetFormat rf = ParseDataFormat(param, strURIPart);
switch (rf) { switch (rf) {
case RF_JSON: { case RF_JSON: {
@ -343,10 +351,9 @@ static bool rest_tx(HTTPRequest* req, const std::string& strURIPart)
{ {
if (!CheckWarmup(req)) if (!CheckWarmup(req))
return false; return false;
vector<string> params; std::string hashStr;
const RetFormat rf = ParseDataFormat(params, strURIPart); const RetFormat rf = ParseDataFormat(hashStr, strURIPart);
string hashStr = params[0];
uint256 hash; uint256 hash;
if (!ParseHashStr(hashStr, hash)) if (!ParseHashStr(hashStr, hash))
return RESTERR(req, HTTP_BAD_REQUEST, "Invalid hash: " + hashStr); return RESTERR(req, HTTP_BAD_REQUEST, "Invalid hash: " + hashStr);
@ -396,13 +403,13 @@ static bool rest_getutxos(HTTPRequest* req, const std::string& strURIPart)
{ {
if (!CheckWarmup(req)) if (!CheckWarmup(req))
return false; return false;
vector<string> params; std::string param;
enum RetFormat rf = ParseDataFormat(params, strURIPart); const RetFormat rf = ParseDataFormat(param, strURIPart);
vector<string> uriParts; vector<string> uriParts;
if (params.size() > 0 && params[0].length() > 1) if (param.length() > 1)
{ {
std::string strUriParams = params[0].substr(1); std::string strUriParams = param.substr(1);
boost::split(uriParts, strUriParams, boost::is_any_of("/")); boost::split(uriParts, strUriParams, boost::is_any_of("/"));
} }