#include "mod_cache.h"
#include "cache_storage.h"
+#include "cache_util.h"
APLOG_USE_MODULE(cache);
cache->provider_name = list->provider_name;
/* Is our cached response fresh enough? */
- fresh = ap_cache_check_freshness(h, cache, r);
+ fresh = cache_check_freshness(h, cache, r);
if (!fresh) {
const char *etag, *lastmod;
--- /dev/null
+/* Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
+/**
+ * @file cache_util.h
+ * @brief Cache Storage Functions
+ *
+ * @defgroup Cache_util Cache Utility Functions
+ * @ingroup MOD_CACHE
+ * @{
+ */
+
+#ifndef CACHE_UTIL_H
+#define CACHE_UTIL_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "mod_cache.h"
+
+/**
+ * cache_util.c
+ */
+
+/**
+ * Check the freshness of the cache object per RFC2616 section 13.2 (Expiration Model)
+ * @param h cache_handle_t
+ * @param r request_rec
+ * @return 0 ==> cache object is stale, 1 ==> cache object is fresh
+ */
+int cache_check_freshness(cache_handle_t *h, cache_request_rec *cache,
+ request_rec *r);
+
+/**
+ * Try obtain a cache wide lock on the given cache key.
+ *
+ * If we return APR_SUCCESS, we obtained the lock, and we are clear to
+ * proceed to the backend. If we return APR_EEXISTS, the the lock is
+ * already locked, someone else has gone to refresh the backend data
+ * already, so we must return stale data with a warning in the mean
+ * time. If we return anything else, then something has gone pear
+ * shaped, and we allow the request through to the backend regardless.
+ *
+ * This lock is created from the request pool, meaning that should
+ * something go wrong and the lock isn't deleted on return of the
+ * request headers from the backend for whatever reason, at worst the
+ * lock will be cleaned up when the request is dies or finishes.
+ *
+ * If something goes truly bananas and the lock isn't deleted when the
+ * request dies, the lock will be trashed when its max-age is reached,
+ * or when a request arrives containing a Cache-Control: no-cache. At
+ * no point is it possible for this lock to permanently deny access to
+ * the backend.
+ */
+apr_status_t cache_try_lock(cache_server_conf *conf,
+ cache_request_rec *cache, request_rec *r, char *key);
+
+/**
+ * Remove the cache lock, if present.
+ *
+ * First, try to close the file handle, whose delete-on-close should
+ * kill the file. Otherwise, just delete the file by name.
+ *
+ * If no lock name has yet been calculated, do the calculation of the
+ * lock name first before trying to delete the file.
+ *
+ * If an optional bucket brigade is passed, the lock will only be
+ * removed if the bucket brigade contains an EOS bucket.
+ */
+apr_status_t cache_remove_lock(cache_server_conf *conf,
+ cache_request_rec *cache, request_rec *r, char *key,
+ apr_bucket_brigade *bb);
+
+/**
+ * Merge in cached headers into the response
+ * @param h cache_handle_t
+ * @param r request_rec
+ * @param preserve_orig If 1, the values in r->headers_out are preserved.
+ * Otherwise, they are overwritten by the cached value.
+ */
+void cache_accept_headers(cache_handle_t *h, request_rec *r,
+ int preserve_orig);
+
+cache_provider_list *cache_get_providers(request_rec *r,
+ cache_server_conf *conf, apr_uri_t uri);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !CACHE_UTIL_H */
+/** @} */
#include "mod_cache.h"
#include "cache_storage.h"
+#include "cache_util.h"
module AP_MODULE_DECLARE_DATA cache_module;
APR_OPTIONAL_FN_TYPE(ap_cache_generate_key) *cache_generate_key;
/*
* Which cache module (if any) should handle this request?
*/
- if (!(providers = ap_cache_get_providers(r, conf, r->parsed_uri))) {
+ if (!(providers = cache_get_providers(r, conf, r->parsed_uri))) {
return DECLINED;
}
* backend without any attempt to cache. this stops
* duplicated simultaneous attempts to cache an entity.
*/
- rv = ap_cache_try_lock(conf, cache, r, NULL);
+ rv = cache_try_lock(conf, cache, r, NULL);
if (APR_SUCCESS == rv) {
/*
/*
* Which cache module (if any) should handle this request?
*/
- if (!(providers = ap_cache_get_providers(r, conf, r->parsed_uri))) {
+ if (!(providers = cache_get_providers(r, conf, r->parsed_uri))) {
return DECLINED;
}
* backend without any attempt to cache. this stops
* duplicated simultaneous attempts to cache an entity.
*/
- rv = ap_cache_try_lock(conf, cache, r, NULL);
+ rv = cache_try_lock(conf, cache, r, NULL);
if (APR_SUCCESS == rv) {
/*
ap_remove_output_filter(f);
/* give someone else the chance to cache the file */
- ap_cache_remove_lock(conf, cache, f->r, cache->handle ?
+ cache_remove_lock(conf, cache, f->r, cache->handle ?
(char *)cache->handle->cache_obj->key : NULL, NULL);
/* give up trying to cache, just step out the way */
}
/* conditionally remove the lock as soon as we see the eos bucket */
- ap_cache_remove_lock(conf, cache, f->r, cache->handle ?
+ cache_remove_lock(conf, cache, f->r, cache->handle ?
(char *)cache->handle->cache_obj->key : NULL, cache->out);
if (APR_BRIGADE_EMPTY(cache->out)) {
ap_remove_output_filter(f);
/* give someone else the chance to cache the file */
- ap_cache_remove_lock(conf, cache, f->r, cache->handle ?
+ cache_remove_lock(conf, cache, f->r, cache->handle ?
(char *)cache->handle->cache_obj->key : NULL, NULL);
return ap_pass_brigade(f->next, in);
ap_remove_output_filter(f);
/* remove the lock file unconditionally */
- ap_cache_remove_lock(conf, cache, r, cache->handle ?
+ cache_remove_lock(conf, cache, r, cache->handle ?
(char *)cache->handle->cache_obj->key : NULL, NULL);
/* ship the data up the stack */
if (rv != OK) {
/* Caching layer declined the opportunity to cache the response */
ap_remove_output_filter(f);
- ap_cache_remove_lock(conf, cache, r, cache->handle ?
+ cache_remove_lock(conf, cache, r, cache->handle ?
(char *)cache->handle->cache_obj->key : NULL, NULL);
return ap_pass_brigade(f->next, in);
}
r->headers_out = ap_cache_cacheable_headers_out(r);
/* Merge in our cached headers. However, keep any updated values. */
- ap_cache_accept_headers(cache->handle, r, 1);
+ cache_accept_headers(cache->handle, r, 1);
}
/* Write away header information to cache. It is possible that we are
}
/* let someone else attempt to cache */
- ap_cache_remove_lock(conf, cache, r, cache->handle ?
+ cache_remove_lock(conf, cache, r, cache->handle ?
(char *)cache->handle->cache_obj->key : NULL, NULL);
return ap_pass_brigade(f->next, bb);
"cache: store_headers failed");
ap_remove_output_filter(f);
- ap_cache_remove_lock(conf, cache, r, cache->handle ?
+ cache_remove_lock(conf, cache, r, cache->handle ?
(char *)cache->handle->cache_obj->key : NULL, NULL);
return ap_pass_brigade(f->next, in);
}
CACHE_DECLARE(apr_time_t) ap_cache_current_age(cache_info *info, const apr_time_t age_value,
apr_time_t now);
-/**
- * Check the freshness of the cache object per RFC2616 section 13.2 (Expiration Model)
- * @param h cache_handle_t
- * @param r request_rec
- * @return 0 ==> cache object is stale, 1 ==> cache object is fresh
- */
-CACHE_DECLARE(int) ap_cache_check_freshness(cache_handle_t *h, cache_request_rec *cache,
- request_rec *r);
-
/**
* Check the whether the request allows a cached object to be served as per RFC2616
* section 14.9.4 (Cache Revalidation and Reload Controls)
*/
CACHE_DECLARE(int) ap_cache_check_allowed(request_rec *r);
-/**
- * Try obtain a cache wide lock on the given cache key.
- *
- * If we return APR_SUCCESS, we obtained the lock, and we are clear to
- * proceed to the backend. If we return APR_EEXISTS, the the lock is
- * already locked, someone else has gone to refresh the backend data
- * already, so we must return stale data with a warning in the mean
- * time. If we return anything else, then something has gone pear
- * shaped, and we allow the request through to the backend regardless.
- *
- * This lock is created from the request pool, meaning that should
- * something go wrong and the lock isn't deleted on return of the
- * request headers from the backend for whatever reason, at worst the
- * lock will be cleaned up when the request is dies or finishes.
- *
- * If something goes truly bananas and the lock isn't deleted when the
- * request dies, the lock will be trashed when its max-age is reached,
- * or when a request arrives containing a Cache-Control: no-cache. At
- * no point is it possible for this lock to permanently deny access to
- * the backend.
- */
-CACHE_DECLARE(apr_status_t) ap_cache_try_lock(cache_server_conf *conf,
- cache_request_rec *cache, request_rec *r, char *key);
-
-/**
- * Remove the cache lock, if present.
- *
- * First, try to close the file handle, whose delete-on-close should
- * kill the file. Otherwise, just delete the file by name.
- *
- * If no lock name has yet been calculated, do the calculation of the
- * lock name first before trying to delete the file.
- *
- * If an optional bucket brigade is passed, the lock will only be
- * removed if the bucket brigade contains an EOS bucket.
- */
-CACHE_DECLARE(apr_status_t) ap_cache_remove_lock(cache_server_conf *conf,
- cache_request_rec *cache, request_rec *r, char *key,
- apr_bucket_brigade *bb);
-
-/**
- * Merge in cached headers into the response
- * @param h cache_handle_t
- * @param r request_rec
- * @param preserve_orig If 1, the values in r->headers_out are preserved.
- * Otherwise, they are overwritten by the cached value.
- */
-CACHE_DECLARE(void) ap_cache_accept_headers(cache_handle_t *h, request_rec *r,
- int preserve_orig);
-
CACHE_DECLARE(apr_time_t) ap_cache_hex2usec(const char *x);
CACHE_DECLARE(void) ap_cache_usec2hex(apr_time_t j, char *y);
CACHE_DECLARE(char *) ap_cache_generate_name(apr_pool_t *p, int dirlevels,
int dirlength,
const char *name);
-CACHE_DECLARE(cache_provider_list *)ap_cache_get_providers(request_rec *r, cache_server_conf *conf, apr_uri_t uri);
CACHE_DECLARE(int) ap_cache_liststr(apr_pool_t *p, const char *list,
const char *key, char **val);
CACHE_DECLARE(const char *)ap_cache_tokstr(apr_pool_t *p, const char *list, const char **str);