summaryrefslogtreecommitdiff
path: root/src/httpaction.h
blob: aea7f6a08b4bc6047eaf82e4e5f72ce84bb83235 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
//
// Created by luqiu on 2018-5-17.
//

#ifndef TFE_HTTPACTION_H
#define TFE_HTTPACTION_H

#include <string>
#include <memory>

#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<HttpLogger> logger) = 0;
    virtual void LoggerClear() = 0;
};

std::shared_ptr<HttpAction> HttpActionFactory(enum HttpActionType type, std::string str_service_define);
std::unique_ptr<HttpLogger> HttpLoggerFactory(int service_id, int cfg_id);

#endif //TFE_HTTPACTION_H