haproxy/reg-tests/http-rules/map_ordering.vtc
Aurelien DARRAGON 3b0bf5097b MINOR: map: mapfile ordering also matters for tree-based match types
Willy made me realize that tree-based matching may also suffer from
out-of-order mapfile loading, as opposed to what's being said in
b546bb6d ("BUG/MINOR: map: list-based matching potential ordering
regression") and the associated REGTEST.

Indeed, in case of duplicated keys, we want to be sure that only the key
that was first seen in the file will be returned (as long as it is not
removed). The above fix is still valid, and the list-based match regtest
will also prevent regressions for tree-based match since mapfile loading
logic is currently match-type agnostic.

But let's clarify that by making both the code comment and the regtest
more precise.
2024-01-11 11:13:54 +01:00

47 lines
1.6 KiB
Plaintext

varnishtest "Ensure mapfile ordering is preserved when loading the file"
feature cmd "$HAPROXY_PROGRAM -cc 'version_atleast(2.5-dev0)'"
feature ignore_unknown_macro
haproxy h1 -conf {
defaults
mode http
timeout connect "${HAPROXY_TEST_TIMEOUT-5s}"
timeout client "${HAPROXY_TEST_TIMEOUT-5s}"
timeout server "${HAPROXY_TEST_TIMEOUT-5s}"
frontend fe1
bind "fd@${fe1}"
# check list ordering using map_dom (list-based match)
http-request return hdr dom %[req.hdr(Host),lower,map_dom(${testdir}/map_ordering.map)] if { url_beg /dom }
# check tree ordering using map_str (tree-based match) and duplicated keys
http-request return hdr str %[req.hdr(Host),lower,map_str(${testdir}/map_ordering.map)] if { url_beg /str }
} -start
# Check map ordering for list-based matching types
client c1 -connect ${h1_fe1_sock} {
# first.domain.tld is above domain.tld so it should match first
txreq -url "/dom" -hdr "Host: first.domain.tld"
rxresp
expect resp.status == 200
expect resp.http.dom == "first"
# second.domain.tld is below domain.tld so domain.tld should match first
txreq -url "/dom" -hdr "Host: second.domain.tld"
rxresp
expect resp.status == 200
expect resp.http.dom == "domain"
} -run
# Check map ordering for tree-based matching types (check that the matching
# key is the first one seen in the file)
client c2 -connect ${h1_fe1_sock} {
# first.domain.tld is first mapped to "first" in the mapfile
txreq -url "/str" -hdr "Host: first.domain.tld"
rxresp
expect resp.status == 200
expect resp.http.str == "first"
} -run