TSG-14484 Pxoxy支持Maat4
This commit is contained in:
@@ -77,6 +77,8 @@ struct cache_param
|
||||
char ignore_res_nocache;
|
||||
char force_caching;
|
||||
|
||||
long long config_id;
|
||||
int action;
|
||||
int min_use;
|
||||
time_t pinning_time_sec;
|
||||
time_t inactive_time_sec;
|
||||
@@ -114,8 +116,8 @@ struct cache_handle
|
||||
|
||||
int cache_policy_enabled; //otherwise use default cache policy
|
||||
struct cache_param default_cache_policy;
|
||||
Maat_feather_t ref_feather;
|
||||
int cache_param_idx;
|
||||
struct maat *ref_feather;
|
||||
long long cache_param_idx;
|
||||
int table_url_constraint;
|
||||
int table_cookie_constraint;
|
||||
|
||||
@@ -517,14 +519,26 @@ char* get_cache_key(const struct tfe_http_half * request, const struct cache_key
|
||||
return cache_key;
|
||||
}
|
||||
|
||||
void cache_param_new(int idx, const struct Maat_rule_t* rule, const char* srv_def_large,
|
||||
MAAT_RULE_EX_DATA* ad, long argl, void *argp)
|
||||
void cache_param_new(const char *table_name, int idx, const char *key, const char *table_line, void **ad, long argl, void *argp)
|
||||
{
|
||||
struct cache_handle* cache=(struct cache_handle*) argp;
|
||||
unsigned int i=0;
|
||||
size_t len=0;
|
||||
int ret=0;
|
||||
int config_id=0, service_id=0, action=0;
|
||||
int do_log=0,do_blacklist=0,is_valid=0;
|
||||
char effective_range[1024]={0};
|
||||
char srv_def_large[8192]={0};
|
||||
|
||||
ret=sscanf(table_line, "%d\t%d\t%d\t%d\t%d\t%s\t%s\t%d", &config_id, &service_id, &action, &do_blacklist, &do_log, effective_range, srv_def_large, &is_valid);
|
||||
if(ret!=8)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
*ad=NULL;
|
||||
if((unsigned int)rule->serv_def_len<strlen("{}")+1)
|
||||
int serv_def_len=strlen(srv_def_large);
|
||||
if((unsigned int)serv_def_len<strlen("{}")+1)
|
||||
{
|
||||
return;
|
||||
}
|
||||
@@ -532,13 +546,14 @@ void cache_param_new(int idx, const struct Maat_rule_t* rule, const char* srv_de
|
||||
json=cJSON_Parse(srv_def_large);
|
||||
if(json==NULL)
|
||||
{
|
||||
TFE_LOG_ERROR(cache->logger, "invalid cache parameter: id = %d", rule->config_id);
|
||||
TFE_LOG_ERROR(cache->logger, "invalid cache parameter: id = %d", config_id);
|
||||
return;
|
||||
}
|
||||
struct cache_param* param=ALLOC(struct cache_param, 1);
|
||||
|
||||
*param=cache->default_cache_policy;
|
||||
param->ref_cnt=1;
|
||||
param->config_id=config_id;
|
||||
param->action=action;
|
||||
pthread_mutex_init(&(param->lock), NULL);
|
||||
key_desc=cJSON_GetObjectItem(json,"cache_key");
|
||||
if(key_desc && key_desc->type==cJSON_Object)
|
||||
@@ -569,8 +584,6 @@ void cache_param_new(int idx, const struct Maat_rule_t* rule, const char* srv_de
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
item=cJSON_GetObjectItem(json,"no_revalidate");
|
||||
if(item && item->type==cJSON_Number) param->no_revalidate=item->valueint;
|
||||
|
||||
@@ -611,7 +624,7 @@ void cache_param_new(int idx, const struct Maat_rule_t* rule, const char* srv_de
|
||||
*ad=param;
|
||||
return;
|
||||
}
|
||||
void cache_param_free(int idx, const struct Maat_rule_t* rule, const char* srv_def_large, MAAT_RULE_EX_DATA* ad, long argl, void *argp)
|
||||
void cache_param_free(int table_id, void **ad, long argl, void *argp)
|
||||
{
|
||||
unsigned int i=0;
|
||||
if(*ad==NULL)
|
||||
@@ -637,7 +650,7 @@ void cache_param_free(int idx, const struct Maat_rule_t* rule, const char* srv_d
|
||||
FREE(&(param));
|
||||
return;
|
||||
}
|
||||
void cache_param_dup(int idx, MAAT_RULE_EX_DATA *to, MAAT_RULE_EX_DATA *from, long argl, void *argp)
|
||||
void cache_param_dup(int idx, void **to, void **from, long argl, void *argp)
|
||||
{
|
||||
struct cache_param* from_param=*((struct cache_param**)from);
|
||||
pthread_mutex_lock(&(from_param->lock));
|
||||
@@ -670,7 +683,7 @@ void cache_mid_clear(struct cache_mid **mid)
|
||||
}
|
||||
if((*mid)->is_using_exception_param)
|
||||
{
|
||||
cache_param_free(0, NULL, NULL, (void**)&((*mid)->param), 0, NULL);
|
||||
cache_param_free(0, (void**)&((*mid)->param), 0, NULL);
|
||||
}
|
||||
FREE(&((*mid)->cache_key));
|
||||
FREE(mid);
|
||||
@@ -689,7 +702,7 @@ static void cache_key_bloom_gc_cb(evutil_socket_t fd, short what, void * arg)
|
||||
}
|
||||
|
||||
struct cache_handle* create_web_cache_handle(const char* profile_path, const char* section,
|
||||
struct event_base* gc_evbase, Maat_feather_t feather, void *logger)
|
||||
struct event_base* gc_evbase, struct maat *feather, void *logger)
|
||||
{
|
||||
struct cache_handle* cache=ALLOC(struct cache_handle, 1);
|
||||
int temp=0;
|
||||
@@ -771,12 +784,12 @@ struct cache_handle* create_web_cache_handle(const char* profile_path, const cha
|
||||
|
||||
if(cache->cache_policy_enabled)
|
||||
{
|
||||
cache->table_url_constraint=Maat_table_register(feather, "PXY_CACHE_HTTP_URL");
|
||||
cache->table_cookie_constraint=Maat_table_register(feather, "PXY_CACHE_HTTP_COOKIE");
|
||||
|
||||
cache->cache_param_idx=Maat_rule_get_ex_new_index(feather, "PXY_CACHE_COMPILE",
|
||||
cache_param_new, cache_param_free, cache_param_dup,
|
||||
0, cache);
|
||||
cache->cache_param_idx=maat_get_table_id(feather, "PXY_CACHE_COMPILE");
|
||||
cache->table_url_constraint=maat_get_table_id(feather, "PXY_CACHE_HTTP_URL");
|
||||
cache->table_cookie_constraint=maat_get_table_id(feather, "PXY_CACHE_HTTP_COOKIE");
|
||||
cache->cache_param_idx=maat_plugin_table_ex_schema_register(feather, "PXY_CACHE_COMPILE",
|
||||
cache_param_new, cache_param_free, cache_param_dup,
|
||||
0, cache);
|
||||
cache->ref_feather=feather;
|
||||
}
|
||||
|
||||
@@ -1044,11 +1057,12 @@ enum cache_pending_result web_cache_async_pending(struct cache_handle* handle, u
|
||||
const struct tfe_http_half * request, struct cache_mid** mid, struct future* f_revalidate)
|
||||
{
|
||||
enum cache_pending_result result=PENDING_RESULT_FOBIDDEN;
|
||||
struct Maat_rule_t cache_policy;
|
||||
long long cache_policy;
|
||||
struct cache_param* param=&(handle->default_cache_policy);
|
||||
MAAT_RULE_EX_DATA ex_data=NULL;
|
||||
scan_status_t scan_mid=NULL;
|
||||
void *ex_data=NULL;
|
||||
struct maat_state *scan_mid=maat_state_new(handle->ref_feather, thread_id);
|
||||
int ret=0;
|
||||
size_t n_hit_result=0;
|
||||
const char* cookie=NULL;
|
||||
struct cache_mid* _mid=ALLOC(struct cache_mid, 1);
|
||||
*mid=_mid;
|
||||
@@ -1060,44 +1074,42 @@ enum cache_pending_result web_cache_async_pending(struct cache_handle* handle, u
|
||||
_mid->is_dyn_url=is_dynamic_url(request->req_spec.url);
|
||||
if(handle->cache_policy_enabled)
|
||||
{
|
||||
ret=Maat_full_scan_string(handle->ref_feather, handle->table_url_constraint, CHARSET_UTF8,
|
||||
request->req_spec.url, strlen(request->req_spec.url),
|
||||
&cache_policy, NULL, 1, &scan_mid, thread_id);
|
||||
ret=maat_scan_string(handle->ref_feather, handle->table_url_constraint, request->req_spec.url,
|
||||
strlen(request->req_spec.url), &cache_policy, 1, &n_hit_result, scan_mid);
|
||||
|
||||
|
||||
if(cookie && ret<=0)
|
||||
if(cookie && ret<MAAT_SCAN_HIT)
|
||||
{
|
||||
ret=Maat_full_scan_string(handle->ref_feather, handle->table_cookie_constraint, CHARSET_UTF8,
|
||||
cookie, strlen(cookie),
|
||||
&cache_policy, NULL, 1, &scan_mid, thread_id);
|
||||
ret=maat_scan_string(handle->ref_feather, handle->table_cookie_constraint, cookie, strlen(cookie),
|
||||
&cache_policy, 1, &n_hit_result, scan_mid);
|
||||
}
|
||||
Maat_clean_status(&scan_mid);
|
||||
maat_state_free(scan_mid);
|
||||
scan_mid=NULL;
|
||||
|
||||
if(ret>0)
|
||||
if(ret==MAAT_SCAN_HIT)
|
||||
{
|
||||
|
||||
ex_data=Maat_rule_get_ex_data(handle->ref_feather, &cache_policy, handle->cache_param_idx);
|
||||
ex_data=maat_plugin_table_get_ex_data(handle->ref_feather, handle->cache_param_idx, (const char *)&cache_policy);
|
||||
if(ex_data!=NULL)
|
||||
{
|
||||
param=(struct cache_param*)ex_data;
|
||||
_mid->is_using_exception_param=1;
|
||||
_mid->param=param;
|
||||
}
|
||||
if((unsigned char)cache_policy.action==CACHE_ACTION_BYPASS)
|
||||
{
|
||||
_mid->shall_bypass=1;
|
||||
}
|
||||
_mid->cfg_id=cache_policy.config_id;
|
||||
if(param->key_descr.is_not_empty)
|
||||
{
|
||||
_mid->cache_key=get_cache_key(request, &(param->key_descr));
|
||||
}
|
||||
TFE_LOG_DEBUG(handle->logger, "cache policy %d matched: url=%s alt-key=%s",
|
||||
cache_policy.config_id,
|
||||
request->req_spec.url,
|
||||
_mid->cache_key!=NULL?_mid->cache_key:"null");
|
||||
ATOMIC_INC(&(handle->stat_val[STAT_CACHE_POLICY_MATCH]));
|
||||
|
||||
if((unsigned char)param->action==CACHE_ACTION_BYPASS)
|
||||
{
|
||||
_mid->shall_bypass=1;
|
||||
}
|
||||
_mid->cfg_id=param->config_id;
|
||||
if(param->key_descr.is_not_empty)
|
||||
{
|
||||
_mid->cache_key=get_cache_key(request, &(param->key_descr));
|
||||
}
|
||||
TFE_LOG_DEBUG(handle->logger, "cache policy %llu matched: url=%s alt-key=%s",
|
||||
param->config_id,
|
||||
request->req_spec.url,
|
||||
_mid->cache_key!=NULL?_mid->cache_key:"null");
|
||||
ATOMIC_INC(&(handle->stat_val[STAT_CACHE_POLICY_MATCH]));
|
||||
}
|
||||
}
|
||||
if(_mid->shall_bypass ||
|
||||
(!param->force_caching && !param->cache_dyn_url && _mid->is_dyn_url && param->key_descr.qs_num==0) ||
|
||||
|
||||
Reference in New Issue
Block a user