Explorar el Código

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.
Tatsuhiro Tsujikawa hace 13 años
padre
commit
afcd95dec7
Se han modificado 3 ficheros con 24 adiciones y 2 borrados
  1. 18 2
      src/HttpServerBodyCommand.cc
  2. 4 0
      src/RpcRequest.cc
  3. 2 0
      src/RpcRequest.h

+ 18 - 2
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 {

+ 4 - 0
src/RpcRequest.cc

@@ -38,6 +38,10 @@ namespace aria2 {
 
 namespace rpc {
 
+RpcRequest::RpcRequest()
+  : jsonRpc(false)
+{}
+
 RpcRequest::RpcRequest(const std::string& methodName,
                        const SharedHandle<List>& params)
   : methodName(methodName), params(params), jsonRpc(false)

+ 2 - 0
src/RpcRequest.h

@@ -51,6 +51,8 @@ struct RpcRequest {
   SharedHandle<ValueBase> id;
   bool jsonRpc;
 
+  RpcRequest();
+
   RpcRequest(const std::string& methodName,
              const SharedHandle<List>& params);