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);