diff --git a/plugin/business/pangu-http/src/pangu_http.cpp b/plugin/business/pangu-http/src/pangu_http.cpp index 9499cd5..1c0fd4d 100644 --- a/plugin/business/pangu-http/src/pangu_http.cpp +++ b/plugin/business/pangu-http/src/pangu_http.cpp @@ -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); diff --git a/plugin/business/pangu-http/src/pangu_web_cache.cpp b/plugin/business/pangu-http/src/pangu_web_cache.cpp index 7354145..71355d2 100644 --- a/plugin/business/pangu-http/src/pangu_web_cache.cpp +++ b/plugin/business/pangu-http/src/pangu_web_cache.cpp @@ -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; }