⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cache_util.c

📁 Apache HTTP Server 是一个功能强大的灵活的与HTTP/1.1相兼容的web服务器.这里给出的是Apache HTTP服务器的源码。
💻 C
📖 第 1 页 / 共 2 页
字号:
/* Copyright 2001-2005 The Apache Software Foundation or its licensors, as * applicable. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *     http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */#define CORE_PRIVATE#include "mod_cache.h"#include <ap_provider.h>/* -------------------------------------------------------------- *//* return true if the request is conditional */CACHE_DECLARE(int) ap_cache_request_is_conditional(apr_table_t *table){    if (apr_table_get(table, "If-Match") ||        apr_table_get(table, "If-None-Match") ||        apr_table_get(table, "If-Modified-Since") ||        apr_table_get(table, "If-Unmodified-Since")) {        return 1;    }    return 0;}CACHE_DECLARE(cache_provider_list *)ap_cache_get_providers(request_rec *r,                                                  cache_server_conf *conf,                                                   const char *url){    cache_provider_list *providers = NULL;    int i;    /* we can't cache if there's no URL */    /* Is this case even possible?? */    if (!url) return NULL;    /* loop through all the cacheenable entries */    for (i = 0; i < conf->cacheenable->nelts; i++) {        struct cache_enable *ent =                                 (struct cache_enable *)conf->cacheenable->elts;        if ((ent[i].url) && !strncasecmp(url, ent[i].url, ent[i].urllen)) {            /* Fetch from global config and add to the list. */            cache_provider *provider;            provider = ap_lookup_provider(CACHE_PROVIDER_GROUP, ent[i].type,                                          "0");            if (!provider) {                /* Log an error! */            }            else {                cache_provider_list *newp;                newp = apr_pcalloc(r->pool, sizeof(cache_provider_list));                newp->provider_name = ent[i].type;                newp->provider = provider;                if (!providers) {                    providers = newp;                }                else {                    cache_provider_list *last = providers;                    while (last->next) {                        last = last->next;                    }                    last->next = newp;                }            }        }    }    /* then loop through all the cachedisable entries     * Looking for urls that contain the full cachedisable url and possibly     * more.     * This means we are disabling cachedisable url and below...     */    for (i = 0; i < conf->cachedisable->nelts; i++) {        struct cache_disable *ent =                                (struct cache_disable *)conf->cachedisable->elts;        if ((ent[i].url) && !strncasecmp(url, ent[i].url, ent[i].urllen)) {            /* Stop searching now. */            return NULL;        }    }    return providers;}/* do a HTTP/1.1 age calculation */CACHE_DECLARE(apr_int64_t) ap_cache_current_age(cache_info *info,                                                const apr_time_t age_value,                                                apr_time_t now){    apr_time_t apparent_age, corrected_received_age, response_delay,               corrected_initial_age, resident_time, current_age,               age_value_usec;    age_value_usec = apr_time_from_sec(age_value);    /* Perform an HTTP/1.1 age calculation. (RFC2616 13.2.3) */    apparent_age = MAX(0, info->response_time - info->date);    corrected_received_age = MAX(apparent_age, age_value_usec);    response_delay = info->response_time - info->request_time;    corrected_initial_age = corrected_received_age + response_delay;    resident_time = now - info->response_time;    current_age = corrected_initial_age + resident_time;    return apr_time_sec(current_age);}CACHE_DECLARE(int) ap_cache_check_freshness(cache_handle_t *h,                                            request_rec *r){    apr_int64_t age, maxage_req, maxage_cresp, maxage, smaxage, maxstale;    apr_int64_t minfresh;    int age_in_errhdr = 0;    const char *cc_cresp, *cc_ceresp, *cc_req;    const char *agestr = NULL;    const char *expstr = NULL;    char *val;    apr_time_t age_c = 0;    cache_info *info = &(h->cache_obj->info);    /*     * We now want to check if our cached data is still fresh. This depends     * on a few things, in this order:     *     * - RFC2616 14.9.4 End to end reload, Cache-Control: no-cache. no-cache in     * either the request or the cached response means that we must     * revalidate the request unconditionally, overriding any expiration     * mechanism. It's equivalent to max-age=0,must-revalidate.     *      * - RFC2616 14.32 Pragma: no-cache This is treated the same as     * Cache-Control: no-cache.     *      * - RFC2616 14.9.3 Cache-Control: max-stale, must-revalidate,     * proxy-revalidate if the max-stale request header exists, modify the     * stale calculations below so that an object can be at most <max-stale>     * seconds stale before we request a revalidation, _UNLESS_ a     * must-revalidate or proxy-revalidate cached response header exists to     * stop us doing this.     *      * - RFC2616 14.9.3 Cache-Control: s-maxage the origin server specifies the     * maximum age an object can be before it is considered stale. This     * directive has the effect of proxy|must revalidate, which in turn means     * simple ignore any max-stale setting.     *      * - RFC2616 14.9.4 Cache-Control: max-age this header can appear in both     * requests and responses. If both are specified, the smaller of the two     * takes priority.     *      * - RFC2616 14.21 Expires: if this request header exists in the cached     * entity, and it's value is in the past, it has expired.     *      */    cc_cresp = apr_table_get(h->resp_hdrs, "Cache-Control");    cc_ceresp = apr_table_get(h->resp_err_hdrs, "Cache-Control");    cc_req = apr_table_get(h->req_hdrs, "Cache-Control");    if ((agestr = apr_table_get(h->resp_hdrs, "Age"))) {        age_c = apr_atoi64(agestr);    }    else if ((agestr = apr_table_get(h->resp_err_hdrs, "Age"))) {        age_c = apr_atoi64(agestr);        age_in_errhdr = 1;    }    if (!(expstr = apr_table_get(h->resp_err_hdrs, "Expires"))) {        expstr = apr_table_get(h->resp_hdrs, "Expires");    }    /* calculate age of object */    age = ap_cache_current_age(info, age_c, r->request_time);    /* extract s-maxage */    if (cc_cresp && ap_cache_liststr(r->pool, cc_cresp, "s-maxage", &val)) {        smaxage = apr_atoi64(val);    }    else if (cc_ceresp && ap_cache_liststr(r->pool, cc_ceresp, "s-maxage", &val)) {        smaxage = apr_atoi64(val);    }    else {        smaxage = -1;    }    /* extract max-age from request */    if (cc_req && ap_cache_liststr(r->pool, cc_req, "max-age", &val)) {        maxage_req = apr_atoi64(val);    }    else {        maxage_req = -1;    }    /* extract max-age from response */    if (cc_cresp && ap_cache_liststr(r->pool, cc_cresp, "max-age", &val)) {        maxage_cresp = apr_atoi64(val);    }    else if (cc_ceresp && ap_cache_liststr(r->pool, cc_ceresp, "max-age", &val)) {        maxage_cresp = apr_atoi64(val);    }    else    {        maxage_cresp = -1;    }    /*     * if both maxage request and response, the smaller one takes priority     */    if (-1 == maxage_req) {        maxage = maxage_cresp;    }    else if (-1 == maxage_cresp) {        maxage = maxage_req;    }    else {        maxage = MIN(maxage_req, maxage_cresp);    }    /* extract max-stale */    if (cc_req && ap_cache_liststr(r->pool, cc_req, "max-stale", &val)) {        maxstale = apr_atoi64(val);    }    else {        maxstale = 0;    }    /* extract min-fresh */    if (cc_req && ap_cache_liststr(r->pool, cc_req, "min-fresh", &val)) {        minfresh = apr_atoi64(val);    }    else {        minfresh = 0;    }    /* override maxstale if must-revalidate or proxy-revalidate */    if (maxstale && ((cc_cresp &&                      ap_cache_liststr(NULL, cc_cresp,                                       "must-revalidate", NULL)) ||                     (cc_cresp &&                      ap_cache_liststr(NULL, cc_cresp,                                       "proxy-revalidate", NULL)) ||                     (cc_ceresp &&                      ap_cache_liststr(NULL, cc_ceresp,                                       "must-revalidate", NULL)) ||                     (cc_ceresp &&                      ap_cache_liststr(NULL, cc_ceresp,                                       "proxy-revalidate", NULL)))) {        maxstale = 0;    }    /* handle expiration */    if (((smaxage != -1) && (age < (smaxage - minfresh))) ||        ((maxage != -1) && (age < (maxage + maxstale - minfresh))) ||        ((smaxage == -1) && (maxage == -1) &&         (info->expire != APR_DATE_BAD) &&         (age < (apr_time_sec(info->expire - info->date) + maxstale - minfresh)))) {        const char *warn_head;        apr_table_t *head_ptr;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -