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.

Reply via email to