vmod_header3
Header vmod for varnish
Overview
Varnish Module for manipulation of duplicated HTTP headers, for instance multiple Set-Cookie headers.
Example:
vcl 4.0;
import header;
backend default { .host = "192.0.2.11"; .port = "8080"; }
sub vcl_backend_response {
if (beresp.http.Set-Cookie) {
# Add another line of Set-Cookie in the response.
header.append(beresp.http.Set-Cookie, "VSESS=abbabeef");
# CMS always set this, but doesn't really need it.
header.remove(beresp.http.Set-Cookie, "JSESSIONID=");
}
}
VOID append(HEADER, STRING)
Description-
Append an extra occurrence to an existing header.
Example-
:: header.append(beresp.http.Set-Cookie, "foo=bar")
VOID copy(HEADER, HEADER)
Description-
Copy all source headers to a new header.
Example-
:: header.copy(beresp.http.set-cookie, beresp.http.x-old-cookie);
STRING get(HEADER header, REGEX regex)
Description-
Fetches the value of the first header that matches the given regular expression regex.
Example-
:: set beresp.http.xusr = header.get(beresp.http.set-cookie,"user=");
VOID remove(HEADER header, REGEX regex)
Description-
Remove all occurrences of header that matches regex.
Example-
:: header.remove(beresp.http.set-cookie,"^(?!(funcookie=))");
VOID regsub(HTTP, REGEX regex, STRING sub, BOOL all=0)
Description-
For every header line in the HTTP object, which can be one of
req,resp,bereqorberesp, if the line matches the regular expressionregex, then replace it with the result of a substitution using the stringsub.submay include backreferences of the form\1through\9, which refer to capturing expressions in theregex, or\0to refer to the entire matched portion of the header line.If
allisfalse, replace the first matched portion of the header line withsub. This is the same operation performed by the VCL native functionregsub().allisfalseby default.If
allistrue, replace each non-overlapping matched portion of the header line withsub. This is the same operation performed by nativeregsuball().Note that unlike the other functions in this VMOD,
regsub()applies to the entire header line, including the header name, colon separator, and header value. Take care that your substitutions result in valid headers, since ill-formed headers can interfere with the HTTP protocol.Consider case sensitivity in the regex match. The standard dictates that header names are case insensitive, but header values are not. The VMOD function does not take care of that for you, but you can express it in the
regexusing the(?i)flag, as shown in the example below (use(?-i)to turn it off).Consider using the ^ starting anchor in
regexto be sure to match a header name (and not the same string somewhere in the middle of the line).
Example-
:: header.regsub(req, "^(?i)Foo(\d): (?-i)bar=(.*)$", "Bar\1: \2")
HEADER dyn(HTTP, STRING)
Description-
Return a dynamic header name.
Most other functions of this vmod require a HEADER argument, which usually is a VCL-defined header like
req.http.foo.This function allows to construct a header name from an arbitrary string, which may also be dynamically created, for example from a variable.
Notice that there are no syntactic checks on the STRING argument by purpose in order to support exotic use cases. It is entirely up to the user and at their own risk to supply a string which represents a valid HTTP header name (or not).
Example-
:: # create this request header # 42: is the answer header.append(header.dyn(req, 35 + 7), "is the answer");
Acknowledgements
The development of this plugin was made possible by the sponsorship of Softonic, <http://en.softonic.com/> .
Also thanks to Imo Klabun and Anders Nordby for bug reports.
History
- Debian 13 (Trixie): the text shown here
- Debian 12 (Bookworm)
- Debian 11 (Bullseye)
- Debian 10 (Buster)
- Debian 9 (Stretch)