重构缓存策略中的部分函数。

This commit is contained in:
zhengchao
2018-11-13 11:56:41 +08:00
parent 03a141400d
commit a5c74ada70
2 changed files with 77 additions and 53 deletions

View File

@@ -68,6 +68,7 @@ struct cache_param
char no_revalidate;
char cache_dyn_url;
char cache_html;
char cache_cookied_cont;
char ignore_req_nocache;
char ignore_res_nocache;
@@ -388,7 +389,48 @@ char * cookie_scanvalue(const char * key, const char * cookies, char * val, size
FREE(&cookie_dup);
return val;
}
char* url_remove_qs(const char* url, int qs_num, char* ignore_qs[])
{
char* url_copy=tfe_strdup(url);
size_t target_size= strlen(url_copy)+1;
char* target_url=ALLOC(char, target_size);
int i=0, shall_ignore=0;
char *token=NULL,*sub_token=NULL,*saveptr;
char* query_string=NULL;
query_string=strchr(url_copy, '?');
if(query_string!=NULL)
{
strncat(target_url, url_copy, MIN(query_string-url_copy,target_size));
query_string++;
for (token = query_string; ; token= NULL)
{
sub_token= strtok_r(token,"&", &saveptr);
if (sub_token == NULL)
break;
shall_ignore=0;
for(i=0; i<qs_num; i++)
{
if(0==strncasecmp(sub_token, ignore_qs[i], strlen(ignore_qs[i])))
{
shall_ignore=1;
break;
}
}
if(!shall_ignore)
{
strncat(target_url, sub_token, target_size);
}
}
}
else
{
strncat(target_url, url_copy, target_size);
}
FREE(&(url_copy));
return target_url;
}
char* get_cache_key(const struct tfe_http_half * request, const struct cache_key_descr* desc)
{
@@ -396,61 +438,32 @@ char* get_cache_key(const struct tfe_http_half * request, const struct cache_key
{
return NULL;
}
int i=0, shall_ignore=0;
char *token=NULL,*sub_token=NULL,*saveptr;
char* url=tfe_strdup(request->req_spec.url);
char* url_no_qs=NULL;
const char* cookie=NULL;
char cookie_val[256]={0}; //most 256 bytes for cookie key
size_t key_size=strlen(url)+sizeof(cookie_val);
size_t key_size=strlen(request->req_spec.url)+sizeof(cookie_val);
char* cache_key=ALLOC(char, key_size);
char* query_string=NULL;
if(desc->qs_num>0)
{
query_string=strchr(url, '?');
if(query_string!=NULL)
{
strncat(cache_key, url, MIN(query_string-url,key_size));
query_string++;
for (token = query_string; ; token= NULL)
{
sub_token= strtok_r(token,"&", &saveptr);
if (sub_token == NULL)
break;
shall_ignore=0;
for(i=0; i<desc->qs_num; i++)
{
if(0==strncasecmp(sub_token, desc->ignore_qs[i], strlen(desc->ignore_qs[i])))
{
shall_ignore=1;
break;
}
}
if(!shall_ignore)
{
strncat(cache_key, sub_token, key_size);
}
}
}
else
{
strncat(cache_key, url, key_size);
}
url_no_qs=url_remove_qs(request->req_spec.url, desc->qs_num, desc->ignore_qs);
strncat(cache_key, url_no_qs, key_size);
FREE(&url_no_qs);
}
else
{
strncat(cache_key, url, key_size);
strncat(cache_key, request->req_spec.url, key_size);
}
if(desc->include_cookie && (cookie=tfe_http_std_field_read(request, TFE_HTTP_COOKIE))!=NULL)
{
cookie_scanvalue(desc->include_cookie, cookie, cookie_val, sizeof(cookie_val));
if(strlen(cookie_val)>0)
{
strncat(cache_key, "/C/", key_size);
strncat(cache_key, cookie_val, key_size);
}
}
FREE(&(url));
return cache_key;
}
@@ -917,6 +930,7 @@ struct cache_mid
char shall_bypass;
char is_using_exception_param;
char is_dyn_url;
char is_html;
char has_cookie;
char use_cnt;
int cfg_id;
@@ -976,7 +990,6 @@ enum cache_pending_result web_cache_async_pending(struct cache_handle* handle, u
if(ret>0)
{
TFE_LOG_DEBUG(handle->logger, "cache policy %d matched: %s", cache_policy.config_id, request->req_spec.url);
ex_data=Maat_rule_get_ex_data(handle->ref_feather, &cache_policy, handle->cache_param_idx);
if(ex_data!=NULL)
{
@@ -989,6 +1002,15 @@ enum cache_pending_result web_cache_async_pending(struct cache_handle* handle, u
_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 alternative key=%s",
cache_policy.config_id,
request->req_spec.url,
_mid->cache_key!=NULL?_mid->cache_key:"null");
}
if(_mid->shall_bypass ||
(!param->force_caching && !param->cache_dyn_url && _mid->is_dyn_url && param->key_descr.qs_num==0) ||
@@ -1047,15 +1069,7 @@ enum cache_pending_result web_cache_async_pending(struct cache_handle* handle, u
struct tango_cache_meta_get meta;
memset(&meta, 0, sizeof(meta));
if(param->key_descr.is_not_empty)
{
_mid->cache_key=get_cache_key(request, &(param->key_descr));
meta.url = _mid->cache_key;
}
else
{
meta.url = request->req_spec.url;
}
meta.url=_mid->cache_key!=NULL?_mid->cache_key:request->req_spec.url;
meta.get = _mid->req_fresshness;
struct promise* p=future_to_promise(f_revalidate);
@@ -1152,7 +1166,7 @@ struct cache_update_context* web_cache_update_start(struct cache_handle* handle,
enum cache_pending_action put_action;
struct tango_cache_ctx *write_ctx=NULL;
char cont_type_str[TFE_STRING_MAX]={0}, user_tag_str[TFE_STRING_MAX]={0};
const char* value=NULL;
const char* content_type=NULL;
char *tmp=NULL;
int i=0, is_undefined_obj=0;
size_t content_len=0;
@@ -1171,7 +1185,11 @@ struct cache_update_context* web_cache_update_start(struct cache_handle* handle,
{
sscanf(session->resp->resp_spec.content_length, "%lu", &content_len);
}
content_type=tfe_http_std_field_read(session->resp, TFE_HTTP_CONT_TYPE);
if(content_type!=NULL&& NULL!=strcasestr(content_type, "text/html"))
{
_mid->is_html=1;
}
put_action=tfe_cache_put_pending(session->resp, &resp_freshness);
switch(put_action){
case FORBIDDEN:
@@ -1187,7 +1205,8 @@ struct cache_update_context* web_cache_update_start(struct cache_handle* handle,
case UNDEFINED:
if(_mid->shall_bypass
|| content_len > param->max_cache_obj_size
|| (!param->cache_cookied_cont && _mid->has_cookie) )
|| (!param->cache_cookied_cont && _mid->has_cookie)
|| (!param->cache_html && _mid->is_html))
{
ATOMIC_INC(&(handle->stat_val[STAT_CACHE_UPLOAD_BYPASS]));
return NULL;