From afcd95dec7667b2566f37648ffb6c709a337ea86 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Sat, 19 May 2012 18:36:57 +0900 Subject: [PATCH] Return appropriate HTTP status code on RPC failure. In this change, we return 404 if the request path is neither /json-rpc nor /rpc. If XML feature is not enabled and /rpc is requested, return 404. If XML parser failed, return 400. JSON parser failure has been handled well in the existing code. --- src/HttpServerBodyCommand.cc | 20 ++++++++++++++++++-- src/RpcRequest.cc | 4 ++++ src/RpcRequest.h | 2 ++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/HttpServerBodyCommand.cc b/src/HttpServerBodyCommand.cc index d420d788..8f932090 100644 --- a/src/HttpServerBodyCommand.cc +++ b/src/HttpServerBodyCommand.cc @@ -163,7 +163,18 @@ bool HttpServerBodyCommand::execute() if(reqPath == "/rpc") { #ifdef ENABLE_XML_RPC std::string body = httpServer_->getBody(); - rpc::RpcRequest req = rpc::xmlParseMemory(body.c_str(), body.size()); + rpc::RpcRequest req; + try { + req = rpc::xmlParseMemory(body.c_str(), body.size()); + } catch(RecoverableException& e) { + A2_LOG_INFO_EX + (fmt("CUID#%lld - Failed to parse XML-RPC request", + getCuid()), + e); + httpServer_->feedResponse(400); + addHttpServerResponseCommand(); + return true; + } SharedHandle method = rpc::RpcMethodFactory::create(req.methodName); A2_LOG_INFO(fmt("Executing RPC method %s", req.methodName.c_str())); @@ -172,7 +183,10 @@ bool HttpServerBodyCommand::execute() std::string responseData = rpc::toXml(res, gzip); httpServer_->feedResponse(responseData, "text/xml"); addHttpServerResponseCommand(); -#endif // ENABLE_XML_RPC +#else // !ENABLE_XML_RPC + httpServer_->feedResponse(404); + addHttpServerResponseCommand(); +#endif // !ENABLE_XML_RPC return true; } else if(reqPath == "/jsonrpc") { std::string callback; @@ -223,6 +237,8 @@ bool HttpServerBodyCommand::execute() } return true; } else { + httpServer_->feedResponse(404); + addHttpServerResponseCommand(); return true; } } else { diff --git a/src/RpcRequest.cc b/src/RpcRequest.cc index 337e1eee..7b857965 100644 --- a/src/RpcRequest.cc +++ b/src/RpcRequest.cc @@ -38,6 +38,10 @@ namespace aria2 { namespace rpc { +RpcRequest::RpcRequest() + : jsonRpc(false) +{} + RpcRequest::RpcRequest(const std::string& methodName, const SharedHandle& params) : methodName(methodName), params(params), jsonRpc(false) diff --git a/src/RpcRequest.h b/src/RpcRequest.h index 350d56e6..a6017708 100644 --- a/src/RpcRequest.h +++ b/src/RpcRequest.h @@ -51,6 +51,8 @@ struct RpcRequest { SharedHandle id; bool jsonRpc; + RpcRequest(); + RpcRequest(const std::string& methodName, const SharedHandle& params);