-
Notifications
You must be signed in to change notification settings - Fork 20
/
chunked-transfers.t
122 lines (92 loc) · 3.33 KB
/
chunked-transfers.t
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
use v6;
use Test;
use LWP::Simple;
my $lwp = LWP::Simple.new;
ok($lwp, 'Object create');
#
# Test that not chunked pages are interpreted correctly
#
my $testcase-no-chunked =
q<HTTP/1.1 200 OK
Server: random/3.14
Content-type: text/plain
3c
This response shouldn't be interpreted as chunked,
since there is no "Transfer-Encoding: chunked" header
>;
my ($status, $headers, $content) = $lwp.parse_response($testcase-no-chunked);
is($status, q<HTTP/1.1 200 OK>, 'Status parsed correctly');
# Only way to dereference I have found
my %headers = $headers;
is(%headers<Server>, 'random/3.14', 'Server header parsed correctly');
is(%headers<Content-type>, 'text/plain', 'Content-type header parsed correctly');
ok(! %headers.exists('Transfer-Encoding'), 'Transfer-Encoding header not found');
my $content_str = $content.join('\n');
ok(
$content_str && $content_str.match('3c'),
'Content contains fake chunked transfer markers'
);
#
# Test that chunked pages are interpreted correctly
#
my $testcase-chunked =
q<HTTP/1.0 200 OK
Server: Apache/2.2.9
Transfer-Encoding: Chunked
Content-type: text/plain
0d
13 characters
0f
another 15 here
0
0
>;
($status, $headers, $content) = $lwp.parse_response($testcase-chunked);
is($status, q<HTTP/1.0 200 OK>, 'Status parsed correctly');
# Only way to dereference I have found
%headers = $headers;
is(%headers<Server>, 'Apache/2.2.9', 'Server header parsed correctly');
is(%headers<Content-type>, 'text/plain', 'Content-type header parsed correctly');
# rakudo: $str ~~ m:i// NIY
ok(%headers<Transfer-Encoding> ~~ m/:i chunked/, 'Transfer-Encoding found');
$content_str = $content.join('\n');
#diag('Content: ' ~ $content_str);
ok($content_str, 'Content actually contains something');
is($content_str.chars, 30, 'Content length (+CRLF) decoded correctly');
ok(! $content_str.match('0d'), 'No chunked transfer markers');
ok(! $content_str.match('0f'), 'No chunked transfer markers');
ok(! $content_str.match('0'), 'No remaining chunked transfer markers at the end');
ok($content_str.match('13 characters'), 'Actual content is there');
ok($content_str.match('another 15 here'), 'Actual content is there');
# Slightly different, with trailing garbage,
# like 'www.rakudo.org' is sending
$testcase-chunked =
q<HTTP/1.0 200 OK
Server: Apache/2.2.9
Transfer-Encoding: Chunked
Content-type: text/plain
0d
13 characters
0f
another 15 here
0
0
>;
($status, $headers, $content) = $lwp.parse_response($testcase-chunked);
is($status, q<HTTP/1.0 200 OK>, 'Status parsed correctly');
# Only way to dereference I have found
%headers = $headers;
is(%headers<Server>, 'Apache/2.2.9', 'Server header parsed correctly');
is(%headers<Content-type>, 'text/plain', 'Content-type header parsed correctly');
# rakudo: $str ~~ m:i// NIY
ok(%headers<Transfer-Encoding> ~~ m/:i chunked/, 'Transfer-Encoding found');
$content_str = $content.join('\n');
diag('Content (0 0): ' ~ $content_str);
ok($content_str, 'Content actually contains something');
is($content_str.chars, 30, 'Content length (+CRLF) decoded correctly');
ok(! $content_str.match('0d'), 'No chunked transfer markers');
ok(! $content_str.match('0f'), 'No chunked transfer markers');
ok(! $content_str.match('0'), 'No remaining chunked transfer markers at the end');
ok($content_str.match('13 characters'), 'Actual content is there');
ok($content_str.match('another 15 here'), 'Actual content is there');
done;