rest.cpp: change HTTP_INTERNAL_SERVER_ERROR to HTTP_BAD_REQUEST
This commit is contained in:
parent
84decb54f2
commit
f012a857f5
3 changed files with 16 additions and 12 deletions
|
@ -59,6 +59,10 @@ git merge commit are mentioned.
|
||||||
|
|
||||||
### RPC and REST
|
### RPC and REST
|
||||||
|
|
||||||
|
UTXO set query (`GET /rest/getutxos/<checkmempool>/<txid>-<n>/<txid>-<n>/.../<txid>-<n>.<bin|hex|json>`) responses
|
||||||
|
were changed to return status code HTTP_BAD_REQUEST (400) instead of HTTP_INTERNAL_SERVER_ERROR (500) when requests
|
||||||
|
contain invalid parameters.
|
||||||
|
|
||||||
### Configuration and command-line options
|
### Configuration and command-line options
|
||||||
|
|
||||||
### Block and transaction handling
|
### Block and transaction handling
|
||||||
|
|
|
@ -179,14 +179,14 @@ class RESTTest (BitcoinTestFramework):
|
||||||
#do some invalid requests
|
#do some invalid requests
|
||||||
json_request = '{"checkmempool'
|
json_request = '{"checkmempool'
|
||||||
response = http_post_call(url.hostname, url.port, '/rest/getutxos'+self.FORMAT_SEPARATOR+'json', json_request, True)
|
response = http_post_call(url.hostname, url.port, '/rest/getutxos'+self.FORMAT_SEPARATOR+'json', json_request, True)
|
||||||
assert_equal(response.status, 500) #must be a 500 because we send a invalid json request
|
assert_equal(response.status, 400) #must be a 400 because we send a invalid json request
|
||||||
|
|
||||||
json_request = '{"checkmempool'
|
json_request = '{"checkmempool'
|
||||||
response = http_post_call(url.hostname, url.port, '/rest/getutxos'+self.FORMAT_SEPARATOR+'bin', json_request, True)
|
response = http_post_call(url.hostname, url.port, '/rest/getutxos'+self.FORMAT_SEPARATOR+'bin', json_request, True)
|
||||||
assert_equal(response.status, 500) #must be a 500 because we send a invalid bin request
|
assert_equal(response.status, 400) #must be a 400 because we send a invalid bin request
|
||||||
|
|
||||||
response = http_post_call(url.hostname, url.port, '/rest/getutxos/checkmempool'+self.FORMAT_SEPARATOR+'bin', '', True)
|
response = http_post_call(url.hostname, url.port, '/rest/getutxos/checkmempool'+self.FORMAT_SEPARATOR+'bin', '', True)
|
||||||
assert_equal(response.status, 500) #must be a 500 because we send a invalid bin request
|
assert_equal(response.status, 400) #must be a 400 because we send a invalid bin request
|
||||||
|
|
||||||
#test limits
|
#test limits
|
||||||
json_request = '/checkmempool/'
|
json_request = '/checkmempool/'
|
||||||
|
@ -194,14 +194,14 @@ class RESTTest (BitcoinTestFramework):
|
||||||
json_request += txid+'-'+str(n)+'/'
|
json_request += txid+'-'+str(n)+'/'
|
||||||
json_request = json_request.rstrip("/")
|
json_request = json_request.rstrip("/")
|
||||||
response = http_post_call(url.hostname, url.port, '/rest/getutxos'+json_request+self.FORMAT_SEPARATOR+'json', '', True)
|
response = http_post_call(url.hostname, url.port, '/rest/getutxos'+json_request+self.FORMAT_SEPARATOR+'json', '', True)
|
||||||
assert_equal(response.status, 500) #must be a 500 because we exceeding the limits
|
assert_equal(response.status, 400) #must be a 400 because we exceeding the limits
|
||||||
|
|
||||||
json_request = '/checkmempool/'
|
json_request = '/checkmempool/'
|
||||||
for x in range(0, 15):
|
for x in range(0, 15):
|
||||||
json_request += txid+'-'+str(n)+'/'
|
json_request += txid+'-'+str(n)+'/'
|
||||||
json_request = json_request.rstrip("/")
|
json_request = json_request.rstrip("/")
|
||||||
response = http_post_call(url.hostname, url.port, '/rest/getutxos'+json_request+self.FORMAT_SEPARATOR+'json', '', True)
|
response = http_post_call(url.hostname, url.port, '/rest/getutxos'+json_request+self.FORMAT_SEPARATOR+'json', '', True)
|
||||||
assert_equal(response.status, 200) #must be a 500 because we exceeding the limits
|
assert_equal(response.status, 200) #must be a 200 because we are within the limits
|
||||||
|
|
||||||
self.nodes[0].generate(1) #generate block to not affect upcoming tests
|
self.nodes[0].generate(1) #generate block to not affect upcoming tests
|
||||||
self.sync_all()
|
self.sync_all()
|
||||||
|
|
14
src/rest.cpp
14
src/rest.cpp
|
@ -420,7 +420,7 @@ static bool rest_getutxos(HTTPRequest* req, const std::string& strURIPart)
|
||||||
// throw exception in case of a empty request
|
// throw exception in case of a empty request
|
||||||
std::string strRequestMutable = req->ReadBody();
|
std::string strRequestMutable = req->ReadBody();
|
||||||
if (strRequestMutable.length() == 0 && uriParts.size() == 0)
|
if (strRequestMutable.length() == 0 && uriParts.size() == 0)
|
||||||
return RESTERR(req, HTTP_INTERNAL_SERVER_ERROR, "Error: empty request");
|
return RESTERR(req, HTTP_BAD_REQUEST, "Error: empty request");
|
||||||
|
|
||||||
bool fInputParsed = false;
|
bool fInputParsed = false;
|
||||||
bool fCheckMemPool = false;
|
bool fCheckMemPool = false;
|
||||||
|
@ -444,7 +444,7 @@ static bool rest_getutxos(HTTPRequest* req, const std::string& strURIPart)
|
||||||
std::string strOutput = uriParts[i].substr(uriParts[i].find("-")+1);
|
std::string strOutput = uriParts[i].substr(uriParts[i].find("-")+1);
|
||||||
|
|
||||||
if (!ParseInt32(strOutput, &nOutput) || !IsHex(strTxid))
|
if (!ParseInt32(strOutput, &nOutput) || !IsHex(strTxid))
|
||||||
return RESTERR(req, HTTP_INTERNAL_SERVER_ERROR, "Parse error");
|
return RESTERR(req, HTTP_BAD_REQUEST, "Parse error");
|
||||||
|
|
||||||
txid.SetHex(strTxid);
|
txid.SetHex(strTxid);
|
||||||
vOutPoints.push_back(COutPoint(txid, (uint32_t)nOutput));
|
vOutPoints.push_back(COutPoint(txid, (uint32_t)nOutput));
|
||||||
|
@ -453,7 +453,7 @@ static bool rest_getutxos(HTTPRequest* req, const std::string& strURIPart)
|
||||||
if (vOutPoints.size() > 0)
|
if (vOutPoints.size() > 0)
|
||||||
fInputParsed = true;
|
fInputParsed = true;
|
||||||
else
|
else
|
||||||
return RESTERR(req, HTTP_INTERNAL_SERVER_ERROR, "Error: empty request");
|
return RESTERR(req, HTTP_BAD_REQUEST, "Error: empty request");
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (rf) {
|
switch (rf) {
|
||||||
|
@ -469,7 +469,7 @@ static bool rest_getutxos(HTTPRequest* req, const std::string& strURIPart)
|
||||||
if (strRequestMutable.size() > 0)
|
if (strRequestMutable.size() > 0)
|
||||||
{
|
{
|
||||||
if (fInputParsed) //don't allow sending input over URI and HTTP RAW DATA
|
if (fInputParsed) //don't allow sending input over URI and HTTP RAW DATA
|
||||||
return RESTERR(req, HTTP_INTERNAL_SERVER_ERROR, "Combination of URI scheme inputs and raw post data is not allowed");
|
return RESTERR(req, HTTP_BAD_REQUEST, "Combination of URI scheme inputs and raw post data is not allowed");
|
||||||
|
|
||||||
CDataStream oss(SER_NETWORK, PROTOCOL_VERSION);
|
CDataStream oss(SER_NETWORK, PROTOCOL_VERSION);
|
||||||
oss << strRequestMutable;
|
oss << strRequestMutable;
|
||||||
|
@ -478,14 +478,14 @@ static bool rest_getutxos(HTTPRequest* req, const std::string& strURIPart)
|
||||||
}
|
}
|
||||||
} catch (const std::ios_base::failure& e) {
|
} catch (const std::ios_base::failure& e) {
|
||||||
// abort in case of unreadable binary data
|
// abort in case of unreadable binary data
|
||||||
return RESTERR(req, HTTP_INTERNAL_SERVER_ERROR, "Parse error");
|
return RESTERR(req, HTTP_BAD_REQUEST, "Parse error");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case RF_JSON: {
|
case RF_JSON: {
|
||||||
if (!fInputParsed)
|
if (!fInputParsed)
|
||||||
return RESTERR(req, HTTP_INTERNAL_SERVER_ERROR, "Error: empty request");
|
return RESTERR(req, HTTP_BAD_REQUEST, "Error: empty request");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default: {
|
default: {
|
||||||
|
@ -495,7 +495,7 @@ static bool rest_getutxos(HTTPRequest* req, const std::string& strURIPart)
|
||||||
|
|
||||||
// limit max outpoints
|
// limit max outpoints
|
||||||
if (vOutPoints.size() > MAX_GETUTXOS_OUTPOINTS)
|
if (vOutPoints.size() > MAX_GETUTXOS_OUTPOINTS)
|
||||||
return RESTERR(req, HTTP_INTERNAL_SERVER_ERROR, strprintf("Error: max outpoints exceeded (max: %d, tried: %d)", MAX_GETUTXOS_OUTPOINTS, vOutPoints.size()));
|
return RESTERR(req, HTTP_BAD_REQUEST, strprintf("Error: max outpoints exceeded (max: %d, tried: %d)", MAX_GETUTXOS_OUTPOINTS, vOutPoints.size()));
|
||||||
|
|
||||||
// check spentness and form a bitmap (as well as a JSON capable human-readable string representation)
|
// check spentness and form a bitmap (as well as a JSON capable human-readable string representation)
|
||||||
vector<unsigned char> bitmap;
|
vector<unsigned char> bitmap;
|
||||||
|
|
Loading…
Reference in a new issue