diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2012-05-19 18:36:57 +0900 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2012-05-19 18:36:57 +0900 |
| commit | afcd95dec7667b2566f37648ffb6c709a337ea86 (patch) | |
| tree | 349d688d09c9a5c5d8ec1f6869c1fd78dbd02060 /src/HttpServerBodyCommand.cc | |
| parent | 8ebba32fd9e417f9adb6511255216971b0591a72 (diff) | |
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.
Diffstat (limited to 'src/HttpServerBodyCommand.cc')
| -rw-r--r-- | src/HttpServerBodyCommand.cc | 20 |
1 files changed, 18 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<rpc::RpcMethod> 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 { |
