diff options
| author | fengweihao <[email protected]> | 2023-12-29 14:39:03 +0800 |
|---|---|---|
| committer | fengweihao <[email protected]> | 2023-12-29 14:39:03 +0800 |
| commit | ced991b4a0569f52fbae33aa8ce15c9d4ea6bda7 (patch) | |
| tree | f28257f66772f6dcdf130d82272054dddfe6dc59 /cache/src/tango_cache_pending.cpp | |
| parent | b011a9268042db22cc54ca8171640dbfb2ab617c (diff) | |
TSG-18286 Proxy支持虚拟表表名变更,删除代理本地缓存,删除tsg-http相关配置v4.8.56-20231229
Diffstat (limited to 'cache/src/tango_cache_pending.cpp')
| -rw-r--r-- | cache/src/tango_cache_pending.cpp | 306 |
1 files changed, 0 insertions, 306 deletions
diff --git a/cache/src/tango_cache_pending.cpp b/cache/src/tango_cache_pending.cpp deleted file mode 100644 index 8d803d9..0000000 --- a/cache/src/tango_cache_pending.cpp +++ /dev/null @@ -1,306 +0,0 @@ -#include "tango_cache_pending.h" -#include <tfe_utils.h> -#include <assert.h> -#include <string.h> -#include <stdlib.h> -#include <stdio.h> -#include <stdbool.h> - - -time_t get_time_value(const char* field_value, const char* field_type) -{ - time_t time; - char* time_value = NULL; - field_value += strlen(field_type); - field_value++; - int len = strlen(field_value); - time_value = ALLOC(char, len+1); - int index = 0; - while (field_value[index] != ',' && field_value[index] != '\r' && index < len) - { - time_value[index] = field_value[index]; - index++; - } - time_value[index] = '\0'; - time = (time_t)atol(time_value); - free(time_value); - return time; -} - - -void get_request_freshness(const char *value, struct request_freshness* restrict) -{ - const char* field_value = NULL; - field_value = strstr(value, "min-fresh"); - if (field_value != NULL) - { - restrict->min_fresh = get_time_value(field_value, "min-fresh");; - } - - field_value = strstr(value, "max-age"); - if (field_value != NULL) - { - restrict->max_age = get_time_value(field_value, "max-age");; - } -} - - -enum cache_pending_action request_cache_control(const char* value, struct request_freshness* restrict) -{ - if (strstr(value, "no-cache") != NULL) - { - return REVALIDATE; - } - if (strstr(value, "no-store") != NULL) - { - return FORBIDDEN; - } - get_request_freshness(value, restrict); - return ALLOWED; -} - - -bool cache_verify(const struct tfe_http_half *request) -{ - if( !tfe_http_std_field_read(request,TFE_HTTP_IF_MATCH) || - !tfe_http_std_field_read(request,TFE_HTTP_IF_NONE_MATCH) || - !tfe_http_std_field_read(request,TFE_HTTP_IF_MODIFIED_SINCE) || - !tfe_http_std_field_read(request,TFE_HTTP_IF_UNMODIFIED_SINCE) - ) - { - return true; - } - return false; -} - - -const char* get_head_value(const struct tfe_http_field *http_fields, size_t n_fields, enum tfe_http_std_field head_key) -{ - size_t i = 0; - for (i = 0; i < n_fields; i++) - { - if (http_fields[i].http_field == head_key) - { - return http_fields[i].value; - } - } - return NULL; -} - - -enum cache_pending_action get_pragma_action(const char * value) -{ - const char *pragma_value = "no-cache"; - if (strcasecmp(value, pragma_value) == 0) - { - return REVALIDATE; - } - return UNDEFINED; -} - - -enum cache_pending_action tfe_cache_get_pending(const struct tfe_http_half *request, struct request_freshness* restrict) -{ - enum cache_pending_action res = UNDEFINED; - const char *value = NULL; - memset(restrict,0,sizeof(struct request_freshness)); - if(request->req_spec.method!=TFE_HTTP_METHOD_GET) - { - return FORBIDDEN; - } - if(NULL!=tfe_http_std_field_read(request, TFE_HTTP_CONT_RANGE) || - NULL!=tfe_http_std_field_read(request, TFE_HTTP_AUTHORIZATION)|| - NULL!=tfe_http_nonstd_field_read(request, "WWW-Authenticate")) - { - return FORBIDDEN; - } - value = tfe_http_std_field_read(request, TFE_HTTP_PRAGMA); - if (value != NULL) - { - res = get_pragma_action(value); - } - else - { - value = tfe_http_std_field_read(request, TFE_HTTP_CACHE_CONTROL); - if (value != NULL) - { - res = request_cache_control(value, restrict); - } - else - { - if (cache_verify(request)) - { - res = REVALIDATE; - } - } - } - return res; -} - - - -time_t read_GMT_time(const char* gmt_string) -{ - time_t expire_rel_time; - struct tm expire_gmt_time; - memset(&expire_gmt_time, 0, sizeof(expire_gmt_time)); - strptime(gmt_string, "%a, %d %b %Y %H:%M:%S GMT", &expire_gmt_time); - expire_rel_time = mktime(&expire_gmt_time); - return expire_rel_time; -} - - -bool is_standard_gmt_format(const char* value) -{ - int str_len = strlen(value); - if(0==strcasecmp(value+str_len-3,"GMT")) - { - return true; - } - else - { - return false; - } -} - -time_t get_response_s_maxage(const char* cache_ctl) -{ - const char* s_maxage = NULL; - s_maxage = strstr(cache_ctl, "s-maxage"); - if (s_maxage != NULL) - { - return get_time_value(s_maxage, "s-maxage"); - } - else - { - return 0; - } -} - - -time_t get_response_maxage(const char* cache_ctl) -{ - const char* max_age = NULL; - max_age = strstr(cache_ctl, "max-age"); - if (max_age != NULL) - { - return get_time_value(max_age, "max-age"); - } - else - { - return 0; - } -} - - -void get_response_freshness(const struct tfe_http_half *response, struct response_freshness* freshness) -{ - time_t expire_rel_time = 0; - time_t cur_rel_time = 0; - struct tm cur_gmt_time; - const char* field_value = NULL; - field_value = tfe_http_std_field_read(response, TFE_HTTP_CACHE_CONTROL); - if (field_value != NULL) - { - freshness->timeout = get_response_s_maxage(field_value); - if (freshness->timeout == 0) - { - freshness->timeout = get_response_maxage(field_value); - } - } - else - { - field_value = tfe_http_std_field_read(response, TFE_HTTP_EXPIRES); - if (field_value != NULL && is_standard_gmt_format(field_value)) - { - expire_rel_time = read_GMT_time(field_value); - const time_t cur_ct_time = time(NULL); - if (gmtime_r(&cur_ct_time, &cur_gmt_time) == NULL) - { - assert(0); - } - cur_rel_time = mktime(&cur_gmt_time); - freshness->timeout = expire_rel_time - cur_rel_time; - } - } - field_value = tfe_http_std_field_read(response, TFE_HTTP_DATE); - if (field_value != NULL) - { - if(is_standard_gmt_format(field_value)) - { - freshness->date = read_GMT_time(field_value);; - } - } - field_value = tfe_http_std_field_read(response, TFE_HTTP_LAST_MODIFIED); - if (field_value != NULL && is_standard_gmt_format(field_value)) - { - freshness->last_modified = read_GMT_time(field_value);; - } -} - - -enum cache_pending_action response_cache_control(const char* value) -{ - const char *forbidden_vaule[] = {"no-store", "private"}; - const char *verify_vaule[] = { "no-cache", "must-revalidate","proxy-revalidate" }; - int i = 0; - for (i = 0; i < 2; i++) - { - if (strstr(value, forbidden_vaule[i]) != NULL) - { - return FORBIDDEN; - } - } - for (i = 0; i < 3; i++) - { - if (strstr(value, verify_vaule[i]) != NULL) - { - return REVALIDATE; - } - } - return ALLOWED; -} - - -enum cache_pending_action tfe_cache_put_pending(const struct tfe_http_half *response, struct response_freshness* freshness) -{ - enum cache_pending_action res = UNDEFINED; - const char *value = NULL; - memset(freshness,0,sizeof(struct response_freshness)); - if(response->resp_spec.resp_code!=TFE_HTTP_STATUS_OK - || NULL!=tfe_http_std_field_read(response, TFE_HTTP_CONT_RANGE) //NOT upload response with content-range - || NULL==response->resp_spec.content_length - || NULL!=tfe_http_std_field_read(response, TFE_HTTP_AUTHORIZATION) - || NULL!=tfe_http_nonstd_field_read(response, "WWW-Authenticate") - || NULL!=tfe_http_std_field_read(response, TFE_HTTP_SET_COOKIE)) - { - return FORBIDDEN; - } - - value = tfe_http_std_field_read(response, TFE_HTTP_PRAGMA); - if (value != NULL) - { - res = get_pragma_action(value); - } - else - { - value = tfe_http_std_field_read(response, TFE_HTTP_CACHE_CONTROL); - if (value != NULL) - { - res = response_cache_control(value); - } - else - { - value = tfe_http_std_field_read(response, TFE_HTTP_EXPIRES); - if (value != NULL && 0!= read_GMT_time(value)) - { - res = ALLOWED; - } - } - } - if (res == ALLOWED) - { - get_response_freshness(response, freshness); - } - return res; -} |
