On Fri, Aug 16, 2002 at 09:55:16AM -0400, Eric Prud'hommeaux wrote: > 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); oops, make that: 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.
Content-Description: cache_pqueue.{h,c} patches > 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 Content-Description: disk_cache patches (not tested) > 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 { -- -eric ([EMAIL PROTECTED]) Feel free to forward this message to any list for any purpose other than email address distribution.