Skip to main content

Expressions

Traffic Policy module enables you to filter inbound and outbound traffic with Common Expression Language (CEL) expressions. Each policy rule expression must evaluate to true in order for the rule's actions to take effect against traffic. In addition to CEL's built-in functions and macros we provide additional variables for the connection, request and response along with custom macros.

Connection Variables

The following connection variables are available on the conn struct:

NameTypeDescription
conn.ClientIPstringThe source IP of the HTTP connection to the ngrok endpoint.
conn.Geo.CountryCodestringThe two-letter ISO country code based on the client IP.
conn.Geo.LatitudestringThe approximate latitude based on the client IP.
conn.Geo.LatLongRadiusKmstringThe radius in kilometers around the latitude and longitude where the client IP is likely to originate.
conn.Geo.LongitudestringThe approximate longitude based on the client IP.

conn.ClientIP

The source IP of the HTTP connection to the ngrok endpoint as a string.

expressions:
- conn.ClientIP in ['::1', '127.0.0.1']

conn.Geo.CountryCode

The two-letter ISO country code based on the client IP.

expressions:
- conn.Geo.CountryCode != 'US'

conn.Geo.Latitude

The approximate latitude based on the client IP.

expressions:
- double(conn.Geo.Latitude) >= 45.0

conn.Geo.LatLongRadiusKm

The radius in kilometers around the latitude and longitude where the client IP is likely to originate.

expressions:
- conn.Geo.LatLongRadiusKm <= '20'

conn.Geo.Longitude

The approximate longitude based on the client IP.

expressions:
- double(conn.Geo.Longitude) <= -93.0

Request Variables

The following request variables are available on the req struct:

NameTypeDescription
req.ClientTLS.CertCNstringThe subject common name of the client's leaf TLS certificate.
req.ClientTLS.CipherSuitestringThe cipher suite negotiated on the connection.
req.ClientTLS.SNIstringThe Server Name Indication extension sent by the client.
req.ClientTLS.VersionstringThe TLS Version used on the connection.
req.ContentLengthintThe length of the content associated with the request.
req.CookieslistThe list of HTTP cookie objects provided in the request.
req.MethodstringThe request method.
req.URLstringThe URL of the request.
req.ParamsmapThe query parameters of the request URL wherein a string key maps to a list of string values.
req.ProtocolstringThe protocol version of the request.
req.HoststringThe host of the request.
req.LocationstringThe 'Location' header of the request.
req.HeadersmapThe headers of the request wherein a string key maps to a list of string values. Header keys must be written in canonical format.
req.TrailersmapThe trailers of the request wherein a string key maps to a list of string values. Trailer keys must be written in canonical format.

req.ClientTLS.CertCN

The subject common name of the client's leaf TLS certificate.

expressions:
- req.ClientTLS.CertCN.startsWith('example')

req.ClientTLS.CipherSuite

The cipher suite negotiated on the connection.

expressions:
- req.ClientTLS.CipherSuite.contains('SHA256')

req.ClientTLS.SNI

The Server Name Indication extension sent by the client.

expressions:
- req.ClientTLS.SNI.startsWith('domain')

req.ClientTLS.Version

The TLS Version used on the connection.

expressions:
- req.ClientTLS.Version.contains('1.3')

req.ContentLength

The length of the content associated with the request.

expressions:
- req.ContentLength > 10000000

req.Method

The request method.

expressions:
- req.Method == 'POST' || req.Method == 'PUT'

req.Cookies

The list of HTTP cookie objects provided in the request.

expressions:
- size(req.Cookies) > 0

req.URL

The URL of the request.

expressions:
- req.URL.contains('/admin')

req.Params

The query parameters of the request URL wherein a string key maps to a list of string values.

expressions:
- "'bar' in req.Params['foo']"

req.Protocol

The protocol version of the request.

expressions:
- "`req.Protocol == 'HTTP/1.1'"

req.Host

The host of the request.

expressions:
- req.Host.contains(':8080')

req.Location

The 'Location' header of the request.

expressions:
- req.Location == '/index.html'

req.Headers

The headers of the request wherein a string key maps to a list of string values.

expressions:
- "'Fizz' in req.Headers['Baz']"

req.Trailers

The trailers of the request wherein a string key maps to a list of string values.

expressions:
- "'Fizz' in req.Trailers['Baz']"

Response Variables

The following response variables are available on the res struct:

NameTypeDescription
res.ContentLengthintThe length of the content associated with the response.
res.CookieslistThe list of HTTP cookie objects provided in the response.
res.HeadersmapThe headers of the response wherein a string key maps to a list of string values. Header keys must be written in canonical format.
res.LocationstringThe 'Location' header of the response.
res.ServerTLS.CertCNstringThe subject common name of the leaf TLS certificate.
res.ServerTLS.CipherSuitestringThe cipher suite negotiated on the connection.
res.ServerTLS.SNIstringThe Server Name Indication extension sent by the client.
res.ServerTLS.VersionstringThe TLS Version used on the connection.
res.StatusCodestringThe status code of the response.
res.TrailersmapThe trailers of the response wherein a string key maps to a list of string values. Trailer keys must be written in canonical format.

res.ContentLength

The length of the content associated with the response.

expressions:
- res.ContentLength != 0

res.Cookies

The list of HTTP cookie objects provided in the response.

expressions:
- size(req.Cookies) > 0

res.Headers

The headers of the response wherein a string key maps to a list of string values.

expressions:
- "'Fizz' in res.Headers['Baz']"

res.Location

The 'Location' header of the response.

expressions:
- res.Location == '/index.html'

res.ServerTLS.CertCN

The subject common name of the leaf TLS certificate.

expressions:
- res.ClientTLS.CertCN.startsWith('example')

res.ServerTLS.CipherSuite

The cipher suite negotiated on the connection.

expressions:
- res.ClientTLS.CipherSuite.contains('SHA256')

res.ServerTLS.SNI

The Server Name Indication extension sent by the client.

expressions:
- res.ClientTLS.SNI.startsWith('domain')

res.ServerTLS.Version

The TLS Version used on the connection.

expressions:
- res.ClientTLS.Version.contains('1.3')

res.StatusCode

The status code of the response.

expressions:
- res.StatusCode >= '300'

res.Trailers

The trailers of the response wherein a string key maps to a list of string values.

expressions:
- "'fizz' in res.Trailers['baz']"

Macros

CEL provides a set of predefined macros that can also be used in policy expressions. For convenience, the following custom macros are also supported:

NameReturn TypeDescription
hasReqHeader(string)boolReturns true or false if the provided header key is present on the request. Header keys must be written in canonical format.
getReqHeader(string)listReturns a list of header values for the provided key on the request. Header keys must be written in canonical format.
hasQueryParam(string)boolReturns true or false if the specified query parameter key is part of the request URL.
getQueryParam(string)listReturns a list of the query parameter values from the request URL for the specified key.
hasReqCookie(string)boolReturns true or false if a cookie exists on the request with the specified name.
getReqCookie(string)boolReturns the cookie struct for the specified cookie name, if it exists on the request.
hasResHeader(string)boolReturns true or false if the provided header key is present on the response. Header keys must be written in canonical format.
getResHeader(string)listReturns a list of header values for the provided key on the response. Header keys must be written in canonical format.
hasResCookie(string)boolReturns true or false if a cookie exists on the response with the specified name.
getResCookie(string)boolReturns the cookie struct for the specified cookie name, if it exists on the response.
inCidrRange(ip string, cidr string)boolReturns true or false if the provided IP address falls within the provided CIDR range. Returns false if the provided CIDR range is invalid.
inCidrRanges(ip string, cidrs list)boolReturns true or false if the provided IP address falls within any of the provided CIDR ranges. Ignores any provided CIDR ranges that are invalid.

hasReqHeader(string)

Returns true or false if the provided header key is present on the request. Header keys must be written in canonical format.

expressions:
- hasReqHeader('X-Version-Id')

getReqHeader(string)

Returns a list of header values for the provided key on the request. Header keys must be written in canonical format.

expressions:
- getReqHeader('User-Agent').exists(v, v.matches('(?i)google-images'))

hasQueryParam(string)

Returns true or false if the specified query parameter key is part of the request URL.

expressions:
- hasQueryParam('q')

getQueryParam(string)

Returns a list of the query parameter values from the request URL for the specified key.

expressions:
- size(getQueryParam('q')) == 0

hasReqCookie(string)

Returns true or false if a cookie exists on the request with the specified name.

expressions:
- hasReqCookie('session')

getReqCookie(string)

Returns the cookie struct for the specified cookie name, if it exists on the request.

expressions:
- getReqCookie('session').Secure

hasResHeader(string)

Returns true or false if the provided header key is present on the response. Header keys must be written in canonical format.

expressions:
- hasResHeader('Content-Type')

getResHeader(string)

Returns a list of header values for the provided key on the response. Header keys must be written in canonical format.

expressions:
- size(getResHeader('Content-Type').filter(v, v.matches('application/json')))
> 0

hasResCookie(string)

Returns true or false if a cookie exists on the response with the specified name.

expressions:
- hasResCookie('_device_id')

getResCookie(string)

Returns the cookie struct for the specified cookie name, if it exists on the response.

expressions:
- getResCookie('_device_id').Value == 'mobile-phone-14'

inCidrRange(ip string, cidr string)

Returns true or false if the provided IP address falls within the provided CIDR range. Returns false if the provided CIDR range is invalid.

expressions:
- inCidrRange(conn.ClientIP, '66.249.66.1/24')

inCidrRanges(ip string, cidrs list)

Returns true or false if the provided IP address falls within any of the provided CIDR ranges. Ignores any provided CIDR ranges that are invalid.

expressions:
- inCidrRanges(conn.ClientIP, ['66.249.66.1/24', '2001:4860::/32'])