From 1dcc6a8a969893057e56d4eba089a538619c72c2 Mon Sep 17 00:00:00 2001 From: Tim Duesterhus Date: Thu, 30 Nov 2023 16:41:17 +0100 Subject: [PATCH] BUG/MINOR: sample: Make the `word` converter compatible with `-m found` Previously an expression like: path,word(2,/) -m found always returned `true`. Bug exists since the `word` converter exists. That is: c9a0f6d0232cf44d6b08d1964b9097a45a6c65f0 The same bug was previously fixed for the `field` converter in commit 4381d26edc03faa46401eb0fe82fd7be84be14fd. The fix should be backported to 1.6+. --- reg-tests/converter/word.vtc | 43 ++++++++++++++++++++++++++++++++++++ src/sample.c | 2 +- 2 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 reg-tests/converter/word.vtc diff --git a/reg-tests/converter/word.vtc b/reg-tests/converter/word.vtc new file mode 100644 index 0000000000..acd46781f5 --- /dev/null +++ b/reg-tests/converter/word.vtc @@ -0,0 +1,43 @@ +varnishtest "word converter Test" + +feature ignore_unknown_macro + +server s1 { + rxreq + txresp -hdr "Connection: close" +} -repeat 3 -start + +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 fe + bind "fd@${fe}" + + #### requests + http-request set-var(txn.uri) path + http-response set-header Found %[var(txn.uri),word(2,/)] if { var(txn.uri),word(2,/) -m found } + + default_backend be + + backend be + server s1 ${s1_addr}:${s1_port} +} -start + +client c1 -connect ${h1_fe_sock} { + txreq -url "/foo/bar/baz" + rxresp + expect resp.status == 200 + expect resp.http.found == "bar" + txreq -url "/foo//bar/baz" + rxresp + expect resp.status == 200 + expect resp.http.found == "bar" + txreq -url "/foo" + rxresp + expect resp.status == 200 + expect resp.http.found == "" +} -run diff --git a/src/sample.c b/src/sample.c index c8954ac476..29967e07d9 100644 --- a/src/sample.c +++ b/src/sample.c @@ -2964,7 +2964,7 @@ static int sample_conv_word(const struct arg *arg_p, struct sample *smp, void *p /* Field not found */ if (word != arg_p[0].data.sint) { smp->data.u.str.data = 0; - return 1; + return 0; } found: smp->data.u.str.data = end - start;