用于EagleEye3.0 规则集漏报和误报测试的示例项目,项目收集于github和gitee
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

289 lines
8.9 KiB

5 months ago
/*
* include/nuster/common.h
* This file defines everything related to nuster common.
*
* Copyright (C) Jiang Wenyuan, < koubunen AT gmail DOT com >
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation, version 2.1
* exclusively.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef _NUSTER_COMMON_H
#define _NUSTER_COMMON_H
typedef struct dirent nst_dirent_t;
typedef struct sample_fetch_kw_list hpx_sample_fetch_kw_list_t;
typedef struct stream_interface hpx_stream_interface_t;
typedef struct http_hdr_ctx hpx_http_hdr_ctx_t;
typedef enum http_meth_t hpx_http_meth_t;
typedef enum htx_blk_type hpx_htx_blk_type_t;
typedef struct flt_conf hpx_flt_conf_t;
typedef struct http_msg hpx_http_msg_t;
typedef struct acl_cond hpx_acl_cond_t;
typedef struct http_txn hpx_http_txn_t;
typedef struct my_regex hpx_my_regex_t;
typedef struct channel hpx_channel_t;
typedef struct flt_ops hpx_flt_ops_t;
typedef struct htx_blk hpx_htx_blk_t;
typedef struct htx_ret hpx_htx_ret_t;
typedef struct session hpx_session_t;
typedef struct buffer hpx_buffer_t;
typedef struct stream hpx_stream_t;
typedef struct appctx hpx_appctx_t;
typedef struct applet hpx_applet_t;
typedef struct htx_sl hpx_htx_sl_t;
typedef struct filter hpx_filter_t;
typedef struct sample hpx_sample_t;
typedef struct proxy hpx_proxy_t;
typedef struct list hpx_list_t;
typedef struct ist hpx_ist_t;
typedef struct htx hpx_htx_t;
typedef struct arg hpx_arg_t;
typedef struct nst_core nst_core_t;
#include <stdio.h>
#include <errno.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdarg.h>
#include <dirent.h>
#include <inttypes.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/stat.h>
#if defined NUSTER_USE_PTHREAD || defined USE_PTHREAD_PSHARED
#include <pthread.h>
#else
#ifdef USE_SYSCALL_FUTEX
#include <unistd.h>
#include <linux/futex.h>
#include <sys/syscall.h>
#endif
#endif
#define NST_OK 0
#define NST_ERR 1
#define NST_DEFAULT_TTL 0
#define NST_DEFAULT_SIZE 1024 * 1024
#define NST_DEFAULT_CHUNK_SIZE 32
#define NST_DEFAULT_DICT_SIZE NST_DEFAULT_SIZE
#define NST_DEFAULT_DATA_SIZE NST_DEFAULT_SIZE
#define NST_DEFAULT_DICT_CLEANER 1000
#define NST_DEFAULT_DATA_CLEANER 1000
#define NST_DEFAULT_DISK_CLEANER 100
#define NST_DEFAULT_DISK_LOADER 100
#define NST_DEFAULT_DISK_SAVER 100
#define NST_DEFAULT_KEY "method.scheme.host.uri"
#define NST_DEFAULT_CODE "200"
enum {
NST_STATUS_UNDEFINED = -1,
NST_STATUS_OFF = 0,
NST_STATUS_ON = 1,
};
enum {
NST_MODE_CACHE = 1,
NST_MODE_NOSQL = 2,
};
enum {
NST_RULE_DISABLED = 0,
NST_RULE_ENABLED = 1,
};
enum {
NST_TIME_OK = 0,
NST_TIME_OVER = 1,
NST_TIME_ERR = 2,
};
enum {
NST_STORE_MEMORY_ON = 0x0001,
NST_STORE_MEMORY_OFF = 0x0002,
NST_STORE_DISK_ON = 0x0004,
NST_STORE_DISK_OFF = 0x0008,
NST_STORE_DISK_SYNC = 0x0010,
};
enum nst_key_element_type {
/* method: GET, POST... */
NST_KEY_ELEMENT_METHOD = 1,
/* scheme: http, https */
NST_KEY_ELEMENT_SCHEME,
/* host: Host header */
NST_KEY_ELEMENT_HOST,
/* uri: first slash to end of the url */
NST_KEY_ELEMENT_URI,
/* path: first slach to question mark */
NST_KEY_ELEMENT_PATH,
/* delimiter: '?' or '' */
NST_KEY_ELEMENT_DELIMITER,
/*query: question mark to end of the url, or empty */
NST_KEY_ELEMENT_QUERY,
/* param: query key/value pair */
NST_KEY_ELEMENT_PARAM,
/* header */
NST_KEY_ELEMENT_HEADER,
/* cookie */
NST_KEY_ELEMENT_COOKIE,
/* body */
NST_KEY_ELEMENT_BODY,
};
typedef struct nst_key_element {
enum nst_key_element_type type;
char *data;
} nst_key_element_t;
typedef struct nst_rule_key {
struct nst_rule_key *next;
char *name;
nst_key_element_t **data; /* parsed key */
int idx;
} nst_rule_key_t;
typedef struct nst_rule_code {
struct nst_rule_code *next;
int code;
} nst_rule_code_t;
typedef struct nst_rule_config {
hpx_list_t list; /* list linked to from the proxy */
char *name; /* cache name for logging */
char *proxy; /* proxy name */
nst_rule_key_t key;
nst_rule_code_t *code; /* code */
uint8_t store;
int ttl; /* ttl: seconds, 0: not expire, -1: auto */
int etag; /* etag on|off */
int last_modified; /* last_modified on|off */
int wait; /* -1: not wait, 0: wait forever, > 0, wait seconds */
int inactive; /* 0: disabled, > 0: inactive seconds */
/*
* -1: do not use stale
* 0: use stale while updating
* > 0: keep for N seconds if update failed and use stale
*/
int stale;
/*
* auto ttl extend
* ctime expire
* |<- ttl ->|
* extend | - | 0 | 1 | 2 | 3 |
* access | 0 | 1 | 2 | 3 |
*
* access is splited into 4 parts:
* 0: ctime ~ expire - extend[0 + 1 + 2] * ttl
* 1: expire - extend[0 + 1 + 2] * ttl ~ expire - extend[1 + 2] * ttl
* 2: expire - extend[1 + 2] * ttl ~ expire - extend[2] * ttl
* 3: expire - extend[2] * ttl ~ expire
*
* Automatic ttl extend happens if:
* 1. access[3] >= access[2] >= access[1]
* 2. expire <= atime <= expire + extend[3] * ttl
*/
uint8_t extend[4];
hpx_acl_cond_t *cond; /* acl condition to meet */
} nst_rule_config_t;
typedef struct nst_rule_prop {
hpx_ist_t pid; /* proxy name */
hpx_ist_t rid; /* rule name */
uint8_t store;
int ttl;
int etag;
int last_modified;
uint8_t extend[4];
int wait;
int inactive;
int stale;
int status_code;
} nst_rule_prop_t;
typedef struct nst_rule {
struct nst_rule *next;
int uuid; /* unique rule ID */
int idx; /* index in specific proxy */
int state; /* enabled or disabled */
nst_rule_key_t *key;
nst_rule_code_t *code; /* code */
nst_rule_prop_t prop;
hpx_acl_cond_t *cond; /* acl condition to meet */
} nst_rule_t;
typedef struct nst_flt_conf {
int status;
int pid;
} nst_flt_conf_t;
/* get current timestamp in milliseconds */
static inline uint64_t
nst_time_now_ms() {
struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
return (uint64_t) ts.tv_sec * 1000 + (uint64_t) ts.tv_nsec / 1000000;
}
/* get current timestamp in nanoseconds */
static inline uint64_t
nst_time_now_ns() {
struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
return (uint64_t) ts.tv_sec * 1000000000ULL + (uint64_t) ts.tv_nsec;
}
const char *nst_parse_size(const char *text, uint64_t *ret);
int nst_parse_time(const char *text, int len, uint32_t *ret);
void nst_debug(hpx_stream_t *s, const char *fmt, ...);
void nst_debug_beg(hpx_stream_t *s, const char *fmt, ...);
void nst_debug_add(const char *fmt, ...);
void nst_debug_end(const char *fmt, ...);
#endif /* _NUSTER_COMMON_H */