71 lines
1.9 KiB
C
71 lines
1.9 KiB
C
|
#pragma once
|
||
|
#include <drogon/exports.h>
|
||
|
#include <memory>
|
||
|
#include <chrono>
|
||
|
#include <mutex>
|
||
|
#include <string>
|
||
|
|
||
|
namespace drogon
|
||
|
{
|
||
|
enum class DROGON_EXPORT RateLimiterType
|
||
|
{
|
||
|
kFixedWindow,
|
||
|
kSlidingWindow,
|
||
|
kTokenBucket
|
||
|
};
|
||
|
inline RateLimiterType stringToRateLimiterType(const std::string &type)
|
||
|
{
|
||
|
if (type == std::string("fixedWindow") || type == std::string("fixed_window"))
|
||
|
return RateLimiterType::kFixedWindow;
|
||
|
else if (type == std::string("slidingWindow") || type == std::string("sliding_window"))
|
||
|
return RateLimiterType::kSlidingWindow;
|
||
|
return RateLimiterType::kTokenBucket;
|
||
|
}
|
||
|
class DROGON_EXPORT RateLimiter;
|
||
|
using RateLimiterPtr = std::shared_ptr<RateLimiter>;
|
||
|
/**
|
||
|
* @brief This class is used to limit the number of requests per second
|
||
|
*
|
||
|
* */
|
||
|
class DROGON_EXPORT RateLimiter
|
||
|
{
|
||
|
public:
|
||
|
/**
|
||
|
* @brief Create a rate limiter
|
||
|
* @param type The type of the rate limiter
|
||
|
* @param capacity The maximum number of requests in the time unit.
|
||
|
* @param timeUnit The time unit of the rate limiter.
|
||
|
* @return A rate limiter pointer
|
||
|
*/
|
||
|
static RateLimiterPtr newRateLimiter(
|
||
|
RateLimiterType type,
|
||
|
size_t capacity,
|
||
|
std::chrono::duration<double> timeUnit = std::chrono::seconds(60));
|
||
|
/**
|
||
|
* @brief Check if a request is allowed
|
||
|
*
|
||
|
* @return true The request is allowed
|
||
|
* @return false The request is not allowed
|
||
|
*/
|
||
|
virtual bool isAllowed() = 0;
|
||
|
virtual ~RateLimiter() noexcept = default;
|
||
|
};
|
||
|
class DROGON_EXPORT SafeRateLimiter : public RateLimiter
|
||
|
{
|
||
|
public:
|
||
|
SafeRateLimiter(RateLimiterPtr limiter) : limiter_(limiter)
|
||
|
{
|
||
|
}
|
||
|
bool isAllowed() override
|
||
|
{
|
||
|
std::lock_guard<std::mutex> lock(mutex_);
|
||
|
return limiter_->isAllowed();
|
||
|
}
|
||
|
~SafeRateLimiter() noexcept override = default;
|
||
|
|
||
|
private:
|
||
|
RateLimiterPtr limiter_;
|
||
|
std::mutex mutex_;
|
||
|
};
|
||
|
} // namespace drogon
|