Comparison Reference¶
Comparisons¶
Comparison match again the active feature. For most comparisons the value to compare is the value of
the comparison key. In a few cases the comparison value is implicit in the comparison (e.g.
is-true
). These are indicated by the leading “is-“.
Each comparison can compares its value against features of specific types. A feature that is not one
of those types is never matched. In some cases the value can be a list, in which each value is
compared against the active feature and the comparison matches if any element of the list matches.
These are marked as such, for example match
.
Special Comparisons¶
- is-null¶
- Value Types:
- NIL
Succeed if the active feature is NULL
. The most common use for this is with HTTP fields to
detect if the field is not present.
with: proxy-req-field<Best-Band>:
select:
- is-null: # Field is not present.
do:
- # stuff
- match: "" # Field is present but empty.
do:
- # stuff
- match: "Delain" # Field is correctly set, including capitalization.
- do: # Present but invalid value.
- # stuff
See is-empty
to check for NULL
or the empty string.
String Comparisons¶
String comparisons can set the active index group extractors. The string comparisons are marked with which groups, if any, are set by the comparison if it matches. All string comparisons are by default case sensitive.
The argument nc
(no case) can be passed to make the comparison case insensitive. For instance
to make sure the field “Best-Band” is capitalized correctly
with: ua-req-field<Best-Band>
select:
- match: "Delain" # Exactly "Delain"
# Do nothing, it's correct.
- match<nc>: "Delain" # wrong capitalization like "delain" or "delaiN"
do:
- ua-req-field<Best-Band>: "Delain" # fix it.
Index |
Content |
---|---|
0 |
The matched string. |
1..N |
Regular expression capture groups. |
The unmatched string. |
See none-of
for handling negative string matches. This makes it easy to match features that
do not contain a string.
- match¶
- Value Types:
- string
- List matching:
- enabled
- Groups:
- 0,*
Exact string match.
- prefix¶
- Value Types:
- string
- List matching:
- enabled
- Groups:
- 0,*
Prefix string match. Successful if the value is a prefix of the feature.
- suffix¶
- Value Types:
- string
- List matching:
- enabled
- Groups:
- 0,*
Suffix string match. Successful if the value is a suffix of the feature.
- tld¶
- Value Types:
- string
- List matching:
- enabled
- Groups:
- 0,*
Top level domain matching. This is similar to suffix
but has a special case for the “.”
separator for domains. It will match the exact feature, or as a suffix if there is an intervening
“.”.
tld: "yahoo.com"
is equivalent to
any-of:
- suffix: ".yahoo.com"
- match: "yahoo.com"
- contains¶
- Value Types:
- string
- Groups:
- 0
Substring checking. This matches if the active feature has the value as a substring.
If the feature is “potzrebie” then
- contains: "pot" # success
- contains: "zri" # failure
- contains: "zreb" # success
- path¶
- Value Types:
- string
- Groups:
- 0,*
This is a literal match which accepts an optional trailing “/” character. This is useful for matching a specific path in a URL because the request may or may not add the trailing character. That is
path: "albums"
will match a path of “albums” or “albums/”. I.e. it is identical to
any-of:
- match: "albums"
- match: "albums/"
and to
path: "albums/"
- rxp¶
- Value Types:
- string
- Groups:
- 0,1..N
Regular expression comparison. If this matches the index scoped extractors are set. Index 0 is the entire match, index 1 is the first capture group, etc.
- is-empty¶
- Value Types:
- NIL, string
Successful if the active feature is NULL
or the empty string. This is identical to
any-of:
- is-null:
- match: ""
This is sufficiently common to justify having a specific comparison. If the actions for having no
value, either because it’s missing or has no value are the same, then the example from
is-null
can be done more cleanly as
with: proxy-req-field<Best-Band>:
select:
- is-empty: # Field has no value - missing or empty.
do:
- # stuff
- match: "Delain" # Field is correctly set, including capitalization.
- do: # Present but invalid value.
- # stuff
Numeric Comparisons¶
- eq¶
- Value Types:
- integer, boolean, IP address
Equal. Successful if the value is equal to the feature. This works for numeric and IP address features.
- ne¶
- Value Types:
- integer, boolean, IP address
Not equal. Successful if the value is not equal to the feature. This is valid for Integers and IP Addresses.
- lt¶
Less than. Successful if the feature is numerically less than the value.
- le¶
Less than or equal. Successful if the feature is numerically less than or equal to the value.
- gt¶
Greater than. Successful if feature is numerically greater than the value.
- ge¶
Greater than or equal. Successful if the feature is greater than or equal to the value.
- in¶
- Value Types:
- integer, IP address
Check if the feature is in a range. The value must be a tuple of two values, the minimum and the maximum. This matches if the feature is at least the minimum and no more than the maximum. The comparison
in: [ 10, 20 ]
is identical to
all-of:
- le: 10
- ge: 20
If the feature is (the Integer) 8, then
in: [ 1, 10 ] # match
in: [ 9, 20 ] # no match
in: [ 1, 6 ] # no match
in: [ 8, 8 ] # match
For IP Addresses, the value is a range. It can be specified as a string that can be parsed as an IP range.
single address - “172.16.23.8”
a CIDR network - “172.16.23.8/29”
two addresses separated by a dash - “172.16.23.8-172.16.23.15”
A single value, repreenting a single value range.
A dash separated pair of IP addresses, representing an inclusive range. These are equivalent
in: "192.168.56.1-192.168.56.99" in: [ 192.168.56.1, 192.168.56.99 ]
A CIDR notation network, which is treated a range that contains exactly the network. These are equivalent
in: [ 172.16.23.0 , 172.16.23.127 ] in: "172.16.23.0-127.16.23.127" in: "172.16.23.0/25"
Boolean Comparisons¶
- is-true¶
Matches if the active feature is a boolen that has the value true
. The value, if any, is ignored.
- is-false¶
Matches if the active feature is a boolen that has the value false
. The value, if any, is ignored.
Compound Comparisons¶
These comparisons do not directly compare values. They combine or change other comparisons.
Combining Comparisons¶
These combine the results of other comparisons.
- any-of¶
Given a list of comparisons, this comparison succeeds if any of the comparisons in the list succeed. This is another term for “or”. This stops doing comparisons in the list as soon as one succeeds.
- all-of¶
Given a list of comparisons, this comparison succeeds if all of the comparisons in the list succeed. This is another term for “and”. This stops doing comparisons in the list as soon as one does not succeed.
- none-of¶
Given a list of comparisons, this comparison succeeds if none of the comparisons in the list succeed. This stops as doing comparisons as soon as one succeeds.
This serves as the “not” comparison if the list is of length 1. For instance, if the goal was to set the field “Best-Band” in proxy requests where the “App” field does not match a specific regular expression
with: proxy-req-field<App>
select:
- none-of:
- rxp: "^channel=(?:(?:.* metal)|(?:.*symphonic.*))"
do:
- proxy-req-field<Best-Band>: "Delain"
This could be done as a “negative regular expression” but those are tricky to write, slow, and
can create stack explosions. This approach is more robust and faster. Note the do
is
attached to the none-of
. If attached to rxp
those directives would trigger on the rxp
succeeding, not on it failing.
Tuple Comparisons¶
These comparisons are compound in that they do not directly compare values but take other
comparisons and apply those. They are intended for use on tuples or lists of values. The “for-…”
comparisons treat the tuple as a homogenous list where the same comparison is used on every element.
as-tuple
is for heterogenous lists where the different comparisons are used on different
elements of the tuple.
- for-any¶
The value must be another comparison. The comparison is applied to every element of the tuple and the comparison is successful if nested comparison is successful for any element of the tuple.
- for-all¶
The value must be another comparison. The comparison is applied to every element of the tuple and the comparison is successful if nested comparison is successful for every element of the tuple.
- for-none¶
The value must be another comparison. The comparison is applied to every element of the tuple and the comparison is successful if nested comparison is successful for no elements of the tuple.
- as-tuple¶
Compare a tuple as a tuple. This requires a list of comparison which are applied to the tuple elements in the same order. The list may be a different length than the tuple, in which case the excess elements (tuple values or comparisons) are ignored.