#ifndef MOD_CACHE_H
#define MOD_CACHE_H
#define CORE_PRIVATE
#include "apr_hooks.h"
#include "apr.h"
#include "apr_lib.h"
#include "apr_strings.h"
#include "apr_buckets.h"
#include "apr_md5.h"
#include "apr_pools.h"
#include "apr_strings.h"
#include "apr_optional.h"
#define APR_WANT_STRFUNC
#include "apr_want.h"
#include "httpd.h"
#include "http_config.h"
#include "ap_config.h"
#include "http_core.h"
#include "http_protocol.h"
#include "http_request.h"
#include "http_vhost.h"
#include "http_main.h"
#include "http_log.h"
#include "http_connection.h"
#include "util_filter.h"
#include "apr_date.h"
#include "apr_uri.h"
#ifdef HAVE_NETDB_H
#include <netdb.h>
#endif
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#endif
#ifdef HAVE_NETINET_IN_H
#include <netinet/in.h>
#endif
#ifdef HAVE_ARPA_INET_H
#include <arpa/inet.h>
#endif
#include "apr_atomic.h"
#ifndef MAX
#define MAX(a,b) ((a) > (b) ? (a) : (b))
#endif
#ifndef MIN
#define MIN(a,b) ((a) < (b) ? (a) : (b))
#endif
#define MSEC_ONE_DAY ((apr_time_t)(86400*APR_USEC_PER_SEC))
#define MSEC_ONE_HR ((apr_time_t)(3600*APR_USEC_PER_SEC))
#define MSEC_ONE_MIN ((apr_time_t)(60*APR_USEC_PER_SEC))
#define MSEC_ONE_SEC ((apr_time_t)(APR_USEC_PER_SEC))
#define DEFAULT_CACHE_MAXEXPIRE MSEC_ONE_DAY
#define DEFAULT_CACHE_EXPIRE MSEC_ONE_HR
#define DEFAULT_CACHE_LMFACTOR (0.1)
#define DEFAULT_CACHE_MAXAGE 5
#define DEFAULT_CACHE_LOCKPATH "/mod_cache-lock"
#define CACHE_LOCKNAME_KEY "mod_cache-lockname"
#define CACHE_LOCKFILE_KEY "mod_cache-lockfile"
#if !defined(WIN32)
#define CACHE_DECLARE(type) type
#define CACHE_DECLARE_NONSTD(type) type
#define CACHE_DECLARE_DATA
#elif defined(CACHE_DECLARE_STATIC)
#define CACHE_DECLARE(type) type __stdcall
#define CACHE_DECLARE_NONSTD(type) type
#define CACHE_DECLARE_DATA
#elif defined(CACHE_DECLARE_EXPORT)
#define CACHE_DECLARE(type) __declspec(dllexport) type __stdcall
#define CACHE_DECLARE_NONSTD(type) __declspec(dllexport) type
#define CACHE_DECLARE_DATA __declspec(dllexport)
#else
#define CACHE_DECLARE(type) __declspec(dllimport) type __stdcall
#define CACHE_DECLARE_NONSTD(type) __declspec(dllimport) type
#define CACHE_DECLARE_DATA __declspec(dllimport)
#endif
struct cache_enable {
apr_uri_t url;
const char *type;
apr_size_t pathlen;
};
struct cache_disable {
apr_uri_t url;
apr_size_t pathlen;
};
typedef struct {
apr_array_header_t *cacheenable;
apr_array_header_t *cachedisable;
apr_time_t maxex;
int maxex_set;
apr_time_t defex;
int defex_set;
double factor;
int factor_set;
int no_last_mod_ignore_set;
int no_last_mod_ignore;
int ignorecachecontrol;
int ignorecachecontrol_set;
int store_private;
int store_private_set;
int store_nostore;
int store_nostore_set;
apr_array_header_t *ignore_headers;
#define CACHE_IGNORE_HEADERS_SET 1
#define CACHE_IGNORE_HEADERS_UNSET 0
int ignore_headers_set;
int ignorequerystring;
int ignorequerystring_set;
apr_array_header_t *ignore_session_id;
#define CACHE_IGNORE_SESSION_ID_SET 1
#define CACHE_IGNORE_SESSION_ID_UNSET 0
int ignore_session_id_set;
int lock;
int lock_set;
const char *lockpath;
int lockpath_set;
apr_time_t lockmaxage;
int lockmaxage_set;
} cache_server_conf;
typedef struct cache_info cache_info;
struct cache_info {
int status;
apr_time_t date;
apr_time_t expire;
apr_time_t request_time;
apr_time_t response_time;
};
typedef struct cache_object cache_object_t;
struct cache_object {
const char *key;
cache_object_t *next;
cache_info info;
void *vobj;
apr_size_t count;
int complete;
apr_uint32_t refcount;
};
typedef struct cache_handle cache_handle_t;
struct cache_handle {
cache_object_t *cache_obj;
apr_table_t *req_hdrs;
apr_table_t *resp_hdrs;
};
#define CACHE_PROVIDER_GROUP "cache"
typedef struct {
int (*remove_entity) (cache_handle_t *h);
apr_status_t (*store_headers)(cache_handle_t *h, request_rec *r, cache_info *i);
apr_status_t (*store_body)(cache_handle_t *h, request_rec *r, apr_bucket_brigade *b);
apr_status_t (*recall_headers) (cache_handle_t *h, request_rec *r);
apr_status_t (*recall_body) (cache_handle_t *h, apr_pool_t *p, apr_bucket_brigade *bb);
int (*create_entity) (cache_handle_t *h, request_rec *r,
const char *urlkey, apr_off_t len);
int (*open_entity) (cache_handle_t *h, request_rec *r,
const char *urlkey);
int (*remove_url) (cache_handle_t *h, apr_pool_t *p);
} cache_provider;
typedef struct cache_provider_list cache_provider_list;
struct cache_provider_list {
const char *provider_name;
const cache_provider *provider;
cache_provider_list *next;
};
typedef struct {
cache_provider_list *providers;
const cache_provider *provider;
const char *provider_name;
int fresh;
cache_handle_t *handle;
cache_handle_t *stale_handle;
apr_table_t *stale_headers;
int in_checked;
int block_response;
apr_bucket_brigade *saved_brigade;
apr_off_t saved_size;
apr_time_t exp;
apr_time_t lastmod;
cache_info *info;
ap_filter_t *remove_url_filter;
char *key;
} cache_request_rec;
CACHE_DECLARE(apr_time_t) ap_cache_current_age(cache_info *info, const apr_time_t age_value,
apr_time_t now);
CACHE_DECLARE(int) ap_cache_check_freshness(cache_handle_t *h, request_rec *r);
CACHE_DECLARE(int) ap_cache_check_allowed(request_rec *r);
CACHE_DECLARE(apr_status_t) ap_cache_try_lock(cache_server_conf *conf,
request_rec *r, char *key);
CACHE_DECLARE(apr_status_t) ap_cache_remove_lock(cache_server_conf *conf,
request_rec *r, char *key, apr_bucket_brigade *bb);
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);
CACHE_DECLARE(apr_table_t *)ap_cache_cacheable_hdrs_out(apr_pool_t *pool,
apr_table_t *t,
server_rec *s);
int cache_remove_url(cache_request_rec *cache, apr_pool_t *p);
int cache_create_entity(request_rec *r, apr_off_t size);
int cache_select(request_rec *r);
apr_status_t cache_generate_key_default( request_rec *r, apr_pool_t*p, char**key );
const char* cache_create_key( request_rec*r );
#if !defined(WIN32)
#define CACHE_DECLARE(type) type
#define CACHE_DECLARE_NONSTD(type) type
#define CACHE_DECLARE_DATA
#elif defined(CACHE_DECLARE_STATIC)
#define CACHE_DECLARE(type) type __stdcall
#define CACHE_DECLARE_NONSTD(type) type
#define CACHE_DECLARE_DATA
#elif defined(CACHE_DECLARE_EXPORT)
#define CACHE_DECLARE(type) __declspec(dllexport) type __stdcall
#define CACHE_DECLARE_NONSTD(type) __declspec(dllexport) type
#define CACHE_DECLARE_DATA __declspec(dllexport)
#else
#define CACHE_DECLARE(type) __declspec(dllimport) type __stdcall
#define CACHE_DECLARE_NONSTD(type) __declspec(dllimport) type
#define CACHE_DECLARE_DATA __declspec(dllimport)
#endif
APR_DECLARE_OPTIONAL_FN(apr_status_t,
ap_cache_generate_key,
(request_rec *r, apr_pool_t*p, char**key ));
#endif