23#if !APR_VERSION_AT_LEAST(2,0,0)
69module AP_MODULE_DECLARE_DATA cache_socache_module;
99#define DEFAULT_MAX_FILE_SIZE 100*1024
100#define DEFAULT_MAXTIME 86400
101#define DEFAULT_MINTIME 600
102#define DEFAULT_READSIZE 0
103#define DEFAULT_READTIME 0
144 while (*
slider < buffer_len) {
176 elts = (
const char **)
arr->
elts;
201 while (*
slider < buffer_len) {
219 "Premature end of cache headers.");
268 if (3 >= buffer_len - *
slider) {
291 elts = (
const char **)
varray->elts;
317 for (
i = 0, k = 0;
i <
varray->nelts;
i++) {
322 iov[k].iov_base = (
char*) elts[
i];
323 iov[k].iov_len = strlen(elts[
i]);
325 iov[k].iov_base = (
char*) header;
326 iov[k].iov_len = strlen(header);
363 &cache_socache_module);
376 "URL %s partial content response not cached",
396 "URL '%s' had no explicit size, ignoring",
key);
401 "URL '%s' body larger than limit, ignoring "
413 "URL '%s' estimated headers size larger than limit, ignoring "
419 if (total >= dconf->
max) {
421 "URL '%s' body and headers larger than limit, ignoring "
451 &cache_socache_module);
454 unsigned int buffer_len;
490 "could not acquire lock, ignoring: %s",
obj->key);
496 buffer_len =
sobj->buffer_len;
504 "could not release lock, ignoring: %s",
obj->key);
512 "Key not found in cache: %s",
key);
517 if (buffer_len >=
sobj->buffer_len) {
519 "Key found in cache but too big, ignoring: %s",
key);
540 "Cannot parse vary entry for key: %s",
key);
553 "could not acquire lock, ignoring: %s",
obj->key);
559 buffer_len =
sobj->buffer_len;
563 &buffer_len,
r->
pool);
568 "could not release lock, ignoring: %s",
obj->key);
576 "Key not found in cache: %s",
key);
581 if (buffer_len >=
sobj->buffer_len) {
583 "Key found in cache but too big, ignoring: %s",
key);
590 "Key '%s' found in cache has version %d, expected %d, ignoring",
607 "Cache entry for key '%s' too short, removing",
nkey);
613 info->status =
sobj->socache_info.status;
614 info->date =
sobj->socache_info.date;
615 info->expire =
sobj->socache_info.expire;
616 info->request_time =
sobj->socache_info.request_time;
617 info->response_time =
sobj->socache_info.response_time;
621 if (
sobj->socache_info.name_len <= buffer_len -
slider) {
623 sobj->socache_info.name_len)) {
625 "Cache entry for key '%s' URL mismatch, ignoring",
nkey);
634 "Cache entry for key '%s' too short, removing",
nkey);
641 "HEAD request cached, non-HEAD requested, ignoring: %s",
655 "Cache entry for key '%s' response headers unreadable, removing",
nkey);
661 "Cache entry for key '%s' request headers unreadable, removing",
nkey);
697 "could not acquire lock, ignoring: %s",
obj->key);
710 "could not release lock, ignoring: %s",
obj->key);
728 &cache_socache_module);
741 "could not acquire lock, ignoring: %s",
sobj->key);
753 "could not release lock, ignoring: %s",
sobj->key);
787 &cache_socache_module);
816 if (
sobj->headers_out) {
829 sizeof(
obj->info.expire));
838 "buffer too small for Vary array, caching aborted: %s",
848 "could not acquire lock, ignoring: %s",
obj->key);
856 (
unsigned char *)
obj->key, strlen(
obj->key),
sobj->expire,
857 (
unsigned char *)
sobj->buffer, (
unsigned int)
slider,
863 "could not release lock, ignoring: %s",
obj->key);
868 "Vary not written to cache, ignoring: %s",
obj->key);
880 socache_info->
date =
obj->info.date;
901 "cache buffer too small for name: %s",
910 if (
sobj->headers_out) {
914 "out-headers didn't fit in buffer: %s",
sobj->name);
923 if (
sobj->headers_in) {
927 "in-headers didn't fit in buffer %s",
958 if (!
sobj->newbody) {
959 sobj->body_length = 0;
1008 "Error when reading bucket for URL %s",
1022 if (
sobj->body_length >=
sobj->buffer_len -
sobj->body_offset) {
1024 "URL %s failed the buffer size check "
1026 h->cache_obj->key,
sobj->body_length,
1027 sobj->buffer_len -
sobj->body_offset);
1041 if (
sobj->offset <= 0) {
1060 "Discarding body for URL %s "
1061 "because connection has been aborted.",
1070 ||
cl !=
sobj->body_length)) {
1072 "URL %s didn't receive complete response, not caching",
1089 &cache_socache_module);
1098 "could not acquire lock, ignoring: %s",
obj->key);
1106 (
unsigned char *)
sobj->key, strlen(
sobj->key),
sobj->expire,
1112 "could not release lock, ignoring: %s",
obj->key);
1120 "could not write to cache, ignoring: %s",
sobj->key);
1125 "commit_entity: Headers and body for URL %s cached for maximum of %d seconds.",
1141 "could not acquire lock, ignoring: %s",
obj->key);
1153 "could not release lock, ignoring: %s",
obj->key);
1165 h->cache_obj->info.control.invalidated = 1;
1232 &cache_socache_module);
1253 "Unknown socache provider '%s'. Maybe you need "
1254 "to load the appropriate socache module "
1267 return "CacheSocacheMaxSize argument must be a integer representing "
1268 "the max size of a cached entry (headers and body), at least 1024 "
1282 return "CacheSocacheMaxTime argument must be the maximum amount of time in seconds to cache an entry.";
1296 return "CacheSocacheMinTime argument must be the minimum amount of time in seconds to cache an entry.";
1310 return "CacheSocacheReadSize argument must be a non-negative integer representing the max amount of data to cache in go.";
1324 return "CacheSocacheReadTime argument must be a non-negative integer representing the max amount of time taken to cache in go.";
1357 &cache_socache_module);
1365 "<table cellspacing=0 cellpadding=0>\n"
1366 "<tr><td bgcolor=\"#000000\">\n"
1367 "<b><font color=\"#ffffff\" face=\"Arial,Helvetica\">"
1368 "mod_cache_socache Status:</font></b>\n"
1370 "<tr><td bgcolor=\"#ffffff\">\n",
r);
1380 "could not acquire lock for cache status");
1386 ap_rputs(
"No cache status data available\n",
r);
1400 "could not release lock for cache status");
1438 { 64, 2048, 60000000 };
1440 for (
s = base_server;
s;
s =
s->
next) {
1498 "failed to initialise mutex in child_init");
1505 "The shared object cache to store cache files"),
1507 "The maximum cache expiry age to cache a document in seconds"),
1509 "The minimum cache expiry age to cache a document in seconds"),
1511 "The maximum cache entry size (headers and body) to cache a document"),
1513 "The maximum quantity of data to attempt to read and cache in one go"),
1515 "The maximum time taken to attempt to read and cache in go"),
const char apr_size_t len
Small object cache provider interface.
APR-UTIL Buckets/Bucket Brigades.
APR general purpose library routines.
APR Versioning Interface.
APR-util Versioning Interface.
Common Shared Object Cache vars/structs.
static apr_pool_t * pconf
#define AP_INIT_TAKE1(directive, func, mconfig, where, help)
#define ap_get_module_config(v, m)
void ap_hook_post_config(ap_HOOK_post_config_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
#define AP_DECLARE_MODULE(foo)
void ap_hook_pre_config(ap_HOOK_pre_config_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
const char server_rec server_rec ** ps
void ap_hook_child_init(ap_HOOK_child_init_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
apr_status_t ap_global_mutex_create(apr_global_mutex_t **mutex, const char **name, const char *type, const char *instance_id, server_rec *server, apr_pool_t *pool, apr_int32_t options)
apr_status_t ap_mutex_register(apr_pool_t *pconf, const char *type, const char *default_dir, apr_lockmech_e default_mech, apr_int32_t options)
static APR_INLINE int ap_rputs(const char *str, request_rec *r)
apr_status_t ap_register_provider(apr_pool_t *pool, const char *provider_group, const char *provider_name, const char *provider_version, const void *provider)
void * ap_lookup_provider(const char *provider_group, const char *provider_name, const char *provider_version)
ap_vhost_iterate_conn_cb void * baton
#define APR_BUCKET_IS_FLUSH(e)
#define APR_BUCKET_REMOVE(e)
#define APR_BUCKET_IS_METADATA(e)
#define APR_BRIGADE_INSERT_TAIL(b, e)
#define APR_BRIGADE_CONCAT(a, b)
#define APR_BRIGADE_EMPTY(b)
#define APR_BUCKET_IS_EOS(e)
#define APR_BRIGADE_FIRST(b)
#define apr_bucket_read(e, str, len, block)
apr_pool_t const char apr_dbd_t ** handle
const char apr_ssize_t int flags
const void apr_size_t int colon
#define APR_OPTIONAL_HOOK(ns, name, pfn, aszPre, aszSucc, nOrder)
#define AP_SOCACHE_PROVIDER_GROUP
#define AP_SOCACHE_FLAG_NOTMPSAFE
#define AP_SOCACHE_PROVIDER_VERSION
#define CACHE_SOCACHE_VARY_FORMAT_VERSION
#define CACHE_SOCACHE_DISK_FORMAT_VERSION
#define HTTP_NOT_MODIFIED
#define HTTP_PARTIAL_CONTENT
#define CACHE_PROVIDER_GROUP
apr_table_t * ap_cache_cacheable_headers_in(request_rec *r)
apr_table_t * ap_cache_cacheable_headers_out(request_rec *r)
#define STANDARD20_MODULE_STUFF
#define ap_strchr_c(s, c)
char * ap_get_list_item(apr_pool_t *p, const char **field)
int ap_parse_strict_length(apr_off_t *len, const char *str)
const struct iovec apr_size_t nvec
apr_vformatter_buff_t const char va_list ap
#define apr_pool_create(newpool, parent)
#define apr_pcalloc(p, size)
const apr_array_header_t * arr
apr_int32_t apr_int32_t apr_int32_t err
#define apr_time_from_msec(msec)
#define apr_time_sec(time)
#define apr_time_from_sec(sec)
Main include file for the Apache Transparent Cache.
static void cache_socache_register_hook(apr_pool_t *p)
static apr_status_t remove_lock(void *data)
static apr_status_t recall_body(cache_handle_t *h, apr_pool_t *p, apr_bucket_brigade *bb)
static const char *const cache_socache_id
#define DEFAULT_MAX_FILE_SIZE
static int remove_entity(cache_handle_t *h)
static apr_status_t store_body(cache_handle_t *h, request_rec *r, apr_bucket_brigade *in, apr_bucket_brigade *out)
static void socache_status_register(apr_pool_t *p)
static apr_status_t commit_entity(cache_handle_t *h, request_rec *r)
static int socache_post_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptmp, server_rec *base_server)
static void * create_dir_config(apr_pool_t *p, char *dummy)
static int create_entity(cache_handle_t *h, request_rec *r, const char *key, apr_off_t len, apr_bucket_brigade *bb)
static const char * set_cache_maxtime(cmd_parms *parms, void *in_struct_ptr, const char *arg)
static int socache_status_hook(request_rec *r, int flags)
static apr_status_t store_table(apr_table_t *table, unsigned char *buffer, apr_size_t buffer_len, apr_size_t *slider)
static apr_status_t read_array(request_rec *r, apr_array_header_t *arr, unsigned char *buffer, apr_size_t buffer_len, apr_size_t *slider)
static int array_alphasort(const void *fn1, const void *fn2)
static apr_status_t destroy_cache(void *data)
static const char * set_cache_readsize(cmd_parms *parms, void *in_struct_ptr, const char *arg)
static void * merge_dir_config(apr_pool_t *p, void *basev, void *addv)
static apr_status_t invalidate_entity(cache_handle_t *h, request_rec *r)
static const command_rec cache_socache_cmds[]
static void * merge_config(apr_pool_t *p, void *basev, void *overridesv)
static const char * set_cache_mintime(cmd_parms *parms, void *in_struct_ptr, const char *arg)
static const char * set_cache_socache(cmd_parms *cmd, void *in_struct_ptr, const char *arg)
static void socache_child_init(apr_pool_t *p, server_rec *s)
static void tokens_to_array(apr_pool_t *p, const char *data, apr_array_header_t *arr)
static const char * set_cache_max(cmd_parms *parms, void *in_struct_ptr, const char *arg)
static void * create_config(apr_pool_t *p, server_rec *s)
static int open_entity(cache_handle_t *h, request_rec *r, const char *key)
static apr_global_mutex_t * socache_mutex
static int socache_precfg(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptmp)
static apr_status_t recall_headers(cache_handle_t *h, request_rec *r)
static apr_status_t store_headers(cache_handle_t *h, request_rec *r, cache_info *info)
static const cache_provider cache_socache_provider
static const char * regen_key(apr_pool_t *p, apr_table_t *headers, apr_array_header_t *varray, const char *oldkey, apr_size_t *newkeylen)
static apr_status_t store_array(apr_array_header_t *arr, unsigned char *buffer, apr_size_t buffer_len, apr_size_t *slider)
static const char * set_cache_readtime(cmd_parms *parms, void *in_struct_ptr, const char *arg)
static apr_status_t sobj_body_pre_cleanup(void *baton)
static int remove_url(cache_handle_t *h, request_rec *r)
static apr_status_t read_table(cache_handle_t *handle, request_rec *r, apr_table_t *table, unsigned char *buffer, apr_size_t buffer_len, apr_size_t *slider)
Status Report Extension Module to Apache.
apr_status_t(* store)(ap_socache_instance_t *instance, server_rec *s, const unsigned char *id, unsigned int idlen, apr_time_t expiry, unsigned char *data, unsigned int datalen, apr_pool_t *pool)
const char *(* create)(ap_socache_instance_t **instance, const char *arg, apr_pool_t *tmp, apr_pool_t *p)
void(* status)(ap_socache_instance_t *instance, request_rec *r, int flags)
apr_status_t(* remove)(ap_socache_instance_t *instance, server_rec *s, const unsigned char *id, unsigned int idlen, apr_pool_t *pool)
void(* destroy)(ap_socache_instance_t *instance, server_rec *s)
apr_status_t(* init)(ap_socache_instance_t *instance, const char *cname, const struct ap_socache_hints *hints, server_rec *s, apr_pool_t *pool)
apr_status_t(* retrieve)(ap_socache_instance_t *instance, server_rec *s, const unsigned char *id, unsigned int idlen, unsigned char *data, unsigned int *datalen, apr_pool_t *pool)
cache_socache_provider_conf * provider
unsigned int readtime_set
unsigned int readsize_set
apr_size_t entity_version
cache_socache_info_t socache_info
apr_table_t * headers_out
apr_bucket_brigade * body
ap_socache_provider_t * socache_provider
ap_socache_instance_t * socache_instance
struct apr_bucket_alloc_t * bucket_alloc
A structure that represents the current request.
struct ap_conf_vector_t * per_dir_config
apr_table_t * headers_out
A structure to store information for each virtual server.
struct ap_conf_vector_t * module_config
Apache Mutex support library.