Scroll to navigation

VMOD_COOKIE(3) VMOD_COOKIE(3)

NAME

vmod_cookie - Varnish Cookie Module

SYNOPSIS

import cookie [from "path"] ;

DESCRIPTION

Handle HTTP cookies easier in Varnish VCL. (without regex)

Parses a cookie header into an internal data store, where per-cookie get/set/delete functions are available. A filter_except() method removes all but a set comma-separated list of cookies.

A convenience function for formatting the Set-Cookie Expires date field is also included. If there are multiple Set-Cookie headers vmod-header should be used.

The state loaded with cookie.parse() has a lifetime of the current request or backend request context. To pass variables to the backend request, store the contents as fake bereq headers.

CONTENTS

  • func_clean
  • func_delete
  • func_filter_except
  • func_format_rfc1123
  • func_get
  • func_get_string
  • func_isset
  • func_parse
  • func_set

clean

VOID clean(PRIV_TASK)


Description
Clean up previously parsed cookies. It is not necessary to run clean() in normal operations.
Example

sub vcl_recv {
        cookie.clean();
}



delete

VOID delete(PRIV_TASK, STRING cookiename)


Description
Delete cookiename from internal vmod storage if it exists.
Example

sub vcl_recv {
    cookie.parse("cookie1: value1; cookie2: value2;");
    cookie.delete("cookie2");
    // get_string() will now yield "cookie1: value1";
}



filter_except

VOID filter_except(PRIV_TASK, STRING filterstring)


Description
Delete all cookies from internal vmod storage that is not in the comma-separated argument cookienames.
Example

sub vcl_recv {
        cookie.parse("cookie1: value1; cookie2: value2; cookie3: value3");
        cookie.filter_except("cookie1,cookie2");
        // get_string() will now yield
        // "cookie1: value1; cookie2: value2;";
}



format_rfc1123

STRING format_rfc1123(TIME now, DURATION timedelta)


Description
Get a RFC1123 formatted date string suitable for inclusion in a Set-Cookie response header.

Care should be taken if the response has multiple Set-Cookie headers. In that case the header vmod should be used.

Example

sub vcl_deliver {
        # Set a userid cookie on the client that lives for 5 minutes.
        set resp.http.Set-Cookie = "userid=" + req.http.userid + "; Expires=" + cookie.format_rfc1123(now, 5m) + "; httpOnly";
}



get

STRING get(PRIV_TASK, STRING cookiename)


Description
Get the value of cookiename, as stored in internal vmod storage. If cookiename does not exist an empty string is returned.
Example

import std;
sub vcl_recv {
        cookie.parse("cookie1: value1; cookie2: value2;");
        std.log("cookie1 value is: " + cookie.get("cookie1"));
}



get_string

STRING get_string(PRIV_TASK)


Description
Get a Cookie string value with all cookies in internal vmod storage. Does not modify internal storage.
Example

sub vcl_recv {
        cookie.parse(req.http.cookie);
        cookie.filter_except("SESSIONID,PHPSESSID");
        set req.http.cookie = cookie.get_string();
}



isset

BOOL isset(PRIV_TASK, STRING cookiename)


Description
Check if cookiename is set in the internal vmod storage.
Example

import std;
sub vcl_recv {
        cookie.parse("cookie1: value1; cookie2: value2;");
        if (cookie.isset("cookie2")) {
                std.log("cookie2 is set.");
        }
}



parse

VOID parse(PRIV_TASK, STRING cookieheader)


Description
Parse the cookie string in cookieheader. If state already exists, clean() will be run first.
Example

sub vcl_recv {
        cookie.parse(req.http.Cookie);
}



set

VOID set(PRIV_TASK, STRING cookiename, STRING value)


Description
Set the internal vmod storage for cookiename to value.
Example

sub vcl_recv {
        cookie.set("cookie1", "value1");
        std.log("cookie1 value is: " + cookie.get("cookie1"));
}