This possibly follows an earlier message:
<[EMAIL PROTECTED]>
2002/08/14 00:07:44 commit of cache_pqueue.h changed typedefs for
callbacks from function declarations to function pointers. Following
this, cache_cache(_make_money_fast).c failed to compile. I could fix
either, but being strongly in favor of typedefs of function
definitions, I patched cache_pqueue.{h,c}.
Argument for function definitions typedefs:
You can use the typedef to declare your function.
someLib.h:
typedef int (adder)(int origValue);
void registerAddr(adder* addMe);
myCode.c
adder MyAdder;
int main () {registerAddr(&MyAddr);}
int MyAdder (int origValue) {return origValue+7;}
If adder were a function pointer
typedef int (adder)(int origValue);
I wouldn't be able to use it in forward declarations/sanity checks like
adder MyAdder;
This mattered to me as I was testing some disk caching proxy patches.
These are included, but not tested. I should get to that in the next
couple of days.
--
-eric
([EMAIL PROTECTED])
Feel free to forward this message to any list for any purpose other than
email address distribution.
Index: httpd-2.0/modules/experimental/cache_pqueue.c
===================================================================
RCS file: /home/cvspublic/httpd-2.0/modules/experimental/cache_pqueue.c,v
retrieving revision 1.12
diff -u -r1.12 cache_pqueue.c
--- httpd-2.0/modules/experimental/cache_pqueue.c 14 Aug 2002 01:24:16 -0000
1.12
+++ httpd-2.0/modules/experimental/cache_pqueue.c 16 Aug 2002 13:19:28 -0000
@@ -81,9 +81,9 @@
apr_ssize_t size;
apr_ssize_t avail;
apr_ssize_t step;
- cache_pqueue_get_priority pri;
- cache_pqueue_getpos get;
- cache_pqueue_setpos set;
+ cache_pqueue_get_priority* pri;
+ cache_pqueue_getpos* get;
+ cache_pqueue_setpos* set;
void **d;
};
Index: httpd-2.0/modules/experimental/cache_pqueue.h
===================================================================
RCS file: /home/cvspublic/httpd-2.0/modules/experimental/cache_pqueue.h,v
retrieving revision 1.4
diff -u -r1.4 cache_pqueue.h
--- httpd-2.0/modules/experimental/cache_pqueue.h 14 Aug 2002 00:07:44 -0000
1.4
+++ httpd-2.0/modules/experimental/cache_pqueue.h 16 Aug 2002 13:19:28 -0000
@@ -78,21 +78,21 @@
* @param a the element
* @return the score (the lower the score the longer it is kept int the queue)
*/
-typedef long (*cache_pqueue_set_priority)(long queue_clock, void *a);
-typedef long (*cache_pqueue_get_priority)(void *a);
+typedef long (cache_pqueue_set_priority)(long queue_clock, void *a);
+typedef long (cache_pqueue_get_priority)(void *a);
/** callback function to get a position of a element */
-typedef apr_ssize_t (*cache_pqueue_getpos)(void *a);
+typedef apr_ssize_t (cache_pqueue_getpos)(void *a);
/**
* callback function to set a position of a element
* @param a the element
* @param pos the position to set it to
*/
-typedef void (*cache_pqueue_setpos)(void *a, apr_ssize_t pos);
+typedef void (cache_pqueue_setpos)(void *a, apr_ssize_t pos);
/** debug callback function to print a entry */
-typedef void (*cache_pqueue_print_entry)(FILE *out, void *a);
+typedef void (cache_pqueue_print_entry)(FILE *out, void *a);
/**
* initialize the queue
Index: httpd-2.0/modules/experimental/cache_storage.c
===================================================================
RCS file: /home/cvspublic/httpd-2.0/modules/experimental/cache_storage.c,v
retrieving revision 1.25
diff -u -r1.25 cache_storage.c
--- httpd-2.0/modules/experimental/cache_storage.c 23 Jun 2002 06:10:00 -0000
1.25
+++ httpd-2.0/modules/experimental/cache_storage.c 1 Aug 2002 06:38:22 -0000
@@ -154,6 +154,16 @@
return 1;
}
+static apr_status_t _failCache (request_rec *r, cache_request_rec *cache) {
+ /* headers do not match, so Vary failed */
+ ap_log_error(APLOG_MARK, APLOG_INFO, APR_SUCCESS, r->server,
+ "cache_select_url(): Vary header mismatch - Cached document cannot be
+used. \n");
+ apr_table_clear(r->headers_out);
+ r->status_line = NULL;
+ cache->handle = NULL;
+ return DECLINED;
+}
+
/*
* select a specific URL entity in the cache
*
@@ -209,7 +219,7 @@
*
* RFC2616 13.6 and 14.44 describe the Vary mechanism.
*/
- vary = apr_pstrdup(r->pool, apr_table_get(r->headers_out, "Vary"));
+ vary = apr_pstrdup(r->pool, apr_table_get(r->err_headers_out, "Vary"));
while (vary && *vary) {
char *name = vary;
const char *h1, *h2;
@@ -222,12 +232,14 @@
++vary;
}
- /*
- * is this header in the request and the header in the cached
- * request identical? If not, we give up and do a straight get
- */
- h1 = apr_table_get(r->headers_in, name);
- h2 = apr_table_get(h->req_hdrs, name);
+ {
+ /*
+ * Are this header in the request and the header in the cached
+ * request identical? If not, we give up and do a straight GET.
+ */
+ h1 = apr_table_get(r->headers_in, name);
+ h2 = apr_table_get(h->req_hdrs, name);
+ }
if (h1 == h2) {
/* both headers NULL, so a match - do nothing */
}
@@ -235,13 +247,7 @@
/* both headers exist and are equal - do nothing */
}
else {
- /* headers do not match, so Vary failed */
- ap_log_error(APLOG_MARK, APLOG_INFO, APR_SUCCESS, r->server,
- "cache_select_url(): Vary header mismatch - Cached
document cannot be used. \n");
- apr_table_clear(r->headers_out);
- r->status_line = NULL;
- cache->handle = NULL;
- return DECLINED;
+ return _failCache(r, cache);
}
}
return OK;
@@ -283,7 +289,8 @@
return rv;
}
- r->filename = apr_pstrdup(r->pool, info->filename );
+ if (info->filename) /* EGP: bug report Message-Id:
+<[EMAIL PROTECTED]> */
+ r->filename = apr_pstrdup(r->pool, info->filename );
return APR_SUCCESS;
}
Index: httpd-2.0/modules/experimental/mod_cache.c
===================================================================
RCS file: /home/cvspublic/httpd-2.0/modules/experimental/mod_cache.c,v
retrieving revision 1.49
diff -u -r1.49 mod_cache.c
--- httpd-2.0/modules/experimental/mod_cache.c 24 Jul 2002 20:47:28 -0000 1.49
+++ httpd-2.0/modules/experimental/mod_cache.c 1 Aug 2002 06:38:25 -0000
@@ -118,7 +118,7 @@
"cache: URL exceeds length threshold: %s", url);
return DECLINED;
}
- /* DECLINE urls ending in / */
+ /* DECLINE urls ending in / ??? EGP: why? */
if (url[urllen-1] == '/') {
return DECLINED;
}
@@ -244,6 +244,7 @@
return OK;
}
else {
+ r->err_headers_out = apr_table_make(r->pool, 3);
/* stale data available */
if (lookup) {
return DECLINED;
Index: httpd-2.0/modules/experimental/mod_disk_cache.c
===================================================================
RCS file: /home/cvspublic/httpd-2.0/modules/experimental/mod_disk_cache.c,v
retrieving revision 1.36
diff -u -r1.36 mod_disk_cache.c
--- httpd-2.0/modules/experimental/mod_disk_cache.c 17 Jul 2002 14:52:36 -0000
1.36
+++ httpd-2.0/modules/experimental/mod_disk_cache.c 1 Aug 2002 06:38:30 -0000
@@ -237,7 +237,7 @@
if ((temp = strchr(&urlbuff[0], '\n')) != NULL) /* trim off new line character */
*temp = '\0'; /* overlay it with the null terminator */
- if (!apr_date_checkmask(urlbuff, "&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&")) {
+ if (!apr_date_checkmask(urlbuff, "&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&
+&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&")) {
return APR_EGENERAL;
}
@@ -246,6 +246,10 @@
info->expire = ap_cache_hex2usec(urlbuff + offset);
offset += (sizeof(info->expire)*2) + 1;
dobj->version = ap_cache_hex2usec(urlbuff + offset);
+ offset += (sizeof(info->expire)*2) + 1;
+ info->request_time = ap_cache_hex2usec(urlbuff + offset);
+ offset += (sizeof(info->expire)*2) + 1;
+ info->response_time = ap_cache_hex2usec(urlbuff + offset);
/* check that we have the same URL */
rv = apr_file_gets(&urlbuff[0], urllen, fd);
@@ -276,6 +280,8 @@
char dateHexS[sizeof(apr_time_t) * 2 + 1];
char expireHexS[sizeof(apr_time_t) * 2 + 1];
char verHexS[sizeof(apr_time_t) * 2 + 1];
+ char requestHexS[sizeof(apr_time_t) * 2 + 1];
+ char responseHexS[sizeof(apr_time_t) * 2 + 1];
cache_info *info = &(h->cache_obj->info);
disk_cache_object_t *dobj = (disk_cache_object_t *) h->cache_obj->vobj;
@@ -287,7 +293,9 @@
ap_cache_usec2hex(info->date, dateHexS);
ap_cache_usec2hex(info->expire, expireHexS);
ap_cache_usec2hex(dobj->version++, verHexS);
- buf = apr_pstrcat(r->pool, dateHexS, " ", expireHexS, " ", verHexS, "\n", NULL);
+ ap_cache_usec2hex(info->request_time, requestHexS);
+ ap_cache_usec2hex(info->response_time, responseHexS);
+ buf = apr_pstrcat(r->pool, dateHexS, " ", expireHexS, " ", verHexS, " ",
+requestHexS, " ", responseHexS, "\n", NULL);
amt = strlen(buf);
rc = apr_file_write(fd, buf, &amt);
if (rc != APR_SUCCESS) {
@@ -448,6 +456,7 @@
char urlbuff[1034];
int urllen = sizeof(urlbuff);
disk_cache_object_t *dobj = (disk_cache_object_t *) h->cache_obj->vobj;
+ apr_table_t * tmp;
/* This case should not happen... */
if (!dobj->fd || !dobj->hfd) {
@@ -486,6 +495,17 @@
r->status_line = apr_pstrdup(r->pool, urlbuff); /* Save status line
into request rec */
+ h->req_hdrs = apr_table_make(r->pool, 20);
+
+ /*
+ * Call routine to read the header lines/status line
+ */
+ tmp = r->err_headers_out;
+ r->err_headers_out = h->req_hdrs;
+ rv = apr_file_gets(&urlbuff[0], urllen, dobj->hfd); /* Read status */
+ ap_scan_script_header_err(r, dobj->hfd, NULL);
+ r->err_headers_out = tmp;
+
apr_file_close(dobj->hfd);
ap_log_error(APLOG_MARK, APLOG_INFO, 0, r->server,
@@ -585,6 +605,24 @@
buf = apr_pstrcat(r->pool, CRLF, NULL);
amt = strlen(buf);
apr_file_write(hfd, buf, &amt);
+
+ /* Parse the vary header and dump those fields from the headers_in. */
+ /* Make call to the same thing cache_select_url calls to crack Vary. */
+ /* @@@ Some day, not today. */
+ if (r->headers_in) {
+ int i;
+ apr_table_entry_t *elts = (apr_table_entry_t *)
+apr_table_elts(r->headers_in)->elts;
+ for (i = 0; i < apr_table_elts(r->headers_in)->nelts; ++i) {
+ if (elts[i].key != NULL) {
+ buf = apr_pstrcat(r->pool, elts[i].key, ": ", elts[i].val, CRLF,
+NULL);
+ amt = strlen(buf);
+ apr_file_write(hfd, buf, &amt);
+ }
+ }
+ buf = apr_pstrcat(r->pool, CRLF, NULL);
+ amt = strlen(buf);
+ apr_file_write(hfd, buf, &amt);
+ }
apr_file_close(hfd); /* flush and close */
}
else {