Statistics
| Revision:

root / branches / lighttpd-1.4.x / tests / core-request.t @ 1869

History | View | Annotate | Download (7.5 KB)

1
#!/usr/bin/env perl
2
BEGIN {
3
    # add current source dir to the include-path
4
    # we need this for make distcheck
5
   (my $srcdir = $0) =~ s#/[^/]+$#/#;
6
   unshift @INC, $srcdir;
7
}
8
9
use strict;
10
use IO::Socket;
11
use Test::More tests => 36;
12
use LightyTest;
13
14
my $tf = LightyTest->new();
15
my $t;
16
17
ok($tf->start_proc == 0, "Starting lighttpd") or die();
18
19
## Low-Level Request-Header Parsing - URI
20
21
$t->{REQUEST}  = ( <<EOF
22
GET /index%2ehtml HTTP/1.0
23
EOF
24
 );
25
$t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200 } ];
26
ok($tf->handle_http($t) == 0, 'URL-encoding');
27
28
$t->{REQUEST}  = ( <<EOF
29
GET /index.html%00 HTTP/1.0
30
EOF
31
 );
32
$t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 404 } ];
33
ok($tf->handle_http($t) == 0, 'URL-encoding, %00');
34
35
36
37
## Low-Level Request-Header Parsing - Host
38
39
$t->{REQUEST}  = ( <<EOF
40
GET / HTTP/1.0
41
Host: www.example.org
42
EOF
43
 );
44
$t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200 } ];
45
ok($tf->handle_http($t) == 0, 'hostname');
46
47
$t->{REQUEST}  = ( <<EOF
48
GET / HTTP/1.0
49
Host: 127.0.0.1
50
EOF
51
 );
52
$t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200 } ];
53
ok($tf->handle_http($t) == 0, 'IPv4 address');
54
55
$t->{REQUEST}  = ( <<EOF
56
GET / HTTP/1.0
57
Host: [::1]
58
EOF
59
 );
60
$t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200 } ];
61
ok($tf->handle_http($t) == 0, 'IPv6 address');
62
63
$t->{REQUEST}  = ( <<EOF
64
GET / HTTP/1.0
65
Host: www.example.org:80
66
EOF
67
 );
68
$t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200 } ];
69
ok($tf->handle_http($t) == 0, 'hostname + port');
70
71
$t->{REQUEST}  = ( <<EOF
72
GET / HTTP/1.0
73
Host: 127.0.0.1:80
74
EOF
75
 );
76
$t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200 } ];
77
ok($tf->handle_http($t) == 0, 'IPv4 address + port');
78
79
$t->{REQUEST}  = ( <<EOF
80
GET / HTTP/1.0
81
Host: [::1]:80
82
EOF
83
 );
84
$t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200 } ];
85
ok($tf->handle_http($t) == 0, 'IPv6 address + port');
86
87
$t->{REQUEST}  = ( <<EOF
88
GET / HTTP/1.0
89
Host: ../123.org
90
EOF
91
 );
92
$t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 400 } ];
93
ok($tf->handle_http($t) == 0, 'directory traversal');
94
95
$t->{REQUEST}  = ( <<EOF
96
GET / HTTP/1.0
97
Host: .jsdh.sfdg.sdfg.
98
EOF
99
 );
100
$t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 400 } ];
101
ok($tf->handle_http($t) == 0, 'leading and trailing dot');
102
103
$t->{REQUEST}  = ( <<EOF
104
GET / HTTP/1.0
105
Host: jsdh.sfdg.sdfg.
106
EOF
107
 );
108
$t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200 } ];
109
ok($tf->handle_http($t) == 0, 'trailing dot is ok');
110
111
$t->{REQUEST}  = ( <<EOF
112
GET / HTTP/1.0
113
Host: .jsdh.sfdg.sdfg
114
EOF
115
 );
116
$t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 400 } ];
117
ok($tf->handle_http($t) == 0, 'leading dot');
118
119
120
$t->{REQUEST}  = ( <<EOF
121
GET / HTTP/1.0
122
Host: jsdh..sfdg.sdfg
123
EOF
124
 );
125
$t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 400 } ];
126
ok($tf->handle_http($t) == 0, 'two dots');
127
128
$t->{REQUEST}  = ( <<EOF
129
GET / HTTP/1.0
130
Host: jsdh.sfdg.sdfg:asd
131
EOF
132
 );
133
$t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 400 } ];
134
ok($tf->handle_http($t) == 0, 'broken port-number');
135
136
$t->{REQUEST}  = ( <<EOF
137
GET / HTTP/1.0
138
Host: jsdh.sfdg.sdfg:-1
139
EOF
140
 );
141
$t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 400 } ];
142
ok($tf->handle_http($t) == 0, 'negative port-number');
143
144
145
$t->{REQUEST}  = ( <<EOF
146
GET / HTTP/1.0
147
Host: :80
148
EOF
149
 );
150
$t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 400 } ];
151
ok($tf->handle_http($t) == 0, 'port given but host missing');
152
153
$t->{REQUEST}  = ( <<EOF
154
GET / HTTP/1.0
155
Host: .jsdh.sfdg.:sdfg.
156
EOF
157
 );
158
$t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 400 } ];
159
ok($tf->handle_http($t) == 0, 'port and host are broken');
160
161
$t->{REQUEST}  = ( <<EOF
162
GET / HTTP/1.0
163
Host: a.b-c.d123
164
EOF
165
 );
166
$t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200 } ];
167
ok($tf->handle_http($t) == 0, 'allowed characters in host-name');
168
169
$t->{REQUEST}  = ( <<EOF
170
GET / HTTP/1.0
171
Host: -a.c
172
EOF
173
 );
174
$t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 400 } ];
175
ok($tf->handle_http($t) == 0, 'leading dash');
176
177
$t->{REQUEST}  = ( <<EOF
178
GET / HTTP/1.0
179
Host: .
180
EOF
181
 );
182
$t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 400 } ];
183
ok($tf->handle_http($t) == 0, 'dot only');
184
185
$t->{REQUEST}  = ( <<EOF
186
GET / HTTP/1.0
187
Host: a192.168.2.10:1234
188
EOF
189
 );
190
$t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 400 } ];
191
ok($tf->handle_http($t) == 0, 'broken IPv4 address - non-digit');
192
193
$t->{REQUEST}  = ( <<EOF
194
GET / HTTP/1.0
195
Host: 192.168.2:1234
196
EOF
197
 );
198
$t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 400 } ];
199
ok($tf->handle_http($t) == 0, 'broken IPv4 address - too short');
200
201
202
203
## Low-Level Request-Header Parsing - Content-Length
204
205
206
$t->{REQUEST}  = ( <<EOF
207
GET /index.html HTTP/1.0
208
Content-Length: -2
209
EOF
210
 );
211
$t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 400 } ];
212
ok($tf->handle_http($t) == 0, 'negative Content-Length');
213
214
$t->{REQUEST}  = ( <<EOF
215
POST /12345.txt HTTP/1.0
216
Host: 123.example.org
217
Content-Length: 2147483648
218
EOF
219
 );
220
$t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 413 } ];
221
ok($tf->handle_http($t) == 0, 'Content-Length > max-request-size');
222
223
$t->{REQUEST}  = ( <<EOF
224
POST /12345.txt HTTP/1.0
225
Host: 123.example.org
226
Content-Length:
227
EOF
228
 );
229
$t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 411 } ];
230
ok($tf->handle_http($t) == 0, 'Content-Length is empty');
231
232
print "\nLow-Level Request-Header Parsing - HTTP/1.1\n";
233
$t->{REQUEST}  = ( <<EOF
234
GET / HTTP/1.1
235
EOF
236
 );
237
$t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.1', 'HTTP-Status' => 400 } ];
238
ok($tf->handle_http($t) == 0, 'Host missing');
239
240
print "\nContent-Type\n";
241
$t->{REQUEST}  = ( <<EOF
242
GET /image.jpg HTTP/1.0
243
EOF
244
 );
245
$t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200, 'Content-Type' => 'image/jpeg' } ];
246
ok($tf->handle_http($t) == 0, 'Content-Type - image/jpeg');
247
248
$t->{REQUEST}  = ( <<EOF
249
GET /image.JPG HTTP/1.0
250
EOF
251
 );
252
$t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200, 'Content-Type' => 'image/jpeg' } ];
253
ok($tf->handle_http($t) == 0, 'Content-Type - image/jpeg (upper case)');
254
255
$t->{REQUEST}  = ( <<EOF
256
GET /a HTTP/1.0
257
EOF
258
 );
259
$t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200, 'Content-Type' => 'application/octet-stream' } ];
260
ok($tf->handle_http($t) == 0, 'Content-Type - unknown');
261
262
$t->{REQUEST}  = ( <<EOF
263
GET  HTTP/1.0
264
EOF
265
 );
266
$t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 400 } ];
267
ok($tf->handle_http($t) == 0, 'empty request-URI');
268
269
$t->{REQUEST}  = ( <<EOF
270
GET /Foo.txt HTTP/1.0
271
EOF
272
 );
273
$t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200 } ];
274
ok($tf->handle_http($t) == 0, 'uppercase filenames');
275
276
$t->{REQUEST}  = ( <<EOF
277
GET / HTTP/1.0
278
Location: foo
279
Location: foobar
280
  baz
281
EOF
282
 );
283
$t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200 } ];
284
ok($tf->handle_http($t) == 0, '#1209 - duplicate headers with line-wrapping');
285
286
$t->{REQUEST}  = ( <<EOF
287
GET / HTTP/1.0
288
Location: 
289
Location: foobar
290
  baz
291
EOF
292
 );
293
$t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200 } ];
294
ok($tf->handle_http($t) == 0, '#1209 - duplicate headers with line-wrapping - test 2');
295
296
$t->{REQUEST}  = ( <<EOF
297
GET / HTTP/1.0
298
A: 
299
Location: foobar
300
  baz
301
EOF
302
 );
303
$t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200 } ];
304
ok($tf->handle_http($t) == 0, '#1209 - duplicate headers with line-wrapping - test 3');
305
306
307
308
309
ok($tf->stop_proc == 0, "Stopping lighttpd");
310