RPC code movement: separate out JSON-RPC execution logic from HTTP server logic

This commit is contained in:
Jeff Garzik 2014-06-04 11:38:33 -04:00
parent c912e22db0
commit 854d013012

View file

@ -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,
map<string, string>& mapHeaders,
bool fRun)
{ {
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);
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;
} }
} }