#pragma once
#include <drogon/plugins/Plugin.h>
#include <trantor/net/InetAddress.h>
#include <drogon/HttpRequest.h>
#include <vector>
namespace drogon
{
namespace plugin
{
class DROGON_EXPORT RealIpResolver : public drogon::Plugin<RealIpResolver>
{
  public:
    RealIpResolver()
    {
    }
    void initAndStart(const Json::Value &config) override;
    void shutdown() override;
    static const trantor::InetAddress &GetRealAddr(
        const drogon::HttpRequestPtr &req);
  private:
    const trantor::InetAddress &getRealAddr(
        const drogon::HttpRequestPtr &req) const;
    struct CIDR
    {
        explicit CIDR(const std::string &ipOrCidr);
        in_addr_t addr_{0};
        in_addr_t mask_{32};
    };
    using CIDRs = std::vector<CIDR>;
    static bool matchCidr(const trantor::InetAddress &addr,
                          const CIDRs &trustCIDRs);
    friend class Hodor;
    CIDRs trustCIDRs_;
    std::string fromHeader_;
    std::string attributeKey_;
    bool useXForwardedFor_{false};
};
}  
}  