فهرست منبع

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 13 سال پیش
والد
کامیت
afcd95dec7
3فایلهای تغییر یافته به همراه24 افزوده شده و 2 حذف شده
  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);