summaryrefslogtreecommitdiffstats
path: root/reg-tests/connection/http_reuse_conn_hash.vtc
blob: 991e86f7a8e411599d9a222ae831fa362a02ff7a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
varnishtest "Test the http-reuse with special connection parameters"
#REQUIRE_VERSION=2.4
#REQUIRE_OPTIONS=OPENSSL

feature ignore_unknown_macro

haproxy h1 -conf {
	defaults
		mode http

	# sni
	listen sender-sni
		bind "fd@${feS_sni}"
		server srv2 ${h1_feR_ssl_addr}:${h1_feR_ssl_port} ssl sni "req.hdr(x-sni)" verify none pool-low-conn 2

	# set-dst
	# specify dst1_addr for server, which should be identical to dst2_addr
	# port is specified by the client in header x-dst-port
	listen sender-set-dst
		bind "fd@${feS_dst}"
		http-request set-dst-port hdr(x-dst-port)
		server srv2 ${h1_feR_dst1_addr}:0 pool-low-conn 2

	# proxy protocol
	# must use reuse always as consecutive requests are from different client
	listen sender-proxy
		bind "fd@${feS_proxy}" accept-proxy
		http-reuse always
		server srv2 ${h1_feR_proxy_addr}:${h1_feR_proxy_port} send-proxy pool-low-conn 2

	listen receiver
		bind "fd@${feR_ssl}" ssl crt ${testdir}/common.pem
		bind "fd@${feR_proxy}" accept-proxy
		http-request return status 200
		http-after-response set-header http_first_request %[http_first_req]

	listen receiver-dst1
		bind "fd@${feR_dst1}"
		http-request return status 200 hdr "x-dst" "dst1"
		http-after-response set-header http_first_request %[http_first_req]

	listen receiver-dst2
		bind "fd@${feR_dst2}"
		http-request return status 200 hdr "x-dst" "dst2"
		http-after-response set-header http_first_request %[http_first_req]
} -start

# http-reuse with sni parameters
client c_sni -connect ${h1_feS_sni_sock} {
	# first request
	txreq \
	  -hdr "x-sni: www.custom.com"
	rxresp
	expect resp.http.http_first_request == "1"

	# second request with same sni, connection must be reused
	txreq \
	  -hdr "x-sni: www.custom.com"
	rxresp
	expect resp.http.http_first_request == "0"

	# third request with a different sni, a new connection must be used
	txreq \
	  -hdr "x-sni: www.custom2.com"
	rxresp
	expect resp.http.http_first_request == "1"

	# fourth request, reuse sni2
	txreq \
	  -hdr "x-sni: www.custom2.com"
	rxresp
	expect resp.http.http_first_request == "0"
} -run

# http-reuse with destination address
client c_dst1 -connect ${h1_feS_dst_sock} {
	txreq \
	  -hdr "x-dst-port: ${h1_feR_dst1_port}"
	rxresp
	expect resp.status == 200
	expect resp.http.x-dst == "dst1"
	expect resp.http.http_first_request == "1"

	txreq \
	  -hdr "x-dst-port: ${h1_feR_dst1_port}"
	rxresp
	expect resp.status == 200
	expect resp.http.x-dst == "dst1"
	expect resp.http.http_first_request == "0"

	txreq \
	  -hdr "x-dst-port: ${h1_feR_dst2_port}"
	rxresp
	expect resp.status == 200
	expect resp.http.x-dst == "dst2"
	expect resp.http.http_first_request == "1"

	txreq \
	  -hdr "x-dst-port: ${h1_feR_dst1_port}"
	rxresp
	expect resp.status == 200
	expect resp.http.x-dst == "dst1"
	expect resp.http.http_first_request == "0"

	txreq \
	  -hdr "x-dst-port: ${h1_feR_dst2_port}"
	rxresp
	expect resp.status == 200
	expect resp.http.x-dst == "dst2"
	expect resp.http.http_first_request == "0"
} -run

## first request with proxy protocol
client c_proxy -connect ${h1_feS_proxy_sock} -proxy1 "127.0.0.1:40000 ${h1_feS_proxy_addr}:${h1_feS_proxy_port}" {
	txreq
	rxresp
	expect resp.status == 200
	expect resp.http.http_first_request == "1"

	txreq
	rxresp
	expect resp.status == 200
	expect resp.http.http_first_request == "0"
} -run

## second request with different proxy protocol
# this have the nice effect to fill the server pool to 2 connection
# (pool-low-conn value) to allow takeover on multi thread run
client c_proxy -connect ${h1_feS_proxy_sock} -proxy1 "127.0.0.1:50000 ${h1_feS_proxy_addr}:${h1_feS_proxy_port}" {
	txreq
	rxresp
	expect resp.status == 200
	expect resp.http.http_first_request == "1"
} -run

## third request, reuse same proxy protocol entry
client c_proxy -connect ${h1_feS_proxy_sock} -proxy1 "127.0.0.1:40000 ${h1_feS_proxy_addr}:${h1_feS_proxy_port}" {
	txreq
	rxresp
	expect resp.status == 200
	expect resp.http.http_first_request == "0"
} -run

## fourth request with different proxy protocol entry, no reuse
client c_proxy -connect ${h1_feS_proxy_sock} -proxy1 "127.0.0.1:60000 ${h1_feS_proxy_addr}:${h1_feS_proxy_port}" {
	txreq
	rxresp
	expect resp.status == 200
	expect resp.http.http_first_request == "1"
} -run

## fifth request, reuse proxy protocol
client c_proxy -connect ${h1_feS_proxy_sock} -proxy1 "127.0.0.1:50000 ${h1_feS_proxy_addr}:${h1_feS_proxy_port}" {
	txreq
	rxresp
	expect resp.status == 200
	expect resp.http.http_first_request == "0"

	txreq
	rxresp
	expect resp.status == 200
	expect resp.http.http_first_request == "0"
} -run