summaryrefslogtreecommitdiff
path: root/src/HttpServerBodyCommand.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2012-05-19 18:36:57 +0900
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2012-05-19 18:36:57 +0900
commitafcd95dec7667b2566f37648ffb6c709a337ea86 (patch)
tree349d688d09c9a5c5d8ec1f6869c1fd78dbd02060 /src/HttpServerBodyCommand.cc
parent8ebba32fd9e417f9adb6511255216971b0591a72 (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.cc20
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 {