25#ifndef _http_cache_table_h
26#define _http_cache_table_h
51#include "InternalErr.h"
65 int code = pthread_mutex_lock((m)); \
67 throw InternalErr(__FILE__, __LINE__, string("Mutex lock: ") + strerror(code)); \
73 int code = pthread_mutex_unlock((m)); \
75 throw InternalErr(__FILE__, __LINE__, string("Mutex unlock: ") + strerror(code)); \
78#define TRYLOCK(m) pthread_mutex_trylock((m))
79#define INIT(m) pthread_mutex_init((m), 0)
80#define DESTROY(m) pthread_mutex_destroy((m))
133 time_t freshness_lifetime;
134 time_t response_time;
135 time_t corrected_initial_age;
137 bool must_revalidate;
141 pthread_mutex_t d_response_lock;
142 pthread_mutex_t d_response_write_lock;
146 friend class HTTPCacheTest;
149 friend class DeleteCacheEntry;
150 friend class WriteOneCacheEntry;
151 friend class DeleteExpired;
152 friend class DeleteByHits;
153 friend class DeleteBySize;
156 string get_cachename() {
return cachename; }
157 string get_etag() {
return etag; }
158 time_t get_lm() {
return lm; }
159 time_t get_expires() {
return expires; }
160 time_t get_max_age() {
return max_age; }
161 void set_size(
unsigned long sz) { size = sz; }
162 time_t get_freshness_lifetime() {
return freshness_lifetime; }
163 time_t get_response_time() {
return response_time; }
164 time_t get_corrected_initial_age() {
return corrected_initial_age; }
165 bool get_must_revalidate() {
return must_revalidate; }
166 void set_no_cache(
bool state) { no_cache = state; }
167 bool is_no_cache() {
return no_cache; }
169 void lock_read_response() {
170 DBG(cerr <<
"Try locking read response... (" << hex << &d_response_lock << dec <<
") ");
171 int status = TRYLOCK(&d_response_lock);
174 LOCK(&d_response_write_lock);
175 UNLOCK(&d_response_write_lock);
180 DBGN(cerr <<
"Done" << endl);
183 void unlock_read_response() {
186 DBG(cerr <<
"Unlocking read response... (" << hex << &d_response_lock << dec <<
") ");
187 UNLOCK(&d_response_lock);
188 DBGN(cerr <<
"Done" << endl);
192 void lock_write_response() {
193 DBG(cerr <<
"locking write response... (" << hex << &d_response_lock << dec <<
") ");
194 LOCK(&d_response_lock);
195 LOCK(&d_response_write_lock);
196 DBGN(cerr <<
"Done" << endl);
199 void unlock_write_response() {
200 DBG(cerr <<
"Unlocking write response... (" << hex << &d_response_lock << dec <<
") ");
201 UNLOCK(&d_response_write_lock);
202 UNLOCK(&d_response_lock);
203 DBGN(cerr <<
"Done" << endl);
207 : url(
""), hash(-1), hits(0), cachename(
""), etag(
""), lm(-1), expires(-1), date(-1), age(-1), max_age(-1),
208 size(0), range(
false), freshness_lifetime(0), response_time(0), corrected_initial_age(0),
209 must_revalidate(
false), no_cache(
false), readers(0) {
210 INIT(&d_response_lock);
211 INIT(&d_response_write_lock);
214 : url(u), hash(-1), hits(0), cachename(
""), etag(
""), lm(-1), expires(-1), date(-1), age(-1), max_age(-1),
215 size(0), range(
false), freshness_lifetime(0), response_time(0), corrected_initial_age(0),
216 must_revalidate(
false), no_cache(
false), readers(0) {
217 INIT(&d_response_lock);
218 INIT(&d_response_write_lock);
228 typedef vector<CacheEntry *> CacheEntries;
229 typedef CacheEntries::iterator CacheEntriesIter;
231 typedef CacheEntries **CacheTable;
233 friend class HTTPCacheTest;
236 CacheTable d_cache_table;
239 unsigned int d_block_size;
240 unsigned long d_current_size;
242 string d_cache_index;
245 map<FILE *, HTTPCacheTable::CacheEntry *> d_locked_entries;
252 CacheTable &get_cache_table() {
return d_cache_table; }
254 CacheEntry *get_locked_entry_from_cache_table(
int hash,
const string &url);
261 unsigned long get_current_size()
const {
return d_current_size; }
262 void set_current_size(
unsigned long sz) { d_current_size = sz; }
264 unsigned int get_block_size()
const {
return d_block_size; }
265 void set_block_size(
unsigned int sz) { d_block_size = sz; }
267 int get_new_entries()
const {
return d_new_entries; }
268 void increment_new_entries() { ++d_new_entries; }
270 string get_cache_root() {
return d_cache_root; }
271 void set_cache_root(
const string &cr) { d_cache_root = cr; }
274 void delete_expired_entries(time_t time = 0);
275 void delete_by_hits(
int hits);
276 void delete_by_size(
unsigned int size);
277 void delete_all_entries();
291 CacheEntry *get_locked_entry_from_cache_table(
const string &url);
294 void calculate_time(HTTPCacheTable::CacheEntry *entry,
int default_expiration, time_t request_time);
295 void parse_headers(HTTPCacheTable::CacheEntry *entry,
unsigned long max_entry_size,
const vector<string> &headers);
298 void bind_entry_to_data(CacheEntry *entry, FILE *body);
299 void uncouple_entry_from_data(FILE *body);
300 bool is_locked_read_responses();
void create_location(CacheEntry *entry)
void calculate_time(HTTPCacheTable::CacheEntry *entry, int default_expiration, time_t request_time)
string create_hash_directory(int hash)
bool cache_index_delete()
CacheEntry * cache_index_parse_line(const char *line)
void parse_headers(HTTPCacheTable::CacheEntry *entry, unsigned long max_entry_size, const vector< string > &headers)
CacheEntry * get_write_locked_entry_from_cache_table(const string &url)
void remove_cache_entry(HTTPCacheTable::CacheEntry *entry)
void add_entry_to_cache_table(CacheEntry *entry)
void remove_entry_from_cache_table(const string &url)
top level DAP object to house generic methods
int get_hash(const string &url)