|
|
@ -809,33 +809,18 @@ static string JSONRPCExecBatch(const Array& vReq)
|
|
|
|
return write_string(Value(ret), false) + "\n";
|
|
|
|
return write_string(Value(ret), false) + "\n";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void ServiceConnection(AcceptedConnection *conn)
|
|
|
|
static bool HTTPReq_JSONRPC(AcceptedConnection *conn,
|
|
|
|
{
|
|
|
|
string& strRequest,
|
|
|
|
bool fRun = true;
|
|
|
|
map<string, string>& mapHeaders,
|
|
|
|
while (fRun && !ShutdownRequested())
|
|
|
|
bool fRun)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
int nProto = 0;
|
|
|
|
|
|
|
|
map<string, string> mapHeaders;
|
|
|
|
|
|
|
|
string strRequest, strMethod, strURI;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Read HTTP request line
|
|
|
|
|
|
|
|
if (!ReadHTTPRequestLine(conn->stream(), nProto, strMethod, strURI))
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Read HTTP message headers and body
|
|
|
|
|
|
|
|
ReadHTTPMessage(conn->stream(), mapHeaders, strRequest, nProto);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (strURI != "/") {
|
|
|
|
|
|
|
|
conn->stream() << HTTPReply(HTTP_NOT_FOUND, "", false) << std::flush;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Check authorization
|
|
|
|
// Check authorization
|
|
|
|
if (mapHeaders.count("authorization") == 0)
|
|
|
|
if (mapHeaders.count("authorization") == 0)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
conn->stream() << HTTPReply(HTTP_UNAUTHORIZED, "", false) << std::flush;
|
|
|
|
conn->stream() << HTTPReply(HTTP_UNAUTHORIZED, "", false) << std::flush;
|
|
|
|
break;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (!HTTPAuthorized(mapHeaders))
|
|
|
|
if (!HTTPAuthorized(mapHeaders))
|
|
|
|
{
|
|
|
|
{
|
|
|
|
LogPrintf("ThreadRPCServer incorrect password attempt from %s\n", conn->peer_address_to_string());
|
|
|
|
LogPrintf("ThreadRPCServer incorrect password attempt from %s\n", conn->peer_address_to_string());
|
|
|
@ -846,10 +831,8 @@ void ServiceConnection(AcceptedConnection *conn)
|
|
|
|
MilliSleep(250);
|
|
|
|
MilliSleep(250);
|
|
|
|
|
|
|
|
|
|
|
|
conn->stream() << HTTPReply(HTTP_UNAUTHORIZED, "", false) << std::flush;
|
|
|
|
conn->stream() << HTTPReply(HTTP_UNAUTHORIZED, "", false) << std::flush;
|
|
|
|
break;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (mapHeaders["connection"] == "close")
|
|
|
|
|
|
|
|
fRun = false;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
JSONRequest jreq;
|
|
|
|
JSONRequest jreq;
|
|
|
|
try
|
|
|
|
try
|
|
|
@ -881,11 +864,43 @@ void ServiceConnection(AcceptedConnection *conn)
|
|
|
|
catch (Object& objError)
|
|
|
|
catch (Object& objError)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
ErrorReply(conn->stream(), objError, jreq.id);
|
|
|
|
ErrorReply(conn->stream(), objError, jreq.id);
|
|
|
|
break;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (std::exception& e)
|
|
|
|
catch (std::exception& e)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
ErrorReply(conn->stream(), JSONRPCError(RPC_PARSE_ERROR, e.what()), jreq.id);
|
|
|
|
ErrorReply(conn->stream(), JSONRPCError(RPC_PARSE_ERROR, e.what()), jreq.id);
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void ServiceConnection(AcceptedConnection *conn)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
bool fRun = true;
|
|
|
|
|
|
|
|
while (fRun && !ShutdownRequested())
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
int nProto = 0;
|
|
|
|
|
|
|
|
map<string, string> mapHeaders;
|
|
|
|
|
|
|
|
string strRequest, strMethod, strURI;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Read HTTP request line
|
|
|
|
|
|
|
|
if (!ReadHTTPRequestLine(conn->stream(), nProto, strMethod, strURI))
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Read HTTP message headers and body
|
|
|
|
|
|
|
|
ReadHTTPMessage(conn->stream(), mapHeaders, strRequest, nProto);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// HTTP Keep-Alive is false; close connection immediately
|
|
|
|
|
|
|
|
if (mapHeaders["connection"] == "close")
|
|
|
|
|
|
|
|
fRun = false;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (strURI == "/") {
|
|
|
|
|
|
|
|
if (!HTTPReq_JSONRPC(conn, strRequest, mapHeaders, fRun))
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
else {
|
|
|
|
|
|
|
|
conn->stream() << HTTPReply(HTTP_NOT_FOUND, "", false) << std::flush;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|