On Tue, 02 May 2006 23:31:13 +0200
Graham Leggett <[EMAIL PROTECTED]> wrote:

> Davi Arnaut wrote:
> 
> >> The way HTTP caching works is a lot more complex than in your example, you
> >> haven't taken into account conditional HTTP requests.
> > 
> > I've taken into account the actual mod_disk_cache code!
> 
> mod_disk_cache doesn't contain any of the conditional HTTP request code, 
> which is why you're not seeing it there.
> 
> Please keep in mind that the existing mod_cache framework's goal is to 
> be a fully HTTP/1.1 compliant, content generator neutral, efficient, 
> error free and high performance cache.
> 
> Moving towards and keeping with the above goals is a far higher priority 
> than simplifying the generic backend cache interface.
> 
> To sum up - the cache backend must fulfill the requirements of the cache 
> frontend (generic or not), which in turn must fulfill the requirements 
> of the users, who are browsers, web robot code, and humans. To try and 
> prioritise this the other way round is putting the cart before the horse.

Graham, what I want is to be able to write a mod_cache backend _without_
having to worry about HTTP. _NOT_ to rewrite mod_disk/proxy/cache/whatever!

You keep talking about HTTP this, HTTP that, I wont change the way it currently
works. I just want to place a glue beteween the storage and the HTTP part.

I could even wrap around your code:

typedef struct 
        apr_status_t (*fetch) (cache_handle_t *h, apr_bucket_brigade *bb);
        apr_status_t (*store) (cache_handle_t *h, apr_bucket_brigade *bb);
        int (*remove) (const char *key);
} my_cache_provider;

typedef struct {
        const char *key_headers;
        const char *key_body;
} my_cache_object;

create_entity:
        my_cache_object *obj;

        obj->key_headers = hash_headers(request, whatever);
        obj->key_body = hash_body(request, whatever);

open_entity:
        my_cache_object *obj;

        my_provider->fetch(h, obj->key_headers, header_brigade);

        // if necessary, update obj->key_headers/body (vary..)


remove_url:
        my_provider->remove(obj->key_header);
        my_provider->remove(obj->key_body);

remove_entity:
        nop

store_headers:
        my_cache_object *obj;
        // if necessary, update obj->key_headers (vary..)
        my_provider->store(h, obj->key_headers, header_brigade);

store_body:
        my_cache_object *obj;
        my_provider->store(h, obj->key_body, body_brigade)

recall_headers:
        my_cache_object *obj;
        my_provider->fetch(h, obj->key_headers, header_brigade);

recall_body:    
        my_cache_object *obj;
        my_provider->fetch(h, obj->key_body, body_brigade);

--
Davi Arnaut

Reply via email to