// // Created by luqiu on 2018-5-17. // #ifndef TFE_HTTPACTION_H #define TFE_HTTPACTION_H #include #include #include "http.h" enum HttpActionType { kActionBypass = 0x00, kActionMonitor = 0x01, kActionBlock = 0x10, kActionDrop = 0x20, kActionRedirect = 0x30, kActionRateLimit = 0x40, kActionReplace = 0x50, kActionWhiteList = 0x80, kActionMax = 0xff }; /* 结构化日志构建与发送 */ class HttpLogger { public: explicit HttpLogger(StructLogger * st_logger, unsigned int service_id, unsigned int cfg_id); virtual ~HttpLogger(); void ConstructByConnection(const HttpConnection & conn); void ConstructByRequestHeader(const HttpRequest & request); void ConstructByRequestBody(const HttpRequest & request); void ConstructByResponseHeader(const HttpResponse & resp); void ConstructByResponseBody(const HttpResponse & resp); void SendLog(); void SetAutoSendLog(bool auto_sendlog) { auto_sendlog_ = auto_sendlog; } private: const sockaddr * sk_src_{nullptr}; const sockaddr * sk_dst_{nullptr}; unsigned int service_id_{0}; unsigned int cfg_id_{0}; StructLogger * st_logger_{nullptr}; Json::Value st_log_{}; unsigned int topic_id_{LOG_TOPIC_CTRL_HTTP}; bool auto_sendlog_{true}; bool need_to_sendlog_{false}; }; /* HttpAction接口 * 该接口描述了命中扫描规则后的处理流程与状态 * 根据命中处理业务的不同,分别地实现 */ class HttpAction { public: virtual void Construct(const std::string &str_service_define) = 0; virtual std::string DumpToString() = 0; virtual void OnRequestHeader(HttpSession *session) = 0; virtual void OnRequestBody(HttpSession *session) = 0; virtual void OnResponseHeader(HttpSession *session) = 0; virtual void OnResponseBody(HttpSession *session) = 0; virtual void LoggerSetup(std::unique_ptr logger) = 0; virtual void LoggerClear() = 0; }; std::shared_ptr HttpActionFactory(enum HttpActionType type, std::string str_service_define); std::unique_ptr HttpLoggerFactory(int service_id, int cfg_id); #endif //TFE_HTTPACTION_H