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

📄 cache_storage.c

📁 Apache官方在今天放出产品系列2.2的最新版本2.2.11的源码包 最流行的HTTP服务器软件之一
💻 C
📖 第 1 页 / 共 2 页
字号:
                }                else if (h1 && h2 && !strcmp(h1, h2)) {                    /* both headers exist and are equal - do nothing */                }                else {                    /* headers do not match, so Vary failed */                    ap_log_error(APLOG_MARK, APLOG_DEBUG, APR_SUCCESS,                                r->server,                                "cache_select_url(): Vary header mismatch.");                    return DECLINED;                }            }            cache->provider = list->provider;            cache->provider_name = list->provider_name;            /* Is our cached response fresh enough? */            fresh = ap_cache_check_freshness(h, r);            if (!fresh) {                const char *etag, *lastmod;                ap_log_error(APLOG_MARK, APLOG_DEBUG, APR_SUCCESS, r->server,                  "Cached response for %s isn't fresh.  Adding/replacing "                  "conditional request headers.", r->uri);                /* Make response into a conditional */                cache->stale_headers = apr_table_copy(r->pool,                                                      r->headers_in);                /* We can only revalidate with our own conditionals: remove the                 * conditions from the original request.                 */                apr_table_unset(r->headers_in, "If-Match");                apr_table_unset(r->headers_in, "If-Modified-Since");                apr_table_unset(r->headers_in, "If-None-Match");                apr_table_unset(r->headers_in, "If-Range");                apr_table_unset(r->headers_in, "If-Unmodified-Since");                /*                 * Do not do Range requests with our own conditionals: If                 * we get 304 the Range does not matter and otherwise the                 * entity changed and we want to have the complete entity                 */                apr_table_unset(r->headers_in, "Range");                etag = apr_table_get(h->resp_hdrs, "ETag");                lastmod = apr_table_get(h->resp_hdrs, "Last-Modified");                if (etag || lastmod) {                    /* If we have a cached etag and/or Last-Modified add in                     * our own conditionals.                     */                    if (etag) {                        apr_table_set(r->headers_in, "If-None-Match", etag);                    }                    if (lastmod) {                        apr_table_set(r->headers_in, "If-Modified-Since",                                      lastmod);                    }                    cache->stale_handle = h;                }                else {                    int irv;                    /*                     * The copy isn't fresh enough, but we cannot revalidate.                     * So it is the same case as if there had not been a cached                     * entry at all. Thus delete the entry from cache.                     */                    irv = cache->provider->remove_url(h, r->pool);                    if (irv != OK) {                        ap_log_error(APLOG_MARK, APLOG_DEBUG, irv, r->server,                                     "cache: attempt to remove url from cache unsuccessful.");                    }                }                return DECLINED;            }            /* Okay, this response looks okay.  Merge in our stuff and go. */            ap_cache_accept_headers(h, r, 0);            cache->handle = h;            return OK;        }        case DECLINED: {            /* try again with next cache type */            list = list->next;            continue;        }        default: {            /* oo-er! an error */            return rv;        }        }    }    return DECLINED;}apr_status_t cache_generate_key_default(request_rec *r, apr_pool_t* p,                                        char**key){    cache_server_conf *conf;    cache_request_rec *cache;    char *port_str, *hn, *lcs;    const char *hostname, *scheme;    int i;    cache = (cache_request_rec *) ap_get_module_config(r->request_config,                                                       &cache_module);    if (!cache) {        /* This should never happen */        ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server,                     "cache: No cache request information available for key"                     " generation");        *key = "";        return APR_EGENERAL;    }    if (cache->key) {        /*         * We have been here before during the processing of this request.         * So return the key we already have.         */        *key = apr_pstrdup(p, cache->key);        return APR_SUCCESS;    }    /*     * Get the module configuration. We need this for the CacheIgnoreQueryString     * option below.     */    conf = (cache_server_conf *) ap_get_module_config(r->server->module_config,                                                      &cache_module);    /*     * Use the canonical name to improve cache hit rate, but only if this is     * not a proxy request or if this is a reverse proxy request.     * We need to handle both cases in the same manner as for the reverse proxy     * case we have the following situation:     *     * If a cached entry is looked up by mod_cache's quick handler r->proxyreq     * is still unset in the reverse proxy case as it only gets set in the     * translate name hook (either by ProxyPass or mod_rewrite) which is run     * after the quick handler hook. This is different to the forward proxy     * case where it gets set before the quick handler is run (in the     * post_read_request hook).     * If a cache entry is created by the CACHE_SAVE filter we always have     * r->proxyreq set correctly.     * So we must ensure that in the reverse proxy case we use the same code     * path and using the canonical name seems to be the right thing to do     * in the reverse proxy case.     */    if (!r->proxyreq || (r->proxyreq == PROXYREQ_REVERSE)) {        /* Use _default_ as the hostname if none present, as in mod_vhost */        hostname =  ap_get_server_name(r);        if (!hostname) {            hostname = "_default_";        }    }    else if(r->parsed_uri.hostname) {        /* Copy the parsed uri hostname */        hn = apr_pstrdup(p, r->parsed_uri.hostname);        ap_str_tolower(hn);        /* const work-around */        hostname = hn;    }    else {        /* We are a proxied request, with no hostname. Unlikely         * to get very far - but just in case */        hostname = "_default_";    }    /*     * Copy the scheme, ensuring that it is lower case. If the parsed uri     * contains no string or if this is not a proxy request get the http     * scheme for this request. As r->parsed_uri.scheme is not set if this     * is a reverse proxy request, it is ensured that the cases     * "no proxy request" and "reverse proxy request" are handled in the same     * manner (see above why this is needed).     */    if (r->proxyreq && r->parsed_uri.scheme) {        /* Copy the scheme and lower-case it */        lcs = apr_pstrdup(p, r->parsed_uri.scheme);        ap_str_tolower(lcs);        /* const work-around */        scheme = lcs;    }    else {        scheme = ap_http_scheme(r);    }    /*     * If this is a proxy request, but not a reverse proxy request (see comment     * above why these cases must be handled in the same manner), copy the     * URI's port-string (which may be a service name). If the URI contains     * no port-string, use apr-util's notion of the default port for that     * scheme - if available. Otherwise use the port-number of the current     * server.     */    if(r->proxyreq && (r->proxyreq != PROXYREQ_REVERSE)) {        if (r->parsed_uri.port_str) {            port_str = apr_pcalloc(p, strlen(r->parsed_uri.port_str) + 2);            port_str[0] = ':';            for (i = 0; r->parsed_uri.port_str[i]; i++) {                port_str[i + 1] = apr_tolower(r->parsed_uri.port_str[i]);            }        }        else if (apr_uri_port_of_scheme(scheme)) {            port_str = apr_psprintf(p, ":%u", apr_uri_port_of_scheme(scheme));        }        else {            /* No port string given in the AbsoluteUri, and we have no             * idea what the default port for the scheme is. Leave it             * blank and live with the inefficiency of some extra cached             * entities.             */            port_str = "";        }    }    else {        /* Use the server port */        port_str = apr_psprintf(p, ":%u", ap_get_server_port(r));    }    /* Key format is a URI, optionally without the query-string */    if (conf->ignorequerystring) {        *key = apr_pstrcat(p, scheme, "://", hostname, port_str,                           r->parsed_uri.path, "?", NULL);    }    else {        *key = apr_pstrcat(p, scheme, "://", hostname, port_str,                           r->parsed_uri.path, "?", r->parsed_uri.query, NULL);    }    /*     * Store the key in the request_config for the cache as r->parsed_uri     * might have changed in the time from our first visit here triggered by the     * quick handler and our possible second visit triggered by the CACHE_SAVE     * filter (e.g. r->parsed_uri got unescaped). In this case we would save the     * resource in the cache under a key where it is never found by the quick     * handler during following requests.     */    cache->key = apr_pstrdup(r->pool, *key);    return APR_SUCCESS;}

⌨️ 快捷键说明

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