varnishtest "http-restrict-req-hdr-names option tests"
feature cmd "$HAPROXY_PROGRAM -cc 'version_atleast(2.0-dev0)'"

# This config tests "http-restrict-req-hdr-names" option

feature ignore_unknown_macro

server s1 {
    rxreq
    expect req.http.x-my_hdr  == on
    txresp
} -start

server s2 {
    rxreq
    expect req.http.x-my_hdr  == <undef>
    txresp
} -start

server s3 {
    rxreq
    expect req.http.x-my_hdr  == on
    txresp
} -start

server s4 {
    rxreq
    expect req.http.x-my_hdr  == <undef>
    txresp
} -start

server s5 {
    rxreq
    expect req.http.x-my_hdr  == on
    txresp
} -start

server s6 {
    rxreq
    expect req.http.x_my_hdr_with_lots_of_underscores  == <undef>
    txresp
} -start

server s7 {
    rxreq
    expect req.http.x_my_hdr-1  == <undef>
    expect req.http.x-my-hdr-2  == on
    txresp
} -start

server s8 {
    rxreq
    expect req.http.x-my_hdr-1  == <undef>
    expect req.http.x-my_hdr-2  == <undef>
    txresp
} -start

server s9 {
    rxreq
    expect req.http.x-my-hdr-with-trailing-underscore_  == <undef>
    txresp
} -start

haproxy h1 -conf {
    global
    .if feature(THREAD)
        thread-groups 1
    .endif

    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}"
        use_backend be-http1 if { path /req1 }
        use_backend be-http2 if { path /req2 }
        use_backend be-http3 if { path /req3 }
        use_backend be-fcgi1 if { path /req4 }
        use_backend be-fcgi2 if { path /req5 }
        use_backend be-fcgi3 if { path /req6 }
        use_backend be-http4 if { path /req7 }
        use_backend be-http5 if { path /req8 }
        use_backend be-http6 if { path /req9 }
        use_backend be-http7 if { path /req10 }

    backend be-http1
        server s1 ${s1_addr}:${s1_port}

    backend be-http2
        option http-restrict-req-hdr-names delete
        server s2 ${s2_addr}:${s2_port}

    backend be-http3
        option http-restrict-req-hdr-names reject

    backend be-fcgi1
        option http-restrict-req-hdr-names preserve
        server s3 ${s3_addr}:${s3_port}

    backend be-fcgi2
        option http-restrict-req-hdr-names delete
        server s4 ${s4_addr}:${s4_port}

    backend be-fcgi3
        option http-restrict-req-hdr-names reject

    backend be-http4
        option http-restrict-req-hdr-names delete
        server s6 ${s6_addr}:${s6_port}

    backend be-http5
        option http-restrict-req-hdr-names delete
        server s7 ${s7_addr}:${s7_port}

    backend be-http6
        option http-restrict-req-hdr-names delete
        server s8 ${s8_addr}:${s8_port}

    backend be-http7
        option http-restrict-req-hdr-names delete
        server s9 ${s9_addr}:${s9_port}

    defaults
        mode http
        timeout connect "${HAPROXY_TEST_TIMEOUT-5s}"
        timeout client  "${HAPROXY_TEST_TIMEOUT-5s}"
        timeout server  "${HAPROXY_TEST_TIMEOUT-5s}"
        option http-restrict-req-hdr-names preserve

    frontend fe2
        bind "fd@${fe2}"
        default_backend be-fcgi4

    backend be-fcgi4
        server s5 ${s5_addr}:${s5_port}

    fcgi-app my-fcgi-app
        docroot ${testdir}
} -start

client c1 -connect ${h1_fe1_sock} {
    txreq -req GET -url /req1 -hdr "X-my_hdr: on"
    rxresp
    expect resp.status == 200

    txreq -req GET -url /req2 -hdr "X-my_hdr: on"
    rxresp
    expect resp.status == 200

    txreq -req GET -url /req3 -hdr "X-my_hdr: on"
    rxresp
    expect resp.status == 403

    txreq -req GET -url /req4 -hdr "X-my_hdr: on"
    rxresp
    expect resp.status == 200

    txreq -req GET -url /req5 -hdr "X-my_hdr: on"
    rxresp
    expect resp.status == 200

    txreq -req GET -url /req6 -hdr "X-my_hdr: on"
    rxresp
    expect resp.status == 403

    txreq -req GET -url /req7 -hdr "X_my_hdr_with_lots_of_underscores: on"
    rxresp
    expect resp.status == 200

    txreq -req GET -url /req8 -hdr "X_my_hdr-1: on" -hdr "X-my-hdr-2: on"
    rxresp
    expect resp.status == 200

    txreq -req GET -url /req9 -hdr "X-my_hdr-1: on" -hdr "X-my_hdr-2: on"
    rxresp
    expect resp.status == 200

    txreq -req GET -url /req10 -hdr "X-my-hdr-with-trailing-underscore_: on"
    rxresp
    expect resp.status == 200
} -run

client c2 -connect ${h1_fe2_sock} {
    txreq -req GET -url /req1 -hdr "X-my_hdr: on"
    rxresp
    expect resp.status == 200
} -run
