| varnishtest "Composite HTTP manipulation test (H1 and H2 clear to H1 clear)" |
| #REQUIRE_VERSION=1.9 |
| |
| # This config tests several http-request features and their interactions. |
| # It extracts some samples, places them into variables, modifies some header |
| # fields, appends multiple identical header fields, overwrites the start line |
| # using several methods, then dumps the initial list of variables and the final |
| # one, then applies CRC32 to these values as signatures that are easy to test. |
| # Then it does it again in the backend after saving the current headers into |
| # the same names prefixed by "fe-". Then it does the same on the response path. |
| # If some modifications are performed, the crc values need to be adjusted based |
| # on the failed logs. |
| # |
| # Run it with HAPROXY_PROGRAM=$PWD/haproxy varnishtest -l -k -t 1 "$1" |
| |
| feature ignore_unknown_macro |
| |
| server s1 { |
| rxreq |
| txresp \ |
| -status 234 \ |
| -hdr "hdr1: val1" \ |
| -hdr "hdr2: val2a" \ |
| -hdr "hdr2: val2b" \ |
| -hdr "hdr3: val3a, val3b" \ |
| -hdr "hdr4:" \ |
| -body "This is a body" |
| |
| expect req.method == "GET" |
| expect req.http.fe-sl1-crc == 1874847043 |
| expect req.http.fe-sl2-crc == 1142278307 |
| expect req.http.fe-hdr-crc == 1719311923 |
| expect req.http.be-sl1-crc == 3455320059 |
| expect req.http.be-sl2-crc == 2509326257 |
| expect req.http.be-hdr-crc == 3634102538 |
| } -repeat 2 -start |
| |
| haproxy h1 -conf { |
| defaults |
| mode http |
| ${no-htx} option http-use-htx |
| timeout connect 1s |
| timeout client 1s |
| timeout server 1s |
| |
| frontend fe |
| bind "fd@${feh1}" |
| bind "fd@${feh2}" proto h2 |
| |
| #### requests |
| http-request set-var(req.method) method |
| http-request set-var(req.uri) url |
| http-request set-var(req.path) path |
| http-request set-var(req.query) query |
| http-request set-var(req.param) url_param(qs_arg) |
| http-request set-var(req.cl) req.fhdr(content-length) |
| |
| http-request set-header sl1 "sl1: " |
| |
| http-request set-method "%[str(GET)]" |
| http-request set-uri %[str(),concat(/bu/,req.uri,/eu)] |
| http-request set-path "/bp/%[var(req.path)]/ep" |
| http-request set-query "bq&%[var(req.query)]&eq" |
| |
| http-request set-header sl2 "sl2: " |
| |
| http-request set-header sl1 "%[req.fhdr(sl1)] method=<%[var(req.method)]>; uri=<%[var(req.uri)]>; path=<%[var(req.path)]>;" |
| http-request set-header sl1 "%[req.fhdr(sl1)] query=<%[var(req.query)]>; param=<%[var(req.param)]>" |
| http-request set-header sl1 "%[req.fhdr(sl1)] cl=<%[var(req.cl)]>" |
| http-request set-header sl2 "%[req.fhdr(sl2)] method=<%[method]>; uri=<%[url]>; path=<%[path]>; " |
| http-request set-header sl2 "%[req.fhdr(sl2)] query=<%[query]>; param=<%[url_param(qs_arg)]>" |
| http-request set-header sl2 "%[req.fhdr(sl2)] cl=<%[req.fhdr(content-length)]>" |
| http-request set-header hdr "%[req.fhdr(hdr)] hdr1=<%[req.hdr(hdr1)]>; fhdr1=<%[req.fhdr(hdr1)]>;" |
| http-request set-header hdr "%[req.fhdr(hdr)] hdr2=<%[req.hdr(hdr2)]>; fhdr2=<%[req.fhdr(hdr2)]>;" |
| http-request set-header hdr "%[req.fhdr(hdr)] hdr3=<%[req.hdr(hdr3)]>; fhdr3=<%[req.fhdr(hdr3)]>;" |
| http-request set-header hdr "%[req.fhdr(hdr)] hdr4=<%[req.hdr(hdr4)]>; fhdr4=<%[req.fhdr(hdr4)]>;" |
| |
| http-request set-header sl1-crc "%[req.fhdr(sl1),crc32]" |
| http-request set-header sl2-crc "%[req.fhdr(sl2),crc32]" |
| http-request set-header hdr-crc "%[req.fhdr(hdr),crc32]" |
| |
| #### responses |
| http-response set-header be-sl1 "%[res.fhdr(sl1)]" |
| http-response set-header be-sl2 "%[res.fhdr(sl2)]" |
| http-response set-header be-hdr "%[res.fhdr(hdr)]" |
| |
| http-response set-header be-sl1-crc "%[res.fhdr(sl1-crc)]" |
| http-response set-header be-sl2-crc "%[res.fhdr(sl2-crc)]" |
| http-response set-header be-hdr-crc "%[res.fhdr(hdr-crc)]" |
| |
| http-response set-var(res.status) status |
| http-response set-header sl1 "sl1: " |
| |
| http-response set-status 200 |
| |
| http-response set-header sl2 "sl2: " |
| |
| http-response set-header sl1 "%[res.fhdr(sl1)] status=<%[var(res.status)]>;" |
| http-response set-header sl2 "%[res.fhdr(sl2)] status=<%[status]>;" |
| http-response set-header hdr "%[res.fhdr(hdr)] hdr1=<%[res.hdr(hdr1)]>; fhdr1=<%[res.fhdr(hdr1)]>;" |
| http-response set-header hdr "%[res.fhdr(hdr)] hdr2=<%[res.hdr(hdr2)]>; fhdr2=<%[res.fhdr(hdr2)]>;" |
| http-response set-header hdr "%[res.fhdr(hdr)] hdr3=<%[res.hdr(hdr3)]>; fhdr3=<%[res.fhdr(hdr3)]>;" |
| http-response set-header hdr "%[res.fhdr(hdr)] hdr4=<%[res.hdr(hdr4)]>; fhdr4=<%[res.fhdr(hdr4)]>;" |
| |
| http-response set-header fe-sl1-crc "%[res.fhdr(sl1),crc32]" |
| http-response set-header fe-sl2-crc "%[res.fhdr(sl2),crc32]" |
| http-response set-header fe-hdr-crc "%[res.fhdr(hdr),crc32]" |
| |
| default_backend be |
| |
| backend be |
| #### requests |
| http-request set-header fe-sl1 "%[req.fhdr(sl1)]" |
| http-request set-header fe-sl2 "%[req.fhdr(sl2)]" |
| http-request set-header fe-hdr "%[req.fhdr(hdr)]" |
| |
| http-request set-header fe-sl1-crc "%[req.fhdr(sl1-crc)]" |
| http-request set-header fe-sl2-crc "%[req.fhdr(sl2-crc)]" |
| http-request set-header fe-hdr-crc "%[req.fhdr(hdr-crc)]" |
| |
| http-request set-var(req.method) method |
| http-request set-var(req.uri) url |
| http-request set-var(req.path) path |
| http-request set-var(req.query) query |
| http-request set-var(req.param) url_param(qs_arg) |
| http-request set-var(req.cl) req.fhdr(content-length) |
| |
| http-request set-header sl1 "sl1: " |
| |
| http-request set-method "%[str(GET)]" |
| http-request set-uri %[str(),concat(/bu/,req.uri,/eu)] |
| http-request set-path "/bp/%[var(req.path)]/ep" |
| http-request set-query "bq&%[var(req.query)]&eq" |
| |
| http-request set-header sl2 "sl2: " |
| |
| http-request set-header sl1 "%[req.fhdr(sl1)] method=<%[var(req.method)]>; uri=<%[var(req.uri)]>; path=<%[var(req.path)]>;" |
| http-request set-header sl1 "%[req.fhdr(sl1)] query=<%[var(req.query)]>; param=<%[var(req.param)]>" |
| http-request set-header sl1 "%[req.fhdr(sl1)] cl=<%[var(req.cl)]>" |
| http-request set-header sl2 "%[req.fhdr(sl2)] method=<%[method]>; uri=<%[url]>; path=<%[path]>; " |
| http-request set-header sl2 "%[req.fhdr(sl2)] query=<%[query]>; param=<%[url_param(qs_arg)]>" |
| http-request set-header sl2 "%[req.fhdr(sl2)] cl=<%[req.fhdr(content-length)]>" |
| http-request set-header hdr "%[req.fhdr(hdr)] hdr1=<%[req.hdr(hdr1)]>; fhdr1=<%[req.fhdr(hdr1)]>;" |
| http-request set-header hdr "%[req.fhdr(hdr)] hdr2=<%[req.hdr(hdr2)]>; fhdr2=<%[req.fhdr(hdr2)]>;" |
| http-request set-header hdr "%[req.fhdr(hdr)] hdr3=<%[req.hdr(hdr3)]>; fhdr3=<%[req.fhdr(hdr3)]>;" |
| http-request set-header hdr "%[req.fhdr(hdr)] hdr4=<%[req.hdr(hdr4)]>; fhdr4=<%[req.fhdr(hdr4)]>;" |
| |
| http-request set-header be-sl1-crc "%[req.fhdr(sl1),crc32]" |
| http-request set-header be-sl2-crc "%[req.fhdr(sl2),crc32]" |
| http-request set-header be-hdr-crc "%[req.fhdr(hdr),crc32]" |
| |
| #### responses |
| http-response set-var(res.status) status |
| http-response set-header sl1 "sl1: " |
| |
| http-response set-status 200 |
| |
| http-response set-header sl2 "sl2: " |
| |
| http-response set-header sl1 "%[res.fhdr(sl1)] status=<%[var(res.status)]>;" |
| http-response set-header sl2 "%[res.fhdr(sl2)] status=<%[status]>;" |
| http-response set-header hdr "%[res.fhdr(hdr)] hdr1=<%[res.hdr(hdr1)]>; fhdr1=<%[res.fhdr(hdr1)]>;" |
| http-response set-header hdr "%[res.fhdr(hdr)] hdr2=<%[res.hdr(hdr2)]>; fhdr2=<%[res.fhdr(hdr2)]>;" |
| http-response set-header hdr "%[res.fhdr(hdr)] hdr3=<%[res.hdr(hdr3)]>; fhdr3=<%[res.fhdr(hdr3)]>;" |
| http-response set-header hdr "%[res.fhdr(hdr)] hdr4=<%[res.hdr(hdr4)]>; fhdr4=<%[res.fhdr(hdr4)]>;" |
| |
| http-response set-header sl1-crc "%[res.fhdr(sl1),crc32]" |
| http-response set-header sl2-crc "%[res.fhdr(sl2),crc32]" |
| http-response set-header hdr-crc "%[res.fhdr(hdr),crc32]" |
| http-response allow |
| http-response deny # must not be evaluated |
| |
| server s1 ${s1_addr}:${s1_port} |
| } -start |
| |
| client c1h1 -connect ${h1_feh1_sock} { |
| txreq \ |
| -req GET \ |
| -url /path/to/file.extension?qs_arg=qs_value \ |
| -hdr "content-length: 000, 00" \ |
| -hdr "hdr1: val1" \ |
| -hdr "hdr2: val2a" \ |
| -hdr "hdr2: val2b" \ |
| -hdr "hdr3: val3a, val3b" \ |
| -hdr "hdr4:" |
| rxresp |
| |
| expect resp.status == 200 |
| expect resp.http.be-sl1-crc == 487202719 |
| expect resp.http.be-sl2-crc == 561949791 |
| expect resp.http.be-hdr-crc == 1719311923 |
| expect resp.http.fe-sl1-crc == 146151597 |
| expect resp.http.fe-sl2-crc == 561949791 |
| expect resp.http.fe-hdr-crc == 3634102538 |
| expect resp.bodylen == 14 |
| expect resp.body == "This is a body" |
| } -run |
| |
| client c1h2 -connect ${h1_feh2_sock} { |
| txpri |
| stream 0 { |
| txsettings |
| rxsettings |
| txsettings -ack |
| rxsettings |
| expect settings.ack == true |
| } -run |
| stream 1 { |
| # warning: -req, -scheme, -url MUST be placed first otherwise |
| # the H2 protocol is invalid since they are pseudo-headers |
| txreq \ |
| -req GET \ |
| -scheme "https" \ |
| -url /path/to/file.extension?qs_arg=qs_value \ |
| -hdr "content-length" "000, 00" \ |
| -hdr "hdr1" "val1" \ |
| -hdr "hdr2" " val2a" \ |
| -hdr "hdr2" " val2b" \ |
| -hdr "hdr3" " val3a, val3b" \ |
| -hdr "hdr4" "" |
| |
| rxhdrs |
| expect resp.status == 200 |
| expect resp.http.be-sl1-crc == 487202719 |
| expect resp.http.be-sl2-crc == 561949791 |
| expect resp.http.be-hdr-crc == 1719311923 |
| expect resp.http.fe-sl1-crc == 146151597 |
| expect resp.http.fe-sl2-crc == 561949791 |
| expect resp.http.fe-hdr-crc == 3634102538 |
| expect resp.http.content-length == 14 |
| |
| rxdata -all |
| expect resp.body == "This is a body" |
| } -run |
| } -run |