| 1 | |
|---|
| 2 | |
|---|
| 3 | |
|---|
| 4 | |
|---|
| 5 | |
|---|
| 6 | |
|---|
| 7 | |
|---|
| 8 | |
|---|
| 9 | |
|---|
| 10 | |
|---|
| 11 | |
|---|
| 12 | |
|---|
| 13 | |
|---|
| 14 | |
|---|
| 15 | |
|---|
| 16 | |
|---|
| 17 | |
|---|
| 18 | |
|---|
| 19 | |
|---|
| 20 | |
|---|
| 21 | |
|---|
| 22 | |
|---|
| 23 | #undef MAX |
|---|
| 24 | #undef MIN |
|---|
| 25 | |
|---|
| 26 | #define MAX(x,y) ((x)<=(y)?(y):(x)) |
|---|
| 27 | #define MIN(x,y) ((x)<=(y)?(x):(y)) |
|---|
| 28 | |
|---|
| 29 | struct _HTTPRequest; |
|---|
| 30 | |
|---|
| 31 | #if defined(USHRT_MAX) && CHUNK_SIZE <= USHRT_MAX |
|---|
| 32 | typedef unsigned short chunk_size_t; |
|---|
| 33 | #else |
|---|
| 34 | typedef unsigned int chunk_size_t; |
|---|
| 35 | #endif |
|---|
| 36 | |
|---|
| 37 | typedef struct _Chunk { |
|---|
| 38 | short int locked; |
|---|
| 39 | chunk_size_t size; |
|---|
| 40 | char *data; |
|---|
| 41 | } ChunkRec, *ChunkPtr; |
|---|
| 42 | |
|---|
| 43 | struct _Object; |
|---|
| 44 | |
|---|
| 45 | typedef int (*RequestFunction)(struct _Object *, int, int, int, |
|---|
| 46 | struct _HTTPRequest*, void*); |
|---|
| 47 | |
|---|
| 48 | typedef struct _Object { |
|---|
| 49 | short refcount; |
|---|
| 50 | unsigned char type; |
|---|
| 51 | RequestFunction request; |
|---|
| 52 | void *request_closure; |
|---|
| 53 | void *key; |
|---|
| 54 | unsigned short key_size; |
|---|
| 55 | unsigned short flags; |
|---|
| 56 | unsigned short code; |
|---|
| 57 | void *abort_data; |
|---|
| 58 | struct _Atom *message; |
|---|
| 59 | int length; |
|---|
| 60 | time_t date; |
|---|
| 61 | time_t age; |
|---|
| 62 | time_t expires; |
|---|
| 63 | time_t last_modified; |
|---|
| 64 | time_t atime; |
|---|
| 65 | char *etag; |
|---|
| 66 | unsigned short cache_control; |
|---|
| 67 | int max_age; |
|---|
| 68 | int s_maxage; |
|---|
| 69 | struct _Atom *headers; |
|---|
| 70 | struct _Atom *via; |
|---|
| 71 | int size; |
|---|
| 72 | int numchunks; |
|---|
| 73 | ChunkPtr chunks; |
|---|
| 74 | void *requestor; |
|---|
| 75 | struct _Condition condition; |
|---|
| 76 | struct _DiskCacheEntry *disk_entry; |
|---|
| 77 | struct _Object *next, *previous; |
|---|
| 78 | } ObjectRec, *ObjectPtr; |
|---|
| 79 | |
|---|
| 80 | typedef struct _CacheControl { |
|---|
| 81 | int flags; |
|---|
| 82 | int max_age; |
|---|
| 83 | int s_maxage; |
|---|
| 84 | int min_fresh; |
|---|
| 85 | int max_stale; |
|---|
| 86 | } CacheControlRec, *CacheControlPtr; |
|---|
| 87 | |
|---|
| 88 | extern int cacheIsShared; |
|---|
| 89 | extern int mindlesslyCacheVary; |
|---|
| 90 | |
|---|
| 91 | extern CacheControlRec no_cache_control; |
|---|
| 92 | extern int objectExpiryScheduled; |
|---|
| 93 | extern int publicObjectCount; |
|---|
| 94 | extern int privateObjectCount; |
|---|
| 95 | extern int idleTime; |
|---|
| 96 | |
|---|
| 97 | extern const time_t time_t_max; |
|---|
| 98 | |
|---|
| 99 | extern int publicObjectLowMark, objectHighMark; |
|---|
| 100 | |
|---|
| 101 | extern int log2ObjectHashTableSize; |
|---|
| 102 | |
|---|
| 103 | |
|---|
| 104 | #define OBJECT_HTTP 1 |
|---|
| 105 | #define OBJECT_DNS 2 |
|---|
| 106 | |
|---|
| 107 | |
|---|
| 108 | |
|---|
| 109 | #define OBJECT_PUBLIC 1 |
|---|
| 110 | |
|---|
| 111 | #define OBJECT_INITIAL 2 |
|---|
| 112 | |
|---|
| 113 | #define OBJECT_INPROGRESS 4 |
|---|
| 114 | |
|---|
| 115 | #define OBJECT_SUPERSEDED 8 |
|---|
| 116 | |
|---|
| 117 | #define OBJECT_LINEAR 16 |
|---|
| 118 | |
|---|
| 119 | #define OBJECT_VALIDATING 32 |
|---|
| 120 | |
|---|
| 121 | #define OBJECT_ABORTED 64 |
|---|
| 122 | |
|---|
| 123 | #define OBJECT_FAILED 128 |
|---|
| 124 | |
|---|
| 125 | #define OBJECT_LOCAL 256 |
|---|
| 126 | |
|---|
| 127 | #define OBJECT_DISK_ENTRY_COMPLETE 512 |
|---|
| 128 | |
|---|
| 129 | #define OBJECT_DYNAMIC 1024 |
|---|
| 130 | |
|---|
| 131 | #define OBJECT_MUTATING 2048 |
|---|
| 132 | |
|---|
| 133 | |
|---|
| 134 | |
|---|
| 135 | |
|---|
| 136 | #define CACHE_NO_HIDDEN 1 |
|---|
| 137 | |
|---|
| 138 | #define CACHE_NO 2 |
|---|
| 139 | |
|---|
| 140 | #define CACHE_PUBLIC 4 |
|---|
| 141 | |
|---|
| 142 | #define CACHE_PRIVATE 8 |
|---|
| 143 | |
|---|
| 144 | #define CACHE_NO_STORE 16 |
|---|
| 145 | |
|---|
| 146 | #define CACHE_NO_TRANSFORM 32 |
|---|
| 147 | |
|---|
| 148 | #define CACHE_MUST_REVALIDATE 64 |
|---|
| 149 | |
|---|
| 150 | #define CACHE_PROXY_REVALIDATE 128 |
|---|
| 151 | |
|---|
| 152 | #define CACHE_ONLY_IF_CACHED 256 |
|---|
| 153 | |
|---|
| 154 | #define CACHE_VARY 512 |
|---|
| 155 | |
|---|
| 156 | #define CACHE_AUTHORIZATION 1024 |
|---|
| 157 | |
|---|
| 158 | #define CACHE_COOKIE 2048 |
|---|
| 159 | |
|---|
| 160 | #define CACHE_MISMATCH 4096 |
|---|
| 161 | |
|---|
| 162 | struct _HTTPRequest; |
|---|
| 163 | |
|---|
| 164 | void preinitObject(void); |
|---|
| 165 | void initObject(void); |
|---|
| 166 | ObjectPtr findObject(int type, const void *key, int key_size); |
|---|
| 167 | ObjectPtr makeObject(int type, const void *key, int key_size, |
|---|
| 168 | int public, int fromdisk, |
|---|
| 169 | int (*request)(ObjectPtr, int, int, int, |
|---|
| 170 | struct _HTTPRequest*, void*), void*); |
|---|
| 171 | void objectMetadataChanged(ObjectPtr object, int dirty); |
|---|
| 172 | ObjectPtr retainObject(ObjectPtr); |
|---|
| 173 | void releaseObject(ObjectPtr); |
|---|
| 174 | int objectSetChunks(ObjectPtr object, int numchunks); |
|---|
| 175 | void lockChunk(ObjectPtr, int); |
|---|
| 176 | void unlockChunk(ObjectPtr, int); |
|---|
| 177 | void destroyObject(ObjectPtr object); |
|---|
| 178 | void privatiseObject(ObjectPtr object, int linear); |
|---|
| 179 | void abortObject(ObjectPtr object, int code, struct _Atom *message); |
|---|
| 180 | void supersedeObject(ObjectPtr); |
|---|
| 181 | void notifyObject(ObjectPtr); |
|---|
| 182 | void releaseNotifyObject(ObjectPtr); |
|---|
| 183 | ObjectPtr objectPartial(ObjectPtr object, int length, struct _Atom *headers); |
|---|
| 184 | int objectHoleSize(ObjectPtr object, int offset) |
|---|
| 185 | ATTRIBUTE ((pure)); |
|---|
| 186 | int objectHasData(ObjectPtr object, int from, int to) |
|---|
| 187 | ATTRIBUTE ((pure)); |
|---|
| 188 | int objectAddData(ObjectPtr object, const char *data, int offset, int len); |
|---|
| 189 | void objectPrintf(ObjectPtr object, int offset, const char *format, ...) |
|---|
| 190 | ATTRIBUTE ((format (printf, 3, 4))); |
|---|
| 191 | int discardObjectsHandler(TimeEventHandlerPtr); |
|---|
| 192 | void writeoutObjects(int); |
|---|
| 193 | int discardObjects(int all, int force); |
|---|
| 194 | int objectIsStale(ObjectPtr object, CacheControlPtr cache_control) |
|---|
| 195 | ATTRIBUTE ((pure)); |
|---|
| 196 | int objectMustRevalidate(ObjectPtr object, CacheControlPtr cache_control) |
|---|
| 197 | ATTRIBUTE ((pure)); |
|---|