proposal part 1 - VCL: edit header tokens/entities

Nils Goroll slink at schokola.de
Mon Sep 1 19:01:44 CEST 2014


On 28/08/14 08:57, Poul-Henning Kamp wrote:
> Btw, mildly related to this:  Long time ago we talked about being able
> to work on sub-parts of http headers:
> 
> 	if (INT(beresp.http.cache-control.max-age, 0) > 1200) {
> 		set beresp.http.cache-contro.max-age = 1200;
> 	}
> 
> We may want to reconsider this before we write too intricate VCL

phk had asked me to come up with a sketch of which VRT functions we'd need for
this, but I'd rather get some input about several ways to define the VCL first.

The general idea is that, while whole headers can be accessed using

	[un]set where.http.headername

tokens/entities in headers could be accessed using

	[un]set where.http.headername.token
and
	[un]set where.http.headername.token.option

VCL/VCC would know that for most headers elements are split by comma (,) and
key/value pairs are split by equals (=) and it would be aware of exceptions for
other well known headers (for instance the Cookie request header, if we take it
into scope).


The first issue here is how we denote token and option in VCL.

According to http://tools.ietf.org/html/rfc7230#section-3.2 we cannot assume
some "special" character not to be contained in a header token/entity name or value.

One suggestion we have discussed on irc was to use the array notation, but this
would make it necessary to quote [ and ], so

	set beresp.http.Foo.[g\[oo\]g\\l"e] = "watching";

would yield

	Foo: g[oo]g\l"e=watching

if there was no Foo header (and add it otherwise).


The best suggestion for a syntax I could think of so far is to use the existing
string notation, so

	set beresp.http.Foo.{"g[oo]g\l"e"} = "watching";

would yield the same result.

Some more examples (hopefully slightly more realistic) using this notation with
before and after

example #1

		Accept: text/plain; q=0.5, text/x-dvi, */*

	set req.http.Accept."text/plain"."q" = 3.14;

		-> Accept: text/plain; q=3.14, text/x-dvi, */*

	set req.http.Accept.{""quoted"/printable"};

		-> Accept: text/plain; q=3.14, text/x-dvi, */*, "quoted"/printable

	unset req.http.Accept."*/*";

		-> Accept: text/plain; q=3.14, text/x-dvi, "quoted"/printable


example #2

		Vary: Accept-Language

	set beresp.http.Vary."Accept-Encoding";

		-> Vary: Accept-Language, Accept-Encoding

	unset beresp.http.Vary."Accept-Language";

		-> Vary: Accept-Encoding

	unset beresp.http.Vary."Accept-Encoding";

		-> (void) - header removed

Feedback welcome.



More information about the varnish-dev mailing list