Search
Varnish Enterprise

Header manipulation (header)

Description

Varnish Module for manipulation of duplicated HTTP headers, for instance multiple Set-Cookie headers. Note that for Cookie and Set-Cookie we recommend using the cookieplus VMOD, while this VMOD should be used for other headers that may occur more than once in a HTTP response.

Example VCL

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=");
    }
}

Functions

The following functions are available:

append

VOID append(HEADER, STRING)

  • Description:

    Create a new header field with the given string as value, allowing duplicates. This is used for example to have multiple cookie header fields.

  • Example:

    header.append(beresp.http.Set-Cookie, "foo=bar");

copy

VOID copy(HEADER sources, HEADER merged)

  • Description:

    Copy all source headers to one new header, merging all the values.

  • Example:

    header.copy(beresp.http.set-cookie, beresp.http.x-old-cookie);

get

STRING get(HEADER header, STRING regex)

  • Description:

    Fetches the value of the first header that matches the given regular expression regex. regex is static and cannot change between calls.

  • Example:

    set beresp.http.xusr = header.get(beresp.http.set-cookie,"user=");

remove

VOID remove(HEADER header, STRING regex)

  • Description:

    Remove all occurences of header that matches regex. regex is static and cannot change between calls.

  • Example:

    header.remove(beresp.http.set-cookie,"^(?!(funcookie=))");

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.

BUGS

You can’t use dynamic regular expressions, which also holds true for normal regular expressions in regsub().