mirror of
https://github.com/XRPLF/clio.git
synced 2026-04-29 15:37:53 +00:00
@@ -130,19 +130,12 @@ private:
|
||||
/// server_info
|
||||
std::chrono::time_point<std::chrono::system_clock> lastPublish_;
|
||||
|
||||
mutable std::mutex publishTimeMtx_;
|
||||
|
||||
std::chrono::time_point<std::chrono::system_clock>
|
||||
getLastPublish() const
|
||||
{
|
||||
std::unique_lock<std::mutex> lck(publishTimeMtx_);
|
||||
return lastPublish_;
|
||||
}
|
||||
mutable std::shared_mutex publishTimeMtx_;
|
||||
|
||||
void
|
||||
setLastPublish()
|
||||
{
|
||||
std::unique_lock<std::mutex> lck(publishTimeMtx_);
|
||||
std::unique_lock lck(publishTimeMtx_);
|
||||
lastPublish_ = std::chrono::system_clock::now();
|
||||
}
|
||||
|
||||
@@ -322,13 +315,25 @@ public:
|
||||
result["read_only"] = readOnly_;
|
||||
auto last = getLastPublish();
|
||||
if (last.time_since_epoch().count() != 0)
|
||||
result["last_publish_age_seconds"] = std::to_string(
|
||||
std::chrono::duration_cast<std::chrono::seconds>(
|
||||
std::chrono::system_clock::now() - getLastPublish())
|
||||
.count());
|
||||
|
||||
result["last_publish_age_seconds"] =
|
||||
std::to_string(lastPublishAgeSeconds());
|
||||
return result;
|
||||
}
|
||||
|
||||
std::chrono::time_point<std::chrono::system_clock>
|
||||
getLastPublish() const
|
||||
{
|
||||
std::shared_lock lck(publishTimeMtx_);
|
||||
return lastPublish_;
|
||||
}
|
||||
|
||||
std::uint32_t
|
||||
lastPublishAgeSeconds() const
|
||||
{
|
||||
return std::chrono::duration_cast<std::chrono::seconds>(
|
||||
std::chrono::system_clock::now() - getLastPublish())
|
||||
.count();
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -405,9 +405,25 @@ handle_request(
|
||||
responseStr = boost::json::serialize(response);
|
||||
}
|
||||
|
||||
auto warningFlag = false;
|
||||
boost::json::array warnings;
|
||||
if (!dosGuard.add(ip, responseStr.size()))
|
||||
result["warning"] = "Too many requests";
|
||||
|
||||
{
|
||||
warnings.emplace_back("Too many requests");
|
||||
warningFlag = true;
|
||||
}
|
||||
auto lastPublishAge = context->etl->lastPublishAgeSeconds();
|
||||
if (lastPublishAge >= 60)
|
||||
{
|
||||
warnings.emplace_back("This server may be out of date");
|
||||
warningFlag = true;
|
||||
}
|
||||
// reserialize only if a warning was appended.
|
||||
if (warningFlag)
|
||||
{
|
||||
result["warning"] = warnings;
|
||||
responseStr = boost::json::serialize(response);
|
||||
}
|
||||
return send(
|
||||
httpResponse(http::status::ok, "application/json", responseStr));
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
|
||||
#include <backend/BackendInterface.h>
|
||||
#include <etl/ETLSource.h>
|
||||
#include <etl/ReportingETL.h>
|
||||
#include <rpc/Counters.h>
|
||||
#include <rpc/RPC.h>
|
||||
#include <subscriptions/Message.h>
|
||||
@@ -322,7 +323,27 @@ public:
|
||||
}
|
||||
|
||||
std::string responseStr = boost::json::serialize(response);
|
||||
dosGuard_.add(*ip, responseStr.size());
|
||||
boost::json::array warnings;
|
||||
auto warningFlag = false;
|
||||
|
||||
if (!dosGuard_.add(*ip, responseStr.size()))
|
||||
{
|
||||
warnings.emplace_back("Too many requests");
|
||||
warningFlag = true;
|
||||
}
|
||||
auto lastPublishAge = etl_->lastPublishAgeSeconds();
|
||||
if (lastPublishAge >= 60)
|
||||
{
|
||||
warnings.emplace_back("This server may be out of date");
|
||||
warningFlag = true;
|
||||
}
|
||||
// reserialize if a warning was appended
|
||||
if (warningFlag)
|
||||
{
|
||||
auto& result = response["result"].as_object();
|
||||
result["warning"] = warnings;
|
||||
responseStr = boost::json::serialize(response);
|
||||
}
|
||||
send(std::move(responseStr));
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user