]> granicus.if.org Git - apache/commitdiff
Pass headers on read/write header calls. Update mod_mem_cache to cache headers.
authorBill Stoddard <stoddard@apache.org>
Fri, 7 Sep 2001 02:56:11 +0000 (02:56 +0000)
committerBill Stoddard <stoddard@apache.org>
Fri, 7 Sep 2001 02:56:11 +0000 (02:56 +0000)
So much to do so little time ...

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@90947 13f79535-47bb-0310-9956-ffa450edef68

modules/experimental/cache_storage.c
modules/experimental/mod_cache.c
modules/experimental/mod_cache.h
modules/experimental/mod_mem_cache.c

index 06776013d0a570e9a0c65cf7085d8e56836a6306..d51960ba6495d94dee97b1eabfcbdab722222c6f 100644 (file)
@@ -189,13 +189,9 @@ int cache_select_url(request_rec *r, const char *types, char *url)
 }
 
 apr_status_t cache_write_entity_headers(cache_handle *h, request_rec *r, cache_info *info,
-                                        apr_table_t *headers_in, apr_table_t *headers_out) 
+                                        apr_table_t *headers)
 {
-    const char *ct;
-
-    ct = ap_table_get(r->headers_out, "Content-Type");
-    info->content_type = ct;
-    h->write_headers(h, r, info);
+    h->write_headers(h, r, info, headers);
     return APR_SUCCESS;
 }
 apr_status_t cache_write_entity_body(cache_handle *h, apr_bucket_brigade *b) 
@@ -211,27 +207,11 @@ apr_status_t cache_read_entity_headers(cache_handle *h, request_rec *r,
 {
     cache_info *info;
 
-    /* Be careful to not modify info. */
-    h->read_headers(h, r, &info);
-
     /* Build the header table from info in the info struct */
     *headers = apr_table_make(r->pool, 15);
-    /* Content-Length */
-    if (info->len)
-        apr_table_set(*headers, "Content-Length", 
-                      apr_psprintf(r->pool, "%" APR_SIZE_T_FMT, info->len));
 
-    /* Last-Modified */
-    if (info->lastmod) {
-    }
-    /* Expires */
-    if (info->expire) {
-    }
-    if (info->content_type) {
-        r->content_type = apr_pstrdup(r->pool, info->content_type);
-    }
-    /* Date */
-    
+    h->read_headers(h, r, &info, *headers);
+
     return APR_SUCCESS;
 }
 apr_status_t cache_read_entity_body(cache_handle *h, apr_bucket_brigade *b) 
index 3d7688a893dcf94de6f299b12371e41479f50d3c..d611b69e8ab92e8a747eb188cebca139cdd8fe36 100644 (file)
@@ -631,7 +631,7 @@ int ap_cache_in_filter(ap_filter_t *f, apr_bucket_brigade *in)
     /*
      * Write away header information to cache.
      */
-    cache_write_entity_headers(cache->handle, r, info, r->headers_in, r->headers_out);
+    cache_write_entity_headers(cache->handle, r, info, r->headers_out);
     cache_write_entity_body(cache->handle, in);    
     return ap_pass_brigade(f->next, in);
 }
index c68462cd56ea7220ee939dea7bed6003afd06e85..c6cfb24ac25c6fffdf7af5459bc606b555cda772 100644 (file)
@@ -175,9 +175,9 @@ struct cache_handle {
 
     /* Cache call back functions */
     int (*remove_entity) (cache_handle *h);
-    int (*write_headers)(cache_handle *h, request_rec *r, cache_info *i);
+    int (*write_headers)(cache_handle *h, request_rec *r, cache_info *i, apr_table_t *headers);
     int (*write_body)(cache_handle *h, apr_bucket_brigade *b);
-    int (*read_headers) (cache_handle *h, request_rec *r, cache_info **i);
+    int (*read_headers) (cache_handle *h, request_rec *r, cache_info **i, apr_table_t *headers);
     int (*read_body) (cache_handle *h, apr_bucket_brigade *bb); 
 
 };
@@ -208,7 +208,7 @@ int cache_remove_entity(request_rec *r, const char *types, cache_handle *h);
 int cache_select_url(request_rec *r, const char *types, char *url);
 
 apr_status_t cache_write_entity_headers(cache_handle *h, request_rec *r, cache_info *info, 
-                                        apr_table_t *headers_in, apr_table_t *headers_out);
+                                        apr_table_t *headers);
 apr_status_t cache_write_entity_body(cache_handle *h, apr_bucket_brigade *bb);
 
 apr_status_t cache_read_entity_headers(cache_handle *h, request_rec *r, apr_table_t **headers);
@@ -252,13 +252,13 @@ APR_DECLARE_EXTERNAL_HOOK(cache, CACHE, int, remove_entity,
                           (cache_handle *h))
 APR_DECLARE_EXTERNAL_HOOK(cache, CACHE, int, read_entity_headers, 
                           (cache_handle *h, cache_info **info,
-                           apr_table_t **headers_in, apr_table_t **headers_out))
+                           apr_table_t **headers))
 APR_DECLARE_EXTERNAL_HOOK(cache, CACHE, int, read_entity_body, 
                           (cache_handle *h,
                            apr_bucket_brigade *out))
 APR_DECLARE_EXTERNAL_HOOK(cache, CACHE, int, write_entity_headers, 
                           (cache_handle *h, cache_info *info,
-                           apr_table_t *headers_in, apr_table_t *headers_out))
+                           apr_table_t *headers))
 APR_DECLARE_EXTERNAL_HOOK(cache, CACHE, int, write_entity_body, 
                           (cache_handle *h,
                            apr_bucket_brigade *in))
index ea6811c3238b80ac7c3661a681d17afc4b3afda3..36befaf758bcc628d07964fb8a804d49a8efd1fb 100644 (file)
@@ -80,11 +80,18 @@ typedef enum {
     CACHE_TYPE_MMAP
 } cache_type_e;
 
+typedef struct {
+    char* hdr;
+    char* val;
+} cache_header_tbl_t;
+
 typedef struct {
     cache_type_e type;
     char *key;
-    void *m;
+    apr_ssize_t num_headers;
+    cache_header_tbl_t *tbl;
     apr_size_t m_len;
+    void *m;
     cache_info info;
     int complete;
 } cache_object_t;
@@ -103,9 +110,11 @@ static mem_cache_conf *sconf;
 
 /* Forward declarations */
 static int remove_entity(cache_handle *h);
-static int write_headers(cache_handle *h, request_rec *r, cache_info *i);
+static int write_headers(cache_handle *h, request_rec *r, cache_info *i,
+                         apr_table_t *headers);
 static int write_body(cache_handle *h, apr_bucket_brigade *b);
-static int read_headers(cache_handle *h, request_rec *r, cache_info **info);
+static int read_headers(cache_handle *h, request_rec *r, cache_info **info, 
+                        apr_table_t *headers);
 static int read_body(cache_handle *h, apr_bucket_brigade *bb);
 
 static void cleanup_cache_object(cache_object_t *obj)
@@ -147,6 +156,10 @@ static void cleanup_cache_object(cache_object_t *obj)
     if (obj->m)
         free(obj->m);
 
+    /* XXX Cleanup the headers */
+    if (obj->num_headers) {
+        
+    }
     free(obj);
 }
 
@@ -377,10 +390,15 @@ static int remove_url(const char *type, char *key)
     return OK;
 }
 
-static int read_headers(cache_handle *h, request_rec *r, cache_info **info) 
+static int read_headers(cache_handle *h, request_rec *r, cache_info **info, 
+                        apr_table_t *headers) 
 {
     cache_object_t *obj = (cache_object_t*) h->cache_obj;
+    int i;
 
+    for (i = 0; i < obj->num_headers; ++i) {
+        apr_table_setn(headers, obj->tbl[i].hdr, obj->tbl[i].val);
+    } 
     *info = &(obj->info);
 
     return OK;
@@ -399,9 +417,47 @@ static int read_body(cache_handle *h, apr_bucket_brigade *bb)
     return OK;
 }
 
-static int write_headers(cache_handle *h, request_rec *r, cache_info *info)
+static int write_headers(cache_handle *h, request_rec *r, cache_info *info, apr_table_t *headers)
 {
     cache_object_t *obj = (cache_object_t*) h->cache_obj;
+    apr_table_entry_t *elts = (apr_table_entry_t *) headers->a.elts;
+    apr_ssize_t i;
+    apr_size_t len = 0;
+    apr_size_t idx = 0;
+    char *buf;
+
+    /* Precompute how much storage we need to hold the headers */
+    obj->tbl = malloc(sizeof(cache_header_tbl_t) * headers->a.nelts);
+    if (NULL == obj->tbl) {
+        return DECLINED;
+    }
+    for (i = 0; i < headers->a.nelts; ++i) {
+        len += strlen(elts[i].key);
+        len += strlen(elts[i].val);
+        len += 2;        /* Extra space for NULL string terminator for key and val */
+    }
+
+    /* Transfer the headers into a contiguous memory block */
+    buf = malloc(len);
+    if (!buf) {
+        free(obj->tbl);
+        obj->tbl = NULL;
+        return DECLINED;
+    }
+    obj->num_headers = headers->a.nelts;
+    for (i = 0; i < obj->num_headers; ++i) {
+        obj->tbl[i].hdr = &buf[idx];
+        len = strlen(elts[i].key) + 1;              /* Include NULL terminator */
+        strncpy(&buf[idx], elts[i].key, len);
+        idx+=len;
+
+        obj->tbl[i].val = &buf[idx];
+        len = strlen(elts[i].val) + 1;
+        strncpy(&buf[idx], elts[i].val, len);
+        idx+=len;
+    }
+
+#if 0
     if (info->date) {
         obj->info.date = info->date;
     }
@@ -416,7 +472,7 @@ static int write_headers(cache_handle *h, request_rec *r, cache_info *info)
         if (obj->info.content_type)
             strcpy((char*) obj->info.content_type, info->content_type);
     }
-
+#endif
     return OK;
 }