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.