正确处理etag和last_modified元信息。

This commit is contained in:
zhengchao
2018-10-28 21:43:04 +08:00
parent b677d8ad0f
commit 618f81bac5
2 changed files with 38 additions and 44 deletions

View File

@@ -935,8 +935,10 @@ static void cache_query_on_succ(future_result_t * result, void * user)
tfe_http_session_resume(ctx->ref_session);
ctx->cached_response=tfe_http_session_response_create(ctx->ref_session, 200);
tfe_http_nonstd_field_write(ctx->cached_response, "X-Cache-Lookup", "Hit From TFE");
tfe_http_std_field_write(ctx->cached_response, TFE_HTTP_CONT_TYPE, meta->content_type);
tfe_http_std_field_write(ctx->cached_response, TFE_HTTP_LAST_MODIFIED, meta->last_modified);
tfe_http_std_field_write(ctx->cached_response, TFE_HTTP_ETAG, meta->etag);
tfe_http_nonstd_field_write(ctx->cached_response, "X-Cache-Lookup", "Hit From TFE");
snprintf(temp, sizeof(temp), "%lu", meta->content_length);
tfe_http_std_field_write(ctx->cached_response, TFE_HTTP_CONT_LENGTH, temp);

View File

@@ -271,40 +271,6 @@ static char* read_http1_hdr(const char* hdr, const char* field_name)
memcpy(value, p, q-p);
return value;
}
enum cache_query_result_type cache_query_result_get_type(future_result_t * result)
{
struct tango_cache_result* cache_result=tango_cache_read_result(result);
enum cache_query_result_type map[__CACHE_QUERY_RESULT_MAX];
map[RESULT_TYPE_BODY]=CACHE_QUERY_RESULT_DATA;
map[RESULT_TYPE_HEADER]=CACHE_QUERY_RESULT_META;
map[RESULT_TYPE_USERTAG]=CACHE_QUERY_RESULT_IRRELEVANT;
map[RESULT_TYPE_END]=CACHE_QUERY_RESULT_END;
map[RESULT_TYPE_MISS]=CACHE_QUERY_RESULT_MISS;
return map[cache_result->type];
}
struct cached_meta* cache_query_result_get_header(future_result_t * result)
{
struct tango_cache_result* cache_result=tango_cache_read_result(result);
struct cached_meta* meta;
if(cache_result->type!=RESULT_TYPE_HEADER)
{
return NULL;
}
meta= ALLOC(struct cached_meta, 1);
meta->content_length=cache_result->tlength;
meta->content_type=read_http1_hdr((const char*)cache_result->data_frag, "content-type");
return meta;
}
size_t cache_query_result_get_data(future_result_t * result, const unsigned char** pp_data)
{
struct tango_cache_result* cache_result=tango_cache_read_result(result);
assert(cache_result->type==RESULT_TYPE_BODY);
*pp_data=(const unsigned char*)cache_result->data_frag;
return cache_result->size;
}
struct cache_query_context
{
struct cache_handle* ref_handle;
@@ -315,6 +281,29 @@ struct cache_query_context
struct tango_cache_result* ref_tango_cache_result;
struct future* f_tango_cache_fetch;
};
enum cache_query_result_type cache_query_result_get_type(future_result_t * result)
{
struct cache_query_context* ctx=(struct cache_query_context*)result;
struct tango_cache_result* cache_result=ctx->ref_tango_cache_result;
enum cache_query_result_type map[__CACHE_QUERY_RESULT_MAX];
map[RESULT_TYPE_BODY]=CACHE_QUERY_RESULT_DATA;
map[RESULT_TYPE_HEADER]=CACHE_QUERY_RESULT_META;
map[RESULT_TYPE_USERTAG]=CACHE_QUERY_RESULT_IRRELEVANT;
map[RESULT_TYPE_END]=CACHE_QUERY_RESULT_END;
map[RESULT_TYPE_MISS]=CACHE_QUERY_RESULT_MISS;
return map[cache_result->type];
}
size_t cache_query_result_get_data(future_result_t * result, const unsigned char** pp_data)
{
struct cache_query_context* ctx=(struct cache_query_context*)result;
struct tango_cache_result* cache_result=ctx->ref_tango_cache_result;
assert(cache_result->type==RESULT_TYPE_BODY);
*pp_data=(const unsigned char*)cache_result->data_frag;
return cache_result->size;
}
void cache_query_ctx_free_cb(void* p)
{
struct cache_query_context* ctx=(struct cache_query_context*)p;
@@ -340,6 +329,10 @@ void cached_meta_set(struct cached_meta* meta, enum CACHE_RESULT_TYPE type, cons
break;
case RESULT_TYPE_USERTAG:
meta->last_modified=read_http1_hdr(data_frag, "Last-Modified");
if(0==strcasecmp(meta->last_modified, "Thu, 01 Jan 1970 00:00:00 GMT"))
{
FREE(&(meta->last_modified));
}
meta->etag=read_http1_hdr(data_frag, "etag");
break;
default:
@@ -353,19 +346,18 @@ static void cache_query_obj_on_succ(future_result_t * result, void * user)
{
struct promise * p = (struct promise *) user;
struct cache_query_context* ctx=(struct cache_query_context*)promise_get_ctx(p);
struct tango_cache_result* _result=tango_cache_read_result(result);
switch(_result->type)
ctx->ref_tango_cache_result=tango_cache_read_result(result);
switch(ctx->ref_tango_cache_result->type)
{
case RESULT_TYPE_HEADER:
ATOMIC_INC(&(ctx->ref_handle->stat_val[STAT_CACHE_QUERY_HIT]));
FS_operate(ctx->ref_handle->fs_handle, ctx->ref_handle->fs_id[STAT_CACHE_QUERY_HIT_OJB_SIZE], 0, FS_OP_SET, _result->tlength/1024);
cached_meta_set(&ctx->meta, RESULT_TYPE_HEADER, _result->data_frag, _result->size);
ctx->meta.content_length=_result->tlength;
FS_operate(ctx->ref_handle->fs_handle, ctx->ref_handle->fs_id[STAT_CACHE_QUERY_HIT_OJB_SIZE], 0, FS_OP_SET, ctx->ref_tango_cache_result->tlength/1024);
cached_meta_set(&ctx->meta, RESULT_TYPE_HEADER, ctx->ref_tango_cache_result->data_frag, ctx->ref_tango_cache_result->size);
ctx->meta.content_length=ctx->ref_tango_cache_result->tlength;
TFE_LOG_DEBUG(ctx->ref_handle->logger, "cache query hit: %s", ctx->url);
break;
case RESULT_TYPE_USERTAG:
cached_meta_set(&ctx->meta, RESULT_TYPE_USERTAG, _result->data_frag, _result->size);
cached_meta_set(&ctx->meta, RESULT_TYPE_USERTAG, ctx->ref_tango_cache_result->data_frag, ctx->ref_tango_cache_result->size);
break;
case RESULT_TYPE_MISS:
TFE_LOG_DEBUG(ctx->ref_handle->logger, "cache query miss: %s", ctx->url);
@@ -377,12 +369,12 @@ static void cache_query_obj_on_succ(future_result_t * result, void * user)
cache_query_ctx_free_cb(ctx);
break;
case RESULT_TYPE_BODY:
ATOMIC_ADD(&(ctx->ref_handle->stat_val[STAT_CACHE_QUERY_BYTES]), _result->size);
ATOMIC_ADD(&(ctx->ref_handle->stat_val[STAT_CACHE_QUERY_BYTES]), ctx->ref_tango_cache_result->size);
break;
default:
break;
}
promise_success(p, result);
promise_success(p, ctx);
return;
}