summaryrefslogtreecommitdiffstats
path: root/reg-tests/http-messaging/http_request_buffer.vtc
blob: 302db4ab4e01091104bd5f2c6db5d1463ed7fc97 (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
varnishtest "A test for http-request-buffer option"
feature ignore_unknown_macro


# This test checks HTTP request buffering feature.
# We run one server s1 which can serve only one client (no -repeat argument here).
# c1 client uses a malformed request which is not transferred to s1 server
# thanks to "http-buffer-request". If this was the case, c2 client
# could not connect to s1 server and this would lead to make this test fail.

barrier b1 cond 2 -cyclic

server s1 {
	rxreq
	expect req.bodylen == 257
	txresp

	accept

	rxreq
	expect req.bodylen == 2
	txresp
} -start

syslog S -level info {
	recv
	expect ~ "[^:\\[ ]*\\[[0-9]*\\]: .* .* fe1 fe1/<NOSRV> .* 408 .* - - cR-- .* .* \"GET /this-is-a-long-url-this-is-a-long-url-this-is-a-long-url-this-is-a-long-url-this-is-a-long-url-this-is-a-long-url-this-is-a-long-url HTTP/1\\.1\""
	barrier b1 sync

	recv
	expect ~ "[^:\\[ ]*\\[[0-9]*\\]: .* .* fe1 be1/srv1 [0-9]*/[0-9]*/[0-9]*/[0-9]*/[0-9]* 200 .* - - ---- .* .* \"GET / HTTP/1\\.1\""
	barrier b1 sync

	recv
	expect ~ "[^:\\[ ]*\\[[0-9]*\\]: .* .* fe2 be1/srv1 [0-9]*/[0-9]*/[0-9]*/[0-9]*/[0-9]* 200 .* - - ---- .* .* \"POST /1 HTTP/1\\.1\""
	barrier b1 sync

	recv
	expect ~ "[^:\\[ ]*\\[[0-9]*\\]: .* .* fe2 be1/<NOSRV> [0-9]*/-1/-1/-1/[0-9]* 400 .* - - CR-- .* .* \"POST /2 HTTP/1\\.1\""
} -start

haproxy h1 -conf {
	defaults
		mode http
		timeout client  100
		timeout server  "${HAPROXY_TEST_TIMEOUT-5s}"
		timeout connect "${HAPROXY_TEST_TIMEOUT-5s}"

	backend be1
		server srv1 ${s1_addr}:${s1_port}

	frontend fe1
		option httplog
		option http-buffer-request
		log ${S_addr}:${S_port} local0 debug err
		bind "fd@${fe1}"
		use_backend be1

	frontend fe2
	        timeout client 10s
		option httplog
		option http-buffer-request
		log ${S_addr}:${S_port} local0 debug err
		bind "fd@${fe2}"
		use_backend be1
} -start

# 1 byte of the payload is missing.
#   ==> The request must timed out with a 408 response
client c1 -connect ${h1_fe1_sock} {
	send "GET"
	send " "
	send "/this-is-a-long-url"
	send "-this-is-a-long-url"
	send "-this-is-a-long-url"
	send "-this-is-a-long-url"
	send "-this-is-a-long-url"
	send "-this-is-a-long-url"
	send "-this-is-a-long-url"
	send " HTT"
	send "P/1.1"
	send "\r"
	send "\n"
	send "Content-Length: 209\r\n\r\n"
	send "abcdefghijklmnopqrstuvwxyz"
	send "abcdefghijklmnopqrstuvwxyz"
	send "abcdefghijklmnopqrstuvwxyz"
	send "abcdefghijklmnopqrstuvwxyz"
	send "abcdefghijklmnopqrstuvwxyz"
	send "abcdefghijklmnopqrstuvwxyz"
	send "abcdefghijklmnopqrstuvwxyz"
	send "abcdefghijklmnopqrstuvwxyz"
	rxresp
	expect resp.status == 408
} -run

# Wait matching on log message
barrier b1 sync

# Payload is fully sent
#   ==> Request must be sent to the server. A 200 must be received
client c2 -connect ${h1_fe1_sock} {
	txreq -bodylen 257
	rxresp
	expect resp.status == 200
} -run

# Wait matching on log message
barrier b1 sync

# Payload is fully sent in 2 steps (with a small delay, smaller than the client
# timeout) and split on a chunk size.
#   ==> Request must be sent to the server. A 200 must be received
client c3 -connect ${h1_fe2_sock} {
	send "POST /1  HTTP/1.1\r\nTransfer-Encoding: chunked\r\n\r\n1\r\n1\r\n1"
	delay 0.01
	send "\r\n1\r\n0\r\n\r\n"
	rxresp
	expect resp.status == 200
} -run

# Wait matching on log message
barrier b1 sync

# Last CRLF of the request payload is missing but payload is sent in 2 steps
# (with a small delay, smaller than the client timeout) and split on a chunk
# size. The client aborts before sending the last CRLF.
#   ==> Request must be handled as an error with 'CR--' termination state.
client c4 -connect ${h1_fe2_sock} {
	send "POST /2  HTTP/1.1\r\nTransfer-Encoding: chunked\r\n\r\n1\r\n1\r\n1"
	delay 0.01
	send "\r\n1\r\n0\r\n"
} -run

syslog S -wait