mirror of
https://github.com/rakshasa/rtorrent.git
synced 2026-10-19 07:36:16 +00:00
Answer an oversized RPC response with a fault
Cap XML-RPC and JSON-RPC output at the SCGI response limit before handing it over.
This commit is contained in:
@@ -13,6 +13,7 @@
|
||||
#include "rpc/command_map.h"
|
||||
#include "rpc/nlohmann/json.h"
|
||||
#include "rpc/parse_commands.h"
|
||||
#include "rpc/scgi_task.h"
|
||||
#include "torrent/exceptions.h"
|
||||
#include "torrent/object.h"
|
||||
#include "utils/functional.h"
|
||||
@@ -264,6 +265,13 @@ JsonRpc::process(const char* in_buffer, uint32_t length, slot_write callback) {
|
||||
|
||||
std::string response_str = response.dump();
|
||||
|
||||
if (response_str.size() > SCgiTask::max_response_size) {
|
||||
const auto& id = response.is_object() && response.contains("id") ? response["id"] : json(nullptr);
|
||||
auto err_str = json_error(JSONRPC_INTERNAL_ERROR, "response size exceeds maximum RPC limit", id).dump();
|
||||
|
||||
return callback(err_str.c_str(), err_str.size());
|
||||
}
|
||||
|
||||
return callback(response_str.c_str(), response_str.size());
|
||||
|
||||
} catch (json::exception& e) {
|
||||
|
||||
Reference in New Issue
Block a user