varnishtest "HTTP request tests: H1 to H1 (HTX mode supported only for HAProxy >= 1.9)" # Run it with HAPROXY_PROGRAM=$PWD/haproxy varnishtest -l -k -t 1 "$1" feature ignore_unknown_macro server s1 { ## ## Handle GET requests ## rxreq expect req.bodylen == 0 expect req.body == "" txresp \ -status 200 \ -body "response 1" rxreq expect req.bodylen == 0 expect req.body == "" txresp \ -status 200 \ -body "response 2" rxreq expect req.bodylen == 38 expect req.body == "this must be delivered, like it or not" txresp \ -status 200 \ -body "response 3" rxreq expect req.bodylen == 0 expect req.body == "" txresp \ -status 200 \ -body "response 4" accept ## ## Handle HEAD requests ## rxreq expect req.bodylen == 0 expect req.body == "" txresp \ -status 200 \ -body "response 1" accept rxreq expect req.bodylen == 0 expect req.body == "" txresp \ -status 200 \ -body "response 2" accept rxreq expect req.bodylen == 38 expect req.body == "this must be delivered, like it or not" txresp \ -status 200 \ -body "response 3" accept rxreq expect req.bodylen == 0 expect req.body == "" txresp \ -status 200 \ -body "response 4" accept ## ## Handle POST requests ## # POST request without body rxreq expect req.bodylen == 0 expect req.body == "" txresp \ -status 200 \ -body "response 1" # POST request without body rxreq expect req.bodylen == 0 expect req.body == "" txresp \ -status 200 \ -body "response 2" # POST request with a body rxreq expect req.bodylen == 12 expect req.body == "this is sent" txresp \ -status 200 \ -body "response 3" # POST request without body rxreq expect req.bodylen == 0 expect req.body == "" txresp \ -status 200 \ -body "response 4" } -repeat 3 -start haproxy h1 -conf { global # WT: limit false-positives causing "HTTP header incomplete" due to # idle server connections being randomly used and randomly expiring # under us. tune.idle-pool.shared off defaults mode http timeout connect "${HAPROXY_TEST_TIMEOUT-5s}" timeout client "${HAPROXY_TEST_TIMEOUT-5s}" timeout server "${HAPROXY_TEST_TIMEOUT-5s}" listen feh1 bind "fd@${feh1}" #bind "fd@${feh2}" proto h2 server s1 ${s1_addr}:${s1_port} } -start # GET requests client c1h1 -connect ${h1_feh1_sock} { # first request is valid txreq \ -req "GET" \ -url "/test1.html" rxresp expect resp.status == 200 expect resp.body == "response 1" # second request is valid and advertises C-L:0 txreq \ -req "GET" \ -url "/test2.html" \ -hdr "content-length: 0" rxresp expect resp.status == 200 expect resp.body == "response 2" # third request sends a body with a GET txreq \ -req "GET" \ -url "/test3.html" \ -body "this must be delivered, like it or not" rxresp expect resp.status == 200 expect resp.body == "response 3" # fourth request is valid and advertises C-L:0, and close, and is # followed by a string "this is not sent\r\n\r\n" which must be # dropped. txreq \ -req "GET" \ -url "/test4.html" \ -hdr "content-length: 0" \ -hdr "connection: close" # "this is not sent" sendhex "74787973207973206E6F742073656E740D0A0D0A" rxresp expect resp.status == 200 expect resp.body == "response 4" # the connection is expected to be closed and no more response must # arrive here. expect_close } -run # HEAD requests # Note: for now they fail with varnishtest, which expects the amount of # data advertised in the content-length response. client c2h1 -connect ${h1_feh1_sock} { # first request is valid txreq \ -req "HEAD" \ -url "/test11.html" rxresp expect resp.status == 200 expect resp.body == "" # second request is valid and advertises C-L:0 txreq \ -req "HEAD" \ -url "/test12.html" \ -hdr "content-length: 0" rxresp expect resp.status == 200 expect resp.body == "" # third request sends a body with a HEAD txreq \ -req "HEAD" \ -url "/test13.html" \ -body "this must be delivered, like it or not" rxresp expect resp.status == 200 expect resp.body == "" # fourth request is valid and advertises C-L:0, and close, and is # followed by a string "this is not sent\r\n\r\n" which must be # dropped. txreq \ -req "HEAD" \ -url "/test14.html" \ -hdr "content-length: 0" \ -hdr "connection: close" # "this is not sent" sendhex "74787973207973206E6F742073656E740D0A0D0A" rxresp expect resp.status == 200 expect resp.body == "" # the connection is expected to be closed and no more response must # arrive here. expect_close } -run client c3h1 -connect ${h1_feh1_sock} { # first request is valid txreq \ -req "POST" \ -url "/test21.html" rxresp expect resp.status == 200 expect resp.body == "response 1" # second request is valid and advertises C-L:0 txreq \ -req "POST" \ -url "/test22.html" \ -hdr "content-length: 0" rxresp expect resp.status == 200 expect resp.body == "response 2" # third request is valid and advertises (and sends) some contents txreq \ -req "POST" \ -url "/test23.html" \ -body "this is sent" rxresp expect resp.status == 200 expect resp.body == "response 3" # fourth request is valid and advertises C-L:0, and close, and is # followed by a string "this is not sent\r\n\r\n" which must be # dropped. txreq \ -req "POST" \ -url "/test24.html" \ -hdr "content-length: 0" \ -hdr "connection: close" # "this is not sent" sendhex "74787973207973206E6F742073656E740D0A0D0A" rxresp expect resp.status == 200 expect resp.body == "response 4" # the connection is expected to be closed and no more response must # arrive here. expect_close } -run client c4h1 -connect ${h1_feh1_sock} { # this request is invalid and advertises an invalid C-L ending with an # empty value, which results in a stream error. txreq \ -req "GET" \ -url "/test31.html" \ -hdr "content-length: 0," \ -hdr "connection: close" rxresp expect resp.status == 400 expect_close } -run client c5h1 -connect ${h1_feh1_sock} { # this request is invalid and advertises an empty C-L, which results # in a stream error. txreq \ -req "GET" \ -url "/test41.html" \ -hdr "content-length:" \ -hdr "connection: close" rxresp expect resp.status == 400 expect_close } -run