httpd-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Davi Arnaut <>
Subject Re: Possible new cache architecture
Date Tue, 02 May 2006 22:54:39 GMT
On Tue, 02 May 2006 23:31:13 +0200
Graham Leggett <> 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;

	my_cache_object *obj;

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

	my_cache_object *obj;

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

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



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

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

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

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

Davi Arnaut

View raw message